alibaba / easyexcel

快速、简洁、解决大文件内存溢出的java处理Excel工具
https://easyexcel.opensource.alibaba.com
Apache License 2.0
32.69k stars 7.58k forks source link

生成的excel自定义格式@NumberFormat(value = "0!.0,")将数字转成万为单位保留一位小数在wps中正常展示,office格式错误 #3830

Closed glenmock closed 4 months ago

glenmock commented 5 months ago

触发场景描述

使用注解@NumberFormat(value = "0!.0,")将数字转成万为单位保留一位小数,生成的excel在wps中正常展示,office格式错误 easyexcel版本: 3.3.1

触发Bug的代码

  //写入
        WriteSheet writeSheet1 = EasyExcel.writerSheet(sheetNum).build();
        //指定行设置背景颜色
        writeSheet1.setCustomWriteHandlerList(Collections.singletonList(new CustomRowAddBackgroundColorHandler(IndexedColors.GREY_25_PERCENT.getIndex(),1, 10, 13, 17, 20)));
        // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
        excelWriter.fill(prmSortData, writeSheet1);
        excelWriter.fill(totalMap, writeSheet1);

// CustomRowAddBackgroundColorHandler类 为指定行添加背景颜色
public class CustomRowAddBackgroundColorHandler implements CellWriteHandler {
    private int colorIndex;
    private List<Integer> rowList;

    public CustomRowAddBackgroundColorHandler(int colorIndex, Integer ...row) {
        this.colorIndex = colorIndex;
        this.rowList = new ArrayList<>();
        rowList.addAll(Stream.of(row).collect(Collectors.toList()));
    }

    @Override
    public void afterCellDispose(CellWriteHandlerContext context) {
        Cell cell = context.getCell();
        int rowIndex = cell.getRowIndex();

        // 自定义样式处理
        // 当前事件会在 数据设置到poi的cell里面才会回调
        // 指定行设置背景颜色
        if (rowList.contains(rowIndex)) {
            // 第一个单元格
            // 只要不是头 一定会有数据 当然fill的情况 可能要context.getCellDataList() ,这个需要看模板,因为一个单元格会有多个 WriteCellData
            WriteCellData<?> cellData = context.getFirstCellData();
            // 这里需要去cellData 获取样式
            // 很重要的一个原因是 WriteCellStyle 和 dataFormatData绑定的 简单的说 比如你加了 DateTimeFormat
            // ,已经将writeCellStyle里面的dataFormatData 改了 如果你自己new了一个WriteCellStyle,可能注解的样式就失效了
            // 然后 getOrCreateStyle 用于返回一个样式,如果为空,则创建一个后返回
            WriteCellStyle writeCellStyle = cellData.getOrCreateStyle();
            //writeCellStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex());
            writeCellStyle.setFillForegroundColor((short) this.colorIndex);
            // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND
            writeCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
        }
    }
}

提示的异常或者没有达到的效果

生成的excel在wps中正常展示,office格式错误 wps展示的效果: image

office展示的效果: image

生成的excel附件: demo.xlsx

psxjoy commented 4 months ago

Hi,Microsoft的 Excel在解析xml的时候,会有一个映射关系(例如这里会将!映射成 !!),从而导致解析有问题。请使用以下的格式进行构建

 @NumberFormat(value = "0\\.0,")
psxjoy commented 4 months ago

It is not a bug, please change it to the help wanted tag. @zhuangjiaju

glenmock commented 4 months ago

Hi,Microsoft的 Excel在解析xml的时候,会有一个映射关系(例如这里会将!映射成 !!),从而导致解析有问题。请使用以下的格式进行构建

 @NumberFormat(value = "0\\.0,")

感谢大佬,已解决

psxjoy commented 4 months ago

This issue has been completed, I will close this issue.