POI Excel解析
对于excel的每一个sheet,维护一个Map<sheet名,List
可以将每个sheet分为不同的区域,每个区域即 TemplateDto ,包含该区域的业务名称,数据类型(字符串,表单,表格),FieldTemplate(包含字段,字段类型等信息) ,相对开始解析行号,相对开始解析列号
POI提供了HSSF、XSSF以及SXSSF三种方式操作Excel。
HSSF:Excel97-2003版本,扩展名为.xls。一个sheet最大行数65536,最大列数256。
XSSF:Excel2007版本开始,扩展名为.xlsx。一个sheet最大行数1048576,最大列数16384。
SXSSF:是在XSSF基础上,POI3.8版本开始提供的支持低内存占用的操作方式,扩展名为.xlsx。
程序中行号和实际行号不一样,程序中行号从0开始
在解析时,可考虑每一行都解析一次,通过把控解析函数的入参,决定每一行是否解析,或者应该如何解析。
MultipartFile file;
InputStream in = file.getInputStream();
Workbook wb = new XSSFWorkbook(in); //从输入流获取Excel文件
Sheet sheet = wb.getSheetAt(0); //获取第1个sheet
int firstRowNum = sheet.getFirstRowNum(); //获取第一行行号
int lastRowNum = sheet.getLastRowNum(); //获取最后一行行号
Row row = sheet.getRow(i); //获取第i行
Cell cell = row.getCell(j); //获取第i行第j列的单元格
cell.getCellTypeEnum(); //获取单元格类型
short format = cell.getCellStyle().getDataFormat(); //日期格式编号
String format = cell.getCellStyle().getDataFormatString(); //日期格式String
wb.createSheet(title); //创建sheet并命名
sheet.createRow(i); //创建第i行
row.createCell(j); //创建第i行第j列的单元格
RichTextString richTextString = new XSSFRichTextString(str); //创建富文本
cell.setCellValue(richTextString); //写入富文本
wb.close();
//字符串型
STRING(1);
String cellValue = cell.getStringCellValue();
//数值型
NUMERIC(0);
double cellValue = cell.getNumericCellValue(); //获取单元格数值
Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value); //转换为java日期格式
//公式型
FORMULA(2);
//空值
BLANK(3);
//布尔型
BOOLEAN(4);
//错误
ERROR(5);
/**
* 判断是否合并单元格
*
* @param sheet 页面
* @param row 当前行
* @param column 当前列
* @return 是否是合并单元格
*/
private static boolean isMergedCell(Sheet sheet, int row, int column) {
int sheetMergedCount = sheet.getNumMergedRegions(); //获取单元格合并区域数量
for (int i = 0; i < sheetMergeCount; i++) {
CellRangeAddress range = sheet.getMergedRegion(i); //获取第i个合并单元格区域
int firstColumn = range.getFirstColumn();
int lastColumn = range.getLastColumn();
int firstRow = range.getFirstRow();
int lastRow = range.getLastRow();
if (row >= firstRow && row <= lastRow) {
if (column >= firstColumn && column <= lastColumn) {
return true;
}
}
}
return false;
}