java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.Cell.getCellType()报错修复

出现问题:

使用jxls工具的transformXLS方法报错

System.out.println("---------------准备导出-------------------");
XLSTransformer former = new XLSTransformer();
InputStream is = this.getClass().getClassLoader().getResourceAsStream(STUDENT_HEALTH_TEMPLATE_FILE_NAME);
HSSFWorkbook workBook = (HSSFWorkbook) former.transformXLS(is, branchMeg.getColumns());

报错日志如下

Caused by: java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.Cell.getCellType()I
	at net.sf.jxls.parser.CellParser.parseCellFormula(CellParser.java:68) ~[jxls-core-1.0.6.jar!/:?]
	at net.sf.jxls.util.SheetHelper.findFormulasInRow(SheetHelper.java:69) ~[jxls-core-1.0.6.jar!/:?]
	at net.sf.jxls.util.SheetHelper.findFormulas(SheetHelper.java:29) ~[jxls-core-1.0.6.jar!/:?]
	at net.sf.jxls.util.SheetHelper.findFormulas(SheetHelper.java:21) ~[jxls-core-1.0.6.jar!/:?]

问题背景

使用jxls工具类用来模板导出excel文件

原因分析:

随着需求不断升级,项目中也使用了poi并且poi的版本升到了4.1.2,但是jxls的版本没有升级,也主要是因为jxls-core的版本维护停在了1.0.6,追踪jxls的源码不难发现,使用了poi的Cell的CELL_TYPE_STRING属性,而我这个版本的poi已经去掉了这个属性,导致找不到而报错
在这里插入图片描述

解决方案

重写jxls这个类 :net.sf.jxls.parser.CellParser.parseCellFormula
将org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING改成org.apache.poi.ss.usermodel.CellType.STRING即可,如图
在这里插入图片描述
另外还有一些方法需要重写
net.sf.jxls.util 包下的Util类
这里摘取某一部分
moveCell方法

    private static void moveCell(org.apache.poi.ss.usermodel.Cell srcCell, org.apache.poi.ss.usermodel.Cell destCell) {
        destCell.setCellStyle(srcCell.getCellStyle());
        switch (srcCell.getCellType()) {
            case STRING:
                destCell.setCellValue(srcCell.getRichStringCellValue());
                break;
            case NUMERIC:
                destCell.setCellValue(srcCell.getNumericCellValue());
                break;
            case BLANK:
                destCell.setCellType(BLANK);
                break;
            case BOOLEAN:
                destCell.setCellValue(srcCell.getBooleanCellValue());
                break;
            case ERROR:
                destCell.setCellErrorValue(srcCell.getErrorCellValue());
                break;
            case FORMULA:
                break;
            default:
                break;
        }
        srcCell.setCellType(BLANK);
    }

copyCell方法

    public static void copyCell(org.apache.poi.ss.usermodel.Cell oldCell, org.apache.poi.ss.usermodel.Cell newCell,
                                boolean copyStyle) {
        if (copyStyle) {
            newCell.setCellStyle(oldCell.getCellStyle());
            copyConditionalFormat(oldCell, newCell);
        }
        switch (oldCell.getCellType()) {
            case STRING:
                newCell.setCellValue(oldCell.getRichStringCellValue());
                break;
            case NUMERIC:
                newCell.setCellValue(oldCell.getNumericCellValue());
                break;
            case BLANK:
                newCell.setCellType(BLANK);
                break;
            case BOOLEAN:
                newCell.setCellValue(oldCell.getBooleanCellValue());
                break;
            case ERROR:
                newCell.setCellErrorValue(oldCell.getErrorCellValue());
                break;
            case FORMULA:
                newCell.setCellFormula(oldCell.getCellFormula());
                break;
            default:
                break;
        }
    }

copyCell方法

    public static void copyCell(org.apache.poi.ss.usermodel.Cell oldCell, org.apache.poi.ss.usermodel.Cell newCell,
                                boolean copyStyle, String expressionToReplace,
                                String expressionReplacement) {
        if (copyStyle) {
            newCell.setCellStyle(oldCell.getCellStyle());
            copyConditionalFormat(oldCell, newCell);
        }
        switch (oldCell.getCellType()) {
            case STRING:
                String oldValue = oldCell.getRichStringCellValue().getString();
                String newValue = replaceExpressions(oldValue, expressionToReplace, expressionReplacement);
                newCell.setCellValue(newCell.getSheet().getWorkbook().getCreationHelper().createRichTextString(newValue));
                break;
            case NUMERIC:
                newCell.setCellValue(oldCell.getNumericCellValue());
                break;
            case BLANK:
                newCell.setCellType(BLANK);
                break;
            case BOOLEAN:
                newCell.setCellValue(oldCell.getBooleanCellValue());
                break;
            case ERROR:
                newCell.setCellErrorValue(oldCell.getErrorCellValue());
                break;
            case FORMULA:
                newCell.setCellFormula(oldCell.getCellFormula());
                break;
            default:
                break;
        }
    }

getOrCreateCell方法

    public static Cell getOrCreateCell(Sheet poiSheet, Integer rowNum, Integer cellNum) {
        org.apache.poi.ss.usermodel.Row row = poiSheet.getRow(rowNum.intValue());
        if (row == null) {
            row = poiSheet.createRow(rowNum.intValue());
        }
        Cell cell = row.getCell(cellNum.intValue(), Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
        return cell;
    }

还有
net.sf.jxls.parser.Cell
net.sf.jxls.transformer.CellTransformer
net.sf.jxls.transformer.XLSTransformer
都是改CellType就不一一举例了

引用一下这篇文章,不用自己重写代码了,直接下载源码下来放进项目里即可

https://blog.csdn.net/sxc112400/article/details/136541186

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值