alibaba / easyexcel

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

V3.2.1设置全局样式后Office Excel打开后内容被黑色覆盖,WPS打开正常显示内容。 #3488

Open FengQing0510 opened 11 months ago

FengQing0510 commented 11 months ago

建议先去看文档

快速开始常见问题

触发场景描述

V3.2.1,设置全局单元格样式,导出Office Excel打开后内容被黑色覆盖,WPS打开则正常显示。

Excel文件格式均为xlsx

触发Bug的代码

  /**
     * 自定义内容单元格全局样式
     *
     * @return
     */
    public static HorizontalCellStyleStrategy contentCellStyle() {
        // 内容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
        contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
        // 居中 水平居中、垂直居中
        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        // 边框
        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);

        return new HorizontalCellStyleStrategy(null, contentWriteCellStyle);
    }

/**
     * 导出
     * 
     * @param response
     * @param fileName
     * @param sheetDataWrapper
     */
private void export(HttpServletResponse response, String fileName, WriteSheetDataWrapper sheetDataWrapper) {
        if (ObjectUtil.isNotEmpty(sheetDataWrapper)) {
            ExcelWriter excelWriter = null;
            try {
                // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
                response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
                response.setCharacterEncoding(CharsetUtil.UTF_8);
                // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
                String encodeFileName = URLEncoder.encode(fileName, CharsetUtil.UTF_8).replaceAll("\\+", "%20");
                response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + encodeFileName + ExcelTypeEnum.XLSX.getValue());

                excelWriter = EasyExcel.write(response.getOutputStream())
                                        // 设置的全局样式
                                        .registerWriteHandler(ExportService.contentCellStyle())
                                        .build();

                excelWriter.write(sheetDataWrapper.getDataList(), sheetDataWrapper.getSheet());
            } catch (Exception ex) {
                log.error("Export excel error.", ex);
            } finally {
                if (excelWriter != null) {
                    excelWriter.finish();
                }
            }
        }
    }

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

补充: image

代码中出现的WriteSheetDataWrapper,是我构建的一个包装类,用于统一处理内容、表头、Sheet名称。 V3.2.1,使用自定义的全局样式,对内容的样式做了统一处理,表头使用的默认样式。导出的Excel使用WPS打开一切正常,Office Excel打开内容就是黑的;取消全局样式的设置后,导出的Excel二者都可正常显示内容。 设置全局格式的Excel截图 image image


未设置全局样式的Excel截图 image image

FengQing0510 commented 11 months ago

将Office Excel打开为黑色的单元格背景色,改为白色填充后,填充的内容和样式也能被看到。

image

即使我将全局样式中加上白色的单元格背景色设置,Office打开仍旧是黑色的。

xhhh12138 commented 9 months ago

我也遇到这个问题,也是把全局样式删除就可以了。改成局部样式来设置。

FengQing0510 commented 8 months ago

我也遇到这个问题,也是把全局样式删除就可以了。改成局部样式来设置。

`
// 前景色

    contentWriteCellStyle.setFillForegroundColor(IndexedColors.PINK.getIndex());

` 在全局样式中用这个来设置“前景色”,Excel的单元格背景色,就能生效了。WPS、Office打开都是正常。 image

LSL1618 commented 8 months ago

我也遇到了一样的问题,导出来用MS Office打开结果内容背景色是纯黑色,这就很困惑了。毕竟我设置的全局背景色都是白色,字体颜色是纯黑色,突然蹦出来一大片黑色背景色就很莫名其妙,后来发现是FillPatternType.SOLID_FOREGROUND这个设置搞的鬼,去掉它就正常了。