easyexcel 不能正确读取excel 单元格公式

dhxwm5r4  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(801)

描述*
想读取单元格公式, 但是只读到了手动写入的公式和 在excel中下拉自动填充的公式中的第一条

触发Bug的代码

@Override
    public void invoke(Map<Integer, String> data, AnalysisContext context) {
        log.info("解析到一条数据:{}", JSON.toJSONString(data));

        // 有公式优先存公式
        Map<Integer, Cell> cellMap = context.readRowHolder().getCellMap();
        for (Map.Entry<Integer, Cell> entry : cellMap.entrySet()) {
            CellData cellData = (CellData) entry.getValue();
            if (cellData.getFormulaData() != null) {
                data.put(entry.getKey(), cellData.getFormulaData().getFormulaValue());
            }
        }
        .....

提示的异常或者没有达到的效果
cellData.getFormulaData() 在读到 excel中下拉自动填充的公式中的除第一条外的单元格时 为""空字符串.

com.alibaba easyexcel 3.0.5

bugtest.xlsx
附件中的25列为自动填充公式

xdyibdwo

xdyibdwo1#

您好,我认为这个问题出现在 XlsxRowHandler.java 中。您可以在 ReadTest.java 中的 cellDataRead 找到相同问题。

经过测试

@Override
    public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
        XlsxTagHandler handler = XLSX_CELL_HANDLER_MAP.get(name);
        if (handler == null || !handler.support(xlsxReadContext)) {
            return;
        }
        xlsxReadContext.xlsxReadSheetHolder().getTagDeque().push(name);
        handler.startElement(xlsxReadContext, name, attributes);
    }

方法可以正确添加 tag 为 f 的值,也就是包括拖拽生成和手动输入的公式值,而

@Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String currentTag = xlsxReadContext.xlsxReadSheetHolder().getTagDeque().peek();
        if (currentTag == null) {
            return;
        }
        XlsxTagHandler handler = XLSX_CELL_HANDLER_MAP.get(currentTag);
        if (handler == null || !handler.support(xlsxReadContext)) {
            return;
        }
        handler.characters(xlsxReadContext, ch, start, length);
    }

无法正确在出现 f tag 时调用,该方法仅能在手动输入和拖拽的第一个正常调用,导致read时出现空公式值。

您可以通过在excel中选中拖拽生成的单元格,只要点击过一次以后再进行读取,就可以正常读取到公式的值。
我正在尝试通过代码修复,如果您有补充请联系我

附:手动点击后生成的正常读取结果
点击前

点击单元格

点击后读取结果

相关问题