JAVA POI 1.17读取模板公式数据报错问题

JAVA POI 1.17读取模板公式数据问题


最近在开发过程中碰到了一个这样的需求:工程内导入一个excel模板,模板有四个sheet页,第一个sheet页用来填充从数据库中读取的原始数据,剩余的三个sheet页全都是各种各样的计算公式,通过计算第一个sheet页的原始数据得出计算数据并存入我们的数据库。

数据导入之后,当我读取公式计算数据的时候,问题出现了,cell读到的是公式而不是计算好的数据,使用下面两个方法读取会报公式错误:

try {
  cellValue = String.valueOf(cell.getNumericCellValue());
  } catch (IllegalStateException e) {
  cellValue = String.valueOf(cell.getRichStringCellValue());
 }

于是我将生成的excel拿出来看了一下,原始数据已经插入了,但是应该生成数据的计算sheet页却全部还是显示的公式,并没有显示计算好的数据。于是我去网上查了一下,得到了以下一个方法,可以强制刷新计算公式:

//刷新sheet页里面的公式
 sheet.setForceFormulaRecalculation(true);

刷新完之后excel确实已经生成了数据,但是java代码里面读取到的还是公式,这就比较奇怪了。于是我又用表达式强制计算了一遍,这次终于可以读取到了:

//强制计算
wb.getCreationHelper().createFormulaEvaluator().evaluateAll();

附整体的一个计算代码:

XSSFWorkbook wb = new XSSFWorkbook(file);
//读取sheet页
XSSFSheet sheet = wb.getSheet("sheet1");
//刷新公式
wb.setForceFormulaRecalculation(true);
//强制计算 
wb.getCreationHelper().createFormulaEvaluator().evaluateAll();
//工作表的行
Row row;
Cell cell;
//获取sheet页A1的公式的数据
row = sheet.getRow(0);
cell = row.getCell(0);


String cellValue="-";

SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");

switch (cell.getCellTypeEnum()) {
            case STRING: // 文本
                cellValue = cell.getRichStringCellValue().getString();
                break;
            case NUMERIC: // 数字、日期
                if (DateUtil.isCellDateFormatted(cell)) {
                    cellValue = ft.format(cell.getDateCellValue());
                } else {
                    cellValue = String.valueOf(cell.getNumericCellValue());
                }
                break;
            case BOOLEAN: // 布尔型
                cellValue = String.valueOf(cell.getBooleanCellValue());
                break;
            case BLANK: // 空白
                cellValue = cell.getStringCellValue();
                break;
            case ERROR: // 错误
                cellValue = "错误";
                break;
            case FORMULA: // 公式
                // 得到对应单元格的字符串
                try {
                    cellValue = String.valueOf(cell.getNumericCellValue());
                } catch (IllegalStateException e) {
                    cellValue = String.valueOf(cell.getRichStringCellValue());
                }
                break;

            default:
                cellValue = "-";

        }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java POI 是一个用于操作 Microsoft Office 文档的开源 Java 库。使用 Java POI,我们可以生成和操作 Excel、Word 和 PowerPoint 等文档。 在批量生成模板数据,可以通过以下步骤来实现: 首先,需要创建一个 Excel 模板文件,可以手动创建或使用已有的 Excel 文件。将需要填充数据的位置设置为特定的标记或占位符,例如使用特定的单元格标记或命名区域来表示需要填充的数据位置。 然后,使用 Java 代码中的 POI读取模板文件。可以使用 HSSFWorkbook 或 XSSFWorkbook 类来读取和处理 Excel 文件,取决于文件的格式。例如使用 XSSFWorkbook 对象来读取 .xlsx 格式的 Excel 文件。 接下来,根据模板中已定义的数据位置,使用 POI 库来进行模板数据的批量填充。可以使用 HSSFSheet 或 XSSFSheet 对象来获取工作表,并使用特定的方法来插入或填充数据。例如,使用行号和列号来获取特定单元格,然后使用setCellValue() 方法设置单元格的值。 在填充完所有数据后,可以选择将生成的新文件保存到指定的位置,或直接在内存中进行进一步处理。 最后,根据需求执行相应的操作,例如保存文件到本地磁盘、发送文件给用户或将文件传输至远程服务器等。 总结起来,使用 Java POI 可以很方便地实现批量生成模板数据的功能,通过读取和操作模板文件,按照预定的数据位置进行填充,并保存或处理生成的新文件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值