easyexcel icon indicating copy to clipboard operation
easyexcel copied to clipboard

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

Open HantaoCai opened this issue 2 years ago • 3 comments

描述* 想读取单元格公式, 但是只读到了手动写入的公式和 在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列为自动填充公式

HantaoCai avatar May 11 '22 08:05 HantaoCai

您好,我认为这个问题出现在 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中选中拖拽生成的单元格,只要点击过一次以后再进行读取,就可以正常读取到公式的值。 我正在尝试通过代码修复,如果您有补充请联系我

附:手动点击后生成的正常读取结果 点击前 @CT RVU}{I9_WT5I8CB~Q6W 点击单元格 OEOTJOQC)MX}{2@FZ3DI))S 点击后读取结果 N@ 3}HFBEBMXRECH2_}6)MU

kkang247 avatar May 28 '22 05:05 kkang247

v3.3.3 未修复这个问题

LHiaoeng avatar Jan 25 '24 09:01 LHiaoeng

v3.3.3 未修复这个问题

3.3.4 也没有解决~~

cnscottluo avatar Apr 22 '24 14:04 cnscottluo