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;
}
posted @ 2022-04-16 16:08  云轻YK  阅读(231)  评论(0)    收藏  举报