easyexce复杂表头导出(一)

easyexcel复杂表头导出(一)

公司最近需要使用easyexcel通过后端来完成复杂表头的导出,最近玩了下感觉还可以,整理了一个demo供参考

步骤

1.引入所需依赖

   <!-- easyexcel -->
   <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>2.2.0-beta1</version>
    </dependency>

2.准备涉及到的自定义类(该类用于设置导出时表单每列的长度,easyexcel本身的类LongestMatchColumnWidthStyleStrategy该类只能导出第一个文档时才有用)

package stcsm.appropriation.controller;

import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.util.CollectionUtils;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
import org.apache.poi.ss.usermodel.Cell;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @ClassName ColumnWidthStyleStrategy
 * @Description: excel导出列长度
 * @Author yjl
 * @Date 2020/5/15 13:50
 **/
public class ExcelWidthStyleStrategy extends AbstractColumnWidthStyleStrategy {

    private static final int MAX_COLUMN_WIDTH = 200;

    private  final Map<Integer, Map<Integer, Integer>> CACHE = new HashMap<Integer, Map<Integer, Integer>>(8);

    @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) {
            return;
        }
        Map<Integer, Integer> maxColumnWidthMap = CACHE.get(writeSheetHolder.getSheetNo());
        if (maxColumnWidthMap == null) {
            maxColumnWidthMap = new HashMap<Integer, Integer>(10);
            CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap);
        }
        Integer columnWidth = dataLength(cellDataList, cell, isHead);
        if (columnWidth < 0) {
            return;
        }
        if (columnWidth > MAX_COLUMN_WIDTH) {
            columnWidth = MAX_COLUMN_WIDTH;
        }
        Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex());
        if (maxColumnWidth == null || columnWidth > maxColumnWidth) {
            maxColumnWidthMap.put(cell.getColumnIndex(), columnWidth);
            writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 200);
        }
    }

    private Integer dataLength(List<CellData> cellDataList, Cell cell, Boolean isHead) {
        if (isHead) {
            return cell.getStringCellValue().getBytes().length;
        }
        CellData cellData = cellDataList.get(0);
        CellDataTypeEnum type = cellData.getType();
        if (type == null) {
            return -1;
        }
        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;
        }
    }
}

3.代码

  public static void main(String[] args) {
        //配置字体,表头背景等
        HorizontalCellStyleStrategy horizontalCellStyleStrategy = setConfigure();
        List<List<Object>> lists = new ArrayList<List<Object>>();
        for(int i = 0 ; i<20 ; i++){
            List<Object> list = new ArrayList<>();
            for(int j = 0 ; j<20 ; j++){
                list.add("测试"+i);
            }
            lists.add(list);
        }
        try {
            //设置请求信息(获取HttpServletResponse,可通过HttpServletResponse给导出数据命名)
     /*       response.setContentType("multipart/form-data");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-disposition", "attachment;filename=sjbkzjap.xlsx");
            ExcelWriter excelWriter = EasyExcelFactory.getWriter(response.getOutputStream());
            */
            String outPath = "c:/demo.xlsx";
            File file = new File(outPath);
            if(file.exists()){
                // 文件存在
                file.delete();
            }
            ExcelWriter excelWriter = EasyExcelFactory.getWriter(new FileOutputStream(outPath));
            WriteSheet writeSheet = EasyExcel.writerSheet(0, "sheet")
                    .registerWriteHandler(horizontalCellStyleStrategy)
                    .registerWriteHandler(new ExcelWidthStyleStrategy())
                    .build();
            // 创建一个表格
            WriteTable table = new WriteTable();
            // 动态添加 表头 headList --> 所有表头行集合
            //表头数据
            List<List<String>> headList = setHeadList();
            table.setHead(headList);
            excelWriter.write(lists,writeSheet,table);
            excelWriter.finish();
            System.out.println("导出成功!");

        }catch (IOException e){
            e.printStackTrace();
        }
    }
		
	//设置表头数据
    public static List<List<String>>  setHeadList(){
        List<String> headTitle0 = new ArrayList<String>();
        List<String> headTitle1 = new ArrayList<String>();
        List<String> headTitle2 = new ArrayList<String>();
        List<String> headTitle3 = new ArrayList<String>();
        List<String> headTitle4 = new ArrayList<String>();
        List<String> headTitle5 = new ArrayList<String>();
        List<String> headTitle6 = new ArrayList<String>();
        List<String> headTitle7 = new ArrayList<String>();
        List<String> headTitle8 = new ArrayList<String>();
        List<String> headTitle9 = new ArrayList<String>();
        List<String> headTitle14 = new ArrayList<String>();
        List<String> headTitle15 = new ArrayList<String>();
        List<String> headTitle16 = new ArrayList<String>();
        List<String> headTitle17 = new ArrayList<String>();
        List<String> headTitle18 = new ArrayList<String>();
        List<String> headTitle23 = new ArrayList<String>();
        List<String> headTitle24 = new ArrayList<String>();
        List<String> headTitle25 = new ArrayList<String>();

        //设置第一列为项目导出标题
        headTitle0.add("测试导出");
        headTitle1.add("测试导出");
        headTitle2.add("测试导出");
        headTitle3.add("测试导出");
        headTitle4.add("测试导出");
        headTitle5.add("测试导出");
        headTitle6.add("测试导出");
        headTitle7.add("测试导出");
        headTitle8.add("测试导出");
        headTitle9.add("测试导出");
        headTitle14.add("测试导出");
        headTitle15.add("测试导出");
        headTitle16.add("测试导出");
        headTitle17.add("测试导出");
        headTitle18.add("测试导出");
        headTitle23.add("测试导出");
        headTitle24.add("测试导出");
        headTitle25.add("测试导出");

        headTitle0.add("");
        headTitle1.add("");
        headTitle2.add("");
        headTitle3.add("");
        headTitle4.add("");
        headTitle5.add("");
        headTitle6.add("");
        headTitle7.add("");
        headTitle8.add("");
        headTitle9.add("");
        headTitle14.add("");
        headTitle15.add("");
        headTitle16.add("");
        headTitle17.add("");
        headTitle18.add("");
        headTitle23.add("");
        headTitle24.add("");
        headTitle25.add("单位:元");

        headTitle0.add("编号");
        headTitle1.add("姓名");
        headTitle2.add("年龄");
        headTitle3.add("居住地");
        headTitle4.add("父亲");
        headTitle5.add("母亲");
        headTitle6.add("工作单位");
        headTitle7.add("工资");
        headTitle8.add("转正前");
        headTitle9.add("转正前");
        headTitle14.add("转正前");
        headTitle15.add("转正前");
        headTitle16.add("平均工资");
        headTitle17.add("转正后");
        headTitle18.add("转正后");
        headTitle23.add("转正后");
        headTitle24.add("转正后");
        headTitle25.add("平均工资");

        headTitle0.add("编号");
        headTitle1.add("姓名");
        headTitle2.add("年龄");
        headTitle3.add("居住地");
        headTitle4.add("父亲");
        headTitle5.add("母亲");
        headTitle6.add("工作单位");
        headTitle7.add("工资");
        headTitle8.add("第一个月");
        headTitle9.add("第一个月");
        headTitle14.add("第二个月");
        headTitle15.add("第二个月");
        headTitle16.add("平均工资");
        headTitle17.add("第一个月");
        headTitle18.add("第一个月");
        headTitle23.add("第三个月");
        headTitle24.add("第三个月");
        headTitle25.add("平均工资");

        headTitle0.add("编号");
        headTitle1.add("姓名");
        headTitle2.add("年龄");
        headTitle3.add("居住地");
        headTitle4.add("父亲");
        headTitle5.add("母亲");
        headTitle6.add("工作单位");
        headTitle7.add("工资");
        headTitle8.add("日期");
        headTitle9.add("金额");
        headTitle14.add("日期");
        headTitle15.add("金额");
        headTitle16.add("平均工资");
        headTitle17.add("日期");
        headTitle18.add("金额");
        headTitle23.add("日期");
        headTitle24.add("金额");
        headTitle25.add("平均工资");

        //列数据保存
        List<List<String>> headList = new ArrayList<List<String>>();
        headList.add(headTitle0);
        headList.add(headTitle1);
        headList.add(headTitle2);
        headList.add(headTitle3);
        headList.add(headTitle4);
        headList.add(headTitle5);
        headList.add(headTitle6);
        headList.add(headTitle7);
        headList.add(headTitle8);
        headList.add(headTitle9);
        headList.add(headTitle14);
        headList.add(headTitle15);
        headList.add(headTitle16);
        headList.add(headTitle17);
        headList.add(headTitle18);

        //临时插入(可动态获取)
        List<String> maxList = new ArrayList<String>();
        List<String> maxList2 = new ArrayList<String>();
        maxList.add("测试导出");
        maxList.add("");
        maxList.add("转正后");
        maxList.add("第二个月");
        maxList.add("日期");
        maxList.add("日期");

        maxList2.add("测试导出");
        maxList2.add("");
        maxList2.add("转正后");
        maxList2.add("第二个月");
        maxList2.add("金额");
        maxList2.add("金额");
        headList.add(maxList);
        headList.add(maxList2);
        headList.add(headTitle23);
        headList.add(headTitle24);
        headList.add(headTitle25);
        return headList;
    }


    //配置字体,表头背景等
    private static HorizontalCellStyleStrategy setConfigure() {
        // 头的策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // 背景色
        headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
        WriteFont headWriteFont = new WriteFont();
        headWriteFont.setFontHeightInPoints((short) 10);
        headWriteCellStyle.setWriteFont(headWriteFont);


        // 内容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        // 字体策略
        WriteFont contentWriteFont = new WriteFont();
        // 字体大小
        contentWriteFont.setFontHeightInPoints((short) 10);
        contentWriteCellStyle.setWriteFont(contentWriteFont);
        //边框
        //导出数据垂直居中
        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        //导出数据水平居中
        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
        contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);

        //设置 自动换行
        contentWriteCellStyle.setWrapped(true);
        //设置
        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
        return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
    }

4.导出样式
在这里插入图片描述

easyexce复杂表头导出(二)

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于复杂表头导出EasyExcel是一个非常方便的Java库。你可以按照以下步骤进行操作: 1. 导入EasyExcel依赖:在你的项目中,添加EasyExcel的Maven或Gradle依赖。 2. 创建表头样式:使用EasyExcel提供的样式类,如`com.alibaba.excel.write.style.column.SimpleColumnWidthStyleStrategy`,可根据列宽自动调整。你还可以自定义样式,如字体、颜色等。 3. 定义数据模型:创建一个Java类,用于表示导出数据的模型。每个字段对应一列数据。 4. 准备数据:从数据库或其他数据源获取要导出的数据,并将其封装到定义好的数据模型中。 5. 创建导出任务:使用EasyExcel提供的`com.alibaba.excel.EasyExcel.write()`方法创建一个导出任务。传入要导出的数据集合、要导出的数据模型类以及导出文件的路径。 6. 设置表头:使用EasyExcel提供的`com.alibaba.excel.write.metadata.style.WriteCellStyle`类,可以设置表头的样式。 7. 执行导出:调用导出任务的`sheet()`方法,设置表格名称和表头行数。然后调用`doWrite()`方法执行导出导出的过程是逐行写入,并自动处理分页和大数据量导出。 下面是一个示例代码片段,演示了如何使用EasyExcel导出复杂表头: ``` // 导出数据 List<YourDataModel> dataList = getDataFromDataSource(); // 创建导出任务 String exportFilePath = "path/to/export/file.xlsx"; ExcelWriter excelWriter = EasyExcel.write(exportFilePath, YourDataModel.class).build(); // 设置表头样式 WriteCellStyle headStyle = new WriteCellStyle(); // 设置样式属性,如字体、颜色等 // 执行导出 excelWriter.sheet().head(headStyle).doWrite(dataList); // 关闭资源 excelWriter.finish(); ``` 这样,你就可以使用EasyExcel实现复杂表头导出了。希望对你有帮助!如有更多问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值