Java 通过EasyExcel导出的Excel文档的字体,背景色,自动列宽等符合要求

这次开任务使用的是EasyExcel导出Excel文档,但是在任务过程中,生成的文档的格式要求并不符合产品和测试的期望值,如图:
在这里插入图片描述
想着自己地位低下,也无能力反驳。只好硬着头皮查阅资料来达到他们的想要的需求结果。如图:
在这里插入图片描述
经过百度工程师的各种挑战实验和查阅。终于让我实现了上述的要求。代码如下:

Excel文档的自动列宽设置

public class Custemhandler extends AbstractColumnWidthStyleStrategy {

    private static final int MAX_COLUMN_WIDTH = 255;
    //因为在自动列宽的过程中,有些设置地方让列宽显得紧凑,所以做出了个判断
    private static final int COLUMN_WIDTH = 20;
    private  Map<Integer, Map<Integer, Integer>> CACHE = new HashMap(8);

    public Custemhandler() {
    }

    @Override
    protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
        boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList);
        if (needSetWidth) {
            Map<Integer, Integer> maxColumnWidthMap = (Map)CACHE.get(writeSheetHolder.getSheetNo());
            if (maxColumnWidthMap == null) {
                maxColumnWidthMap = new HashMap(16);
                CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap);
            }

            Integer columnWidth = this.dataLength(cellDataList, cell, isHead);
            if (columnWidth >= 0) {
                if (columnWidth > MAX_COLUMN_WIDTH) {
                    columnWidth = MAX_COLUMN_WIDTH;
                }else {
                    if(columnWidth<COLUMN_WIDTH){
                        columnWidth =columnWidth*2;
                    }
                }

                Integer maxColumnWidth = (Integer)((Map)maxColumnWidthMap).get(cell.getColumnIndex());
                if (maxColumnWidth == null || columnWidth > maxColumnWidth) {
                    ((Map)maxColumnWidthMap).put(cell.getColumnIndex(), columnWidth);
                    writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(),  columnWidth* 256);
                }
            }
        }
    }

    private  Integer dataLength(List<CellData> cellDataList, Cell cell, Boolean isHead) {
        if (isHead) {
            return cell.getStringCellValue().getBytes().length;
        } else {
            CellData cellData = (CellData)cellDataList.get(0);
            CellDataTypeEnum type = cellData.getType();
            if (type == null) {
                return -1;
            } else {
                switch(type) {
                    case STRING:
                        return cellData.getStringValue().getBytes().length;
                    case BOOLEAN:
                        return cellData.getBooleanValue().toString().getBytes().length;
                    case NUMBER:
                        return cellData.getNumberValue().toString().getBytes().length;
                    default:
                        return -1;
                }
            }
        }
    }
}

Excel的字体,样式,背景色的设置

 public static HorizontalCellStyleStrategy getStyleStrategy(){
        // 头的策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // 背景设置为灰色
        headWriteCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        WriteFont headWriteFont = new WriteFont();
        headWriteFont.setFontHeightInPoints((short)12);
        // 字体样式
        headWriteFont.setFontName("Frozen");
        headWriteCellStyle.setWriteFont(headWriteFont);
        //自动换行
        headWriteCellStyle.setWrapped(false);
        // 水平对齐方式
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        // 垂直对齐方式
        headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);

        // 内容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
//        contentWriteCellStyle.setFillPatternType(FillPatternType.SQUARES);
        // 背景白色
        contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
        WriteFont contentWriteFont = new WriteFont();
        // 字体大小
        contentWriteFont.setFontHeightInPoints((short)12);
        // 字体样式
        contentWriteFont.setFontName("Calibri");
        contentWriteCellStyle.setWriteFont(contentWriteFont);
        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
        return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
    }

调用方式

这部分是因为我的Excel都是自定义开头数据,所以用的是List。

     EasyExcel.write(outputStream).needHead(true)
                .head(getAssignmentTotalExcelSheet0Title())
                .excelType(ExcelTypeEnum.XLSX)
                .registerWriteHandler(new Custemhandler())
                .registerWriteHandler(EasyExcelUtil.getStyleStrategy())
                .sheet(0, "Assignment Total Report")
                .doWrite(getAssignmentTotalSheet0Data(list));

下面部分是用上实体类的调用

public static void write(OutputStream outputStream, Class<?> clazz, String sheetName, List writeList){
        EasyExcel.write(outputStream).needHead(true)
                .head(clazz)
                .excelType(ExcelTypeEnum.XLSX)
                .registerWriteHandler(new Custemhandler())
                .registerWriteHandler(EasyExcelUtil.getStyleStrategy())
                .sheet(0, sheetName)
                .doWrite(writeList);
    }

实体类说明

    @ExcelProperty(value = "Tenant")  //表示Excel 显示的表头
    private String tenant;
    @ExcelProperty(value = "Locale")
    private String locale;

参考说明:

如有疑问,可以参考以下文档:
https://www.yuque.com/easyexcel/doc/easyexcel (EasyExcel 官网)
https://www.cnblogs.com/Hizy/p/11825886.html (Excel的字体,样式,背景色的设置参考)
https://blog.csdn.net/qq_37361535/article/details/106050623(Excel文档的自动列宽设置参考)

  • 37
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
可以通过以下步骤在uniapp中使用Java easyexcel导出Excel: 1. 在Java中编写导出Excel的代码,并将其打包成jar包或war包。 2. 在uniapp中使用axios或其他网络请求库将数据发送到Java后端。 3. 在Java后端中解析数据,使用easyexcel生成Excel文件,并将其返回给uniapp前端。 4. 在uniapp前端中使用js-xlsx或其他Excel解析库解析Excel文件,以便在前端进行处理。 以下是一个简单的Java代码示例,用于将数据导出Excel文件中: ```java public void exportExcel(HttpServletResponse response) throws IOException { List<User> userList = userService.getUserList(); // 设置表头 List<List<String>> head = new ArrayList<>(); List<String> head0 = new ArrayList<>(); head0.add("编号"); head0.add("姓名"); head0.add("年龄"); head.add(head0); // 设置表格数据 List<List<Object>> data = new ArrayList<>(); for (User user : userList) { List<Object> row = new ArrayList<>(); row.add(user.getId()); row.add(user.getName()); row.add(user.getAge()); data.add(row); } // 导出Excel文件 response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-disposition", "attachment;filename=user.xlsx"); ServletOutputStream out = response.getOutputStream(); EasyExcel.write(out).head(head).sheet("用户数据").doWrite(data); } ``` 在uniapp中,您可以使用以下代码将数据发送到Java后端: ```javascript exportExcel() { axios.post('/api/exportExcel', this.userList) .then(response => { let blob = new Blob([response.data], {type: 'application/vnd.ms-excel'}) let link = document.createElement('a') link.href = URL.createObjectURL(blob) link.download = 'user.xlsx' link.click() }) } ``` 在上面的代码中,我们使用axios将用户列表发送到Java后端的/api/exportExcel接口。后端接口将生成Excel文件并将其作为响应返回。在前端,我们使用Blob和URL.createObjectURL将响应数据转换为Excel文件,并使用a标签模拟点击以下载文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值