poi解析复杂excel,保存到数据库,

图片说明如何解析这样的excel,excle表头中有数据库表名 和 中文信息
然后有字段的信息,空行分开(可能多个)
再同样的格式,再有一个。 如此循环

表名  bbpa01  银票种类信息表
字段名称  中文说明  字段属性 字段长度  空值标志  备注
sname      银票类别  char        4               N.N          1-XX;2-DD
sname      银票类别  char        4               N.N          1-XX;2-DD
sname      银票类别  char        4               N.N          1-XX;2-DD
sname      银票类别  char        4               N.N          1-XX;2-DD
sname      银票类别  char        4               N.N          1-XX;2-DD

表名  bbpa01  银票种类信息表
字段名称  中文说明  字段属性 字段长度  空值标志  备注
sname      银票类别  char        4               N.N          1-XX;2-DD
sname      银票类别  char        4               N.N          1-XX;2-DD
sname      银票类别  char        4               N.N          1-XX;2-DD
sname      银票类别  char        4               N.N          1-XX;2-DD
sname      银票类别  char        4               N.N          1-XX;2-DD

这种很简单啊 的。通过这个对象HSSFWorkbook来操作excel表格,它里面有好多的对象可以读取操作读写excel表格, HSSFRow行对象、 HSSFCell 单元格对象等等。无非就是把数据从excel读出来,放在集合中,在存到数据库。部分代码L如下:
**
* 读取 office 2003 excel
*

* @throws IOException
* @throws FileNotFoundException
*/

private static List> read2003Excel(File file) throws IOException {

List> list = new LinkedList>();

HSSFWorkbook hwb = new HSSFWorkbook(new FileInputStream(file));

HSSFSheet sheet = hwb.getSheetAt(0);

Object value = null;

HSSFRow row = null;

HSSFCell cell = null;

int counter = 0;

for (int i = sheet.getFirstRowNum(); counter < sheet.getPhysicalNumberOfRows(); i++) {

row = sheet.getRow(i);

if (row == null) {

continue;

} else {

counter++;

}

List linked = new LinkedList();

for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {

cell = row.getCell(j);

if (cell == null) {

continue;

}

DecimalFormat df = new DecimalFormat("0");// 格式化 number String

// 字符

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化日期字符串

DecimalFormat nf = new DecimalFormat("0.00");// 格式化数字

switch (cell.getCellType()) {

case XSSFCell.CELL_TYPE_STRING:

value = cell.getStringCellValue();

break;

case XSSFCell.CELL_TYPE_NUMERIC:

if ("@".equals(cell.getCellStyle().getDataFormatString())) {

value = df.format(cell.getNumericCellValue());

} else if ("General".equals(cell.getCellStyle().getDataFormatString())) {

value = nf.format(cell.getNumericCellValue());

} else {

value = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));

}

break;

case XSSFCell.CELL_TYPE_BOOLEAN:

value = cell.getBooleanCellValue();

break;

case XSSFCell.CELL_TYPE_BLANK:

value = "";

break;

default:

value = cell.toString();

}

if (value == null || "".equals(value)) {

continue;

}

linked.add(value);

}

list.add(linked);

}

return list;

}

/** 
 * 读取Office 2007 excel 
 */  
private static List<List<Object>> read2007Excel(File file) throws IOException {  
    List<List<Object>> list = new LinkedList<List<Object>>();  
    // 构造 XSSFWorkbook 对象,strPath 传入文件路径  
    XSSFWorkbook xwb = new XSSFWorkbook(new FileInputStream(file));  
    // 读取第一章表格内容  
    XSSFSheet sheet = xwb.getSheetAt(0);  
    Object value = null;  
    XSSFRow row = null;  
    XSSFCell cell = null;  
    int counter = 0;  
    for (int i = sheet.getFirstRowNum(); counter < sheet.getPhysicalNumberOfRows(); i++) {  
        row = sheet.getRow(i);  
        if (row == null) {  
            continue;  
        } else {  
            counter++;  
        }  
        List<Object> linked = new LinkedList<Object>();  
        for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {  
            cell = row.getCell(j);  
            if (cell == null) {  
                continue;  
            }  
            DecimalFormat df = new DecimalFormat("0");// 格式化 number String  
                                                        // 字符  
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化日期字符串  
            DecimalFormat nf = new DecimalFormat("0.00");// 格式化数字  
            switch (cell.getCellType()) {  
            case XSSFCell.CELL_TYPE_STRING:  
                value = cell.getStringCellValue();  
                break;  
            case XSSFCell.CELL_TYPE_NUMERIC:  
                if ("@".equals(cell.getCellStyle().getDataFormatString())) {  
                    value = df.format(cell.getNumericCellValue());  
                } else if ("General".equals(cell.getCellStyle().getDataFormatString())) {  
                    value = nf.format(cell.getNumericCellValue());  
                } else {  
                    value = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));  
                }  
                break;  
            case XSSFCell.CELL_TYPE_BOOLEAN:  
                value = cell.getBooleanCellValue();  
                break;  
            case XSSFCell.CELL_TYPE_BLANK:  
                value = "";  
                break;  
            default:  
                value = cell.toString();  
            }  
            if (value == null || "".equals(value)) {  
                continue;  
            }  
            linked.add(value);  
        }  
        list.add(linked);  
    }  
    return list;  
}  

你是要将excel信息插入数据看吧,你写读取代码的时候直接读取从第三行开始读取,代码中应该是[2] 。然后就是循环和读取列值了,再插入数据库。

你的数据量是变动的吗?,若是变动的你可以做一个页面,传入行和列;若固定就是这么多数据, XSSFWorkbook xssfWorkbook = new XSSFWorkbook(xxxxx); xssfSheet.getLastRowNum(); 获取所有行;循环获取每一行数据,XSSFRow xssfRow = xssfSheet.getRow(rowNum); 获取某一行有几列,行从0行开始,然后XSSFCell name = xssfRow.getCell(0),XSSFCell desc = xssfRow.getCell(1),XSSFCell prop = xssfRow.getCell(2),XSSFCell len = xssfRow.getCell(3),XSSFCell flasg = xssfRow.getCell(4),XSSFCell mark = xssfRow.getCell(5),定义一个类,接受;然后用list将循环的结果放进去,接下来,批量插入数据,maybatis的foreach标签