[alibaba/easyexcel]填充Excel时 设置边框样式有问题

2024-05-24 580 views
4

填充Excel时 设置写出Excel的样式没法设置

实现CellWriteHandler和RowWriteHandler均无法实现

只能设置行高

边框设置无法实现 1.实现RowWriteHandler 任何方法没法实现增加边框 2.使用CellWriteHandler afterCellDispose方法能实现增加部分数据边框 不知道什么原因 出来的文件有问题

回答

5

参考官方demo-自定义样式 试过了 用自定义样式也不行 我是用模板填充 不是写入 我怀疑填充excel时 模板excel样式覆盖了自定义的样式

9

参考官方demo-自定义样式 试过了 用自定义样式也不行 我是用模板填充 不是写入 我怀疑填充excel时 模板excel样式覆盖了自定义的样式

    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
        // 这里可以对cell进行任何操作
        LOGGER.info("第{}行,第{}列写入完成。", cell.getRowIndex(), cell.getColumnIndex());
        if (!isHead && cell.getColumnIndex() == 0) {
            //CreationHelper createHelper = writeSheetHolder.getSheet().getWorkbook().getCreationHelper();
            final CellStyle cellStyle = cell.getCellStyle();
            cellStyle.setBorderBottom(BorderStyle.THIN);
            cellStyle.setBorderTop(BorderStyle.THIN);
        }
    }

测试类

    @Test
    public void testCustomBorder() throws IOException {
        final ClassPathResource resource = new ClassPathResource("excel/customBorder.xlsx");
        EasyExcel.write(fileName)
                .withTemplate(resource.getInputStream())
                .registerWriteHandler(new CustomBorderCellWriteHandler())
                .sheet()
                .doFill(demoData());
    }

模板 image

填充结果: image 我的测试结果是样式设置成功的,应该不是样式设置的问题,你可以先去掉设置样式部分的代码调试看看,应该是其他部分的问题

2

参考官方demo-自定义样式 试过了 用自定义样式也不行 我是用模板填充 不是写入 我怀疑填充excel时 模板excel样式覆盖了自定义的样式

参考官方demo-自定义样式 试过了 用自定义样式也不行 我是用模板填充 不是写入 我怀疑填充excel时 模板excel样式覆盖了自定义的样式

    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
        // 这里可以对cell进行任何操作
        LOGGER.info("第{}行,第{}列写入完成。", cell.getRowIndex(), cell.getColumnIndex());
        if (!isHead && cell.getColumnIndex() == 0) {
            //CreationHelper createHelper = writeSheetHolder.getSheet().getWorkbook().getCreationHelper();
            final CellStyle cellStyle = cell.getCellStyle();
            cellStyle.setBorderBottom(BorderStyle.THIN);
            cellStyle.setBorderTop(BorderStyle.THIN);
        }
    }

测试类

    @Test
    public void testCustomBorder() throws IOException {
        final ClassPathResource resource = new ClassPathResource("excel/customBorder.xlsx");
        EasyExcel.write(fileName)
                .withTemplate(resource.getInputStream())
                .registerWriteHandler(new CustomBorderCellWriteHandler())
                .sheet()
                .doFill(demoData());
    }

模板 image

填充结果: image 我的测试结果是样式设置成功的,应该不是样式设置的问题,你可以先去掉设置样式部分的代码调试看看,应该是其他部分的问题

我今天再试试 我昨天用你那种方式能增加部分边框 大概30多个cell增加了 剩下的没增加 就出现了 有几行有边框 有几行没有

2

参考官方demo-自定义样式 试过了 用自定义样式也不行 我是用模板填充 不是写入 我怀疑填充excel时 模板excel样式覆盖了自定义的样式

    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
        // 这里可以对cell进行任何操作
        LOGGER.info("第{}行,第{}列写入完成。", cell.getRowIndex(), cell.getColumnIndex());
        if (!isHead && cell.getColumnIndex() == 0) {
            //CreationHelper createHelper = writeSheetHolder.getSheet().getWorkbook().getCreationHelper();
            final CellStyle cellStyle = cell.getCellStyle();
            cellStyle.setBorderBottom(BorderStyle.THIN);
            cellStyle.setBorderTop(BorderStyle.THIN);
        }
    }

测试类

    @Test
    public void testCustomBorder() throws IOException {
        final ClassPathResource resource = new ClassPathResource("excel/customBorder.xlsx");
        EasyExcel.write(fileName)
                .withTemplate(resource.getInputStream())
                .registerWriteHandler(new CustomBorderCellWriteHandler())
                .sheet()
                .doFill(demoData());
    }

模板 image

填充结果: image 我的测试结果是样式设置成功的,应该不是样式设置的问题,你可以先去掉设置样式部分的代码调试看看,应该是其他部分的问题

又测试了下 模板和输出都是xls格式的话

截屏2019-11-17上午9 53 41

结果是这样的

截屏2019-11-17上午9 52 49 截屏2019-11-17上午9 55 33

但是如果是xlsx格式的话 结果就正常了

截屏2019-11-17上午9 56 20 截屏2019-11-17上午9 57 09
5

感觉不是生成问题,而是xls格式的样式数量到上限了(63个数据应用了样式+1个头部样式) 但是我测试中并没有复现这个问题,

  • 推荐你测试一下样式复用。
  • 推荐你测试一下修改样式,而不是新建样式。
  • 还有fill的话会自动使用填充列的样式,没有特殊需求的话不必手动更改,预先设置好就可以了,不用修改
1

感觉不是生成问题,而是xls格式的样式数量到上限了(63个数据应用了样式+1个头部样式) 但是我测试中并没有复现这个问题,

  • 推荐你测试一下样式复用。
  • 推荐你测试一下修改样式,而不是新建样式。
  • 还有fill的话会自动使用填充列的样式,没有特殊需求的话不必手动更改,预先设置好就可以了,不用修改

好的 测试了下 如果不是新建的话 可以修改成功 fill的话自动使用填充列的样式 但是如果数据为空的话 会有一个空值列带着样式 和预期不一样 如果是空值建议把空值列的样式去掉

2

感觉不是生成问题,而是xls格式的样式数量到上限了(63个数据应用了样式+1个头部样式) 但是我测试中并没有复现这个问题,

  • 推荐你测试一下样式复用。
  • 推荐你测试一下修改样式,而不是新建样式。
  • 还有fill的话会自动使用填充列的样式,没有特殊需求的话不必手动更改,预先设置好就可以了,不用修改

好的 测试了下 如果不是新建的话 可以修改成功 fill的话自动使用填充列的样式 但是如果数据为空的话 会有一个空值列带着样式 和预期不一样 如果是空值建议把空值列的样式去掉

空值不要样式这种业务我觉得不太统一,对于这种自定义一个清除样式好了^_^