当前位置: 首页 > 工具软件 > ExcelUtil > 使用案例 >

poi升级 ExcelUtil部分更新以及新问题产生小记

欧阳安阳
2023-12-01

一、版本升级触发条件

引入hutool新工具包,pom依赖与原系统旧版本冲突,导致报错

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.6.4</version>
        </dependency>

二、由于poi版本升级引起的其他错误,需更新部分设置适配新版本

1、poi版本对比

旧版本:


        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.13</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.13</version>
        </dependency>

新版本:

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.2</version>
        </dependency>

2、Cell类型对比

旧版本:

switch (cell.getCellType()) {
            case Cell.CELL_TYPE_STRING:
                value = cell.getRichStringCellValue().getString().trim();
                break;
            case Cell.CELL_TYPE_NUMERIC:
                if (HSSFDateUtil.isCellDateFormatted(cell)){
                    //用于转化为日期格式
                    Date d = cell.getDateCellValue();
                    value = formater.format(d);
                }else if ("General".equals(cell.getCellStyle().getDataFormatString())) {
                    value = df.format(cell.getNumericCellValue());
                } else if ("m/d/yy".equals(cell.getCellStyle().getDataFormatString())) {
                    value = sdf.format(cell.getDateCellValue());
                } else {
                    value = df2.format(cell.getNumericCellValue());
                }
                break;
            case Cell.CELL_TYPE_BOOLEAN:
                value = cell.getBooleanCellValue();
                break;
            case Cell.CELL_TYPE_BLANK:
                value = "";
                break;
            default:
                break;
        }

新版本:

 switch (cell.getCellType()) {
//            case CellType.CELL_TYPE_STRING:
            case STRING:
                value = cell.getRichStringCellValue().getString().trim();
                break;
//            case Cell.CELL_TYPE_NUMERIC:
            case NUMERIC:
//                if (HSSFDateUtil.isCellDateFormatted(cell)){
                if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)){
                    //用于转化为日期格式
                    Date d = cell.getDateCellValue();
                    value = formater.format(d);
                }else if ("General".equals(cell.getCellStyle().getDataFormatString())) {
                    value = df.format(cell.getNumericCellValue());
                } else if ("m/d/yy".equals(cell.getCellStyle().getDataFormatString())) {
                    value = sdf.format(cell.getDateCellValue());
                } else {
                    value = df2.format(cell.getNumericCellValue());
                }
                break;
            case BOOLEAN:
                value = cell.getBooleanCellValue();
                break;
            case BLANK:
                value = "";
                break;
            default:
                break;
        } //switch

3、设置表头样式

旧版本:

 // 设置表头字体样式
        HSSFFont columnHeadFont = workbook.createFont();
        columnHeadFont.setFontName("宋体");
        columnHeadFont.setFontHeightInPoints((short) 10);
        columnHeadFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

        // 列头的样式
        HSSFCellStyle columnHeadStyle = workbook.createCellStyle();
        columnHeadStyle.setFont(columnHeadFont);
        // 左右居中
        columnHeadStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        // 上下居中
        columnHeadStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        columnHeadStyle.setLocked(true);
        columnHeadStyle.setWrapText(true);
        // 左边框的颜色
        columnHeadStyle.setLeftBorderColor(HSSFColor.BLACK.index);
        // 边框的大小
        columnHeadStyle.setBorderLeft((short) 1);
        // 右边框的颜色
        columnHeadStyle.setRightBorderColor(HSSFColor.BLACK.index);
        // 边框的大小
        columnHeadStyle.setBorderRight((short) 1);
        // 设置单元格的边框为粗体
        columnHeadStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        // 设置单元格的边框颜色
        columnHeadStyle.setBottomBorderColor(HSSFColor.BLACK.index);
        // 设置单元格的背景颜色(单元格的样式会覆盖列或行的样式)
        columnHeadStyle.setFillForegroundColor(HSSFColor.WHITE.index);
        // 设置普通单元格字体样式
        HSSFFont font = workbook.createFont();
        font.setFontName("宋体");
        font.setFontHeightInPoints((short) 10);

新版本:

// 设置表头字体样式
        HSSFFont columnHeadFont = workbook.createFont();
        columnHeadFont.setFontName("宋体");
        columnHeadFont.setFontHeightInPoints((short) 10);
        columnHeadFont.setBold(true);
//        columnHeadFont.setBoldweight();

        // 列头的样式
        HSSFCellStyle columnHeadStyle = workbook.createCellStyle();
        columnHeadStyle.setFont(columnHeadFont);
        // 左右居中
        columnHeadStyle.setAlignment(HorizontalAlignment.CENTER);
        // 上下居中
        columnHeadStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        columnHeadStyle.setLocked(true);
        columnHeadStyle.setWrapText(true);
        // 左边框的颜色
        columnHeadStyle.setLeftBorderColor(IndexedColors.BLACK.index);
        // 边框的大小
        columnHeadStyle.setBorderLeft(BorderStyle.THIN);
//        columnHeadStyle.setBorderLeft((short) 1);
        // 右边框的颜色
        columnHeadStyle.setRightBorderColor(IndexedColors.BLACK.index);
        // 边框的大小
        columnHeadStyle.setBorderRight(BorderStyle.THIN);
        // 设置单元格的边框为粗体
        columnHeadStyle.setBorderBottom(BorderStyle.THIN);
//        columnHeadStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        // 设置单元格的边框颜色
        columnHeadStyle.setBottomBorderColor(IndexedColors.BLACK.index);
        // 设置单元格的背景颜色(单元格的样式会覆盖列或行的样式)
        columnHeadStyle.setFillForegroundColor(IndexedColors.WHITE.index);

三、一些错误的汇总记录,供后参考

说明:以下错误已尝试多种解决方案,暂时没有耐心继续解决,搁置(惭愧)

org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: org.apache.logging.log4j.Logger.atTrace()Lorg/apache/logging/log4j/LogBuilder;
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1006)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:881)
Caused by: java.lang.NoSuchMethodError: org.apache.logging.log4j.Logger.atTrace()Lorg/apache/logging/log4j/LogBuilder;

四、小结

仅针对此次更正小感:

开发过程中由于可能涉及到二次开发,原系统开发时间久远,开发人员没有达成一致规范设计,导致原开发内容风格各异,满足当时的开发场景,并由于原系统功能比较冗杂,pom依赖互相关联,因此部分依赖的版本升级或者增加会导致依赖冲突情况,以上,为poi版本升级需同步更正的地方;

更正结果:

poi版本升级之后随之改变的ExcelUtil中格式等内容的调用通过搜索基本完成problems更正;但是系统启动引发新的bug;

经检查有其他pom依赖的jar冲突问题,一环套一环,预计耗费过多时间解决此类依赖冲突问题,故已放弃除以上更正之外的其他修复,决定用老版本poi依赖;

期望:

个人开发中可以考虑在pom文件中用DepencyManagement 管理各依赖版本,防止各种冲突的反复定位和修复,耗费过多时间和精力;

对于Maven知识的掌握和了解还是有所欠缺,需系统学习了解

 类似资料: