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

4szc88ey  于 4个月前  发布在  其他
关注(0)|答案(4)|浏览(49)

建议先去看文档

快速开始常见问题

触发场景描述

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();
                }
            }
        }
    }

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

补充:

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

未设置全局样式的Excel截图

k3fezbri

k3fezbri1#

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

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

r7knjye2

r7knjye22#

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

8zzbczxx

8zzbczxx3#

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

`
// 前景色

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

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

ssgvzors

ssgvzors4#

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

相关问题