首页 > 其他分享 >动态生成excel动态表头easyExcel

动态生成excel动态表头easyExcel

时间:2024-10-22 14:43:07浏览次数:1  
标签:titleEntityList easyExcel List 表头 add ArrayList new 动态 response

动态生成excel,内容跟随表头填充

 

组装调用工具方法:

List<FileTitleEntity> titleEntityList = new ArrayList<>();
        titleEntityList.add(new FileTitleEntity("name", "姓名"));
        titleEntityList.add(new FileTitleEntity("idNumber", "证件号码"));
        titleEntityList.add(new FileTitleEntity("projectDistrict", "参与项目行政区划"));
        titleEntityList.add(new FileTitleEntity("nationality", "民族"));
        titleEntityList.add(new FileTitleEntity("address", "住址"));
        titleEntityList.add(new FileTitleEntity("phoneNumber", "联系电话"));
        titleEntityList.add(new FileTitleEntity("subsidyAmount", "补贴金额(元)"));
        titleEntityList.add(new FileTitleEntity("bankCategory", "银行类别"));
        titleEntityList.add(new FileTitleEntity("accountName", "开户姓名"));
        titleEntityList.add(new FileTitleEntity("bankAccount", "银行账号"));
        titleEntityList.add(new FileTitleEntity("remarks", "备注"));
        List<Map<String, Object>> sheetMapList = new ArrayList<>();
        Map<String, Object> sheetOne = new HashMap<>();
        sheetOne.put("sheetName", "Sheet1");
        sheetOne.put("sourceList", "组装的List<String,String>数组");
sheetOne.put("titleEntityList", titleEntityList); sheetMapList.add(sheetOne);
try {
FileUtils.exportDynamicExcel(response, "测试模板.xlsx", sheetMapList);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("系统导出异常,请联系管理员!");
}


组装的List<String,String>数组,如下:


List<Map<String, String>> sourceThreeList = regionExcels.stream().map(template->{
Map<String, String> map = new HashMap<>();
map.put("姓名", template.getRegionId());
map.put("证件号码", template.getRegionName());
return map;
}).collect(Collectors.toList());

 

 

自定义列宽:

import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
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.List;



public class ExcelColumnWidthHandler extends AbstractColumnWidthStyleStrategy {

    @Override
    protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
        if (Boolean.TRUE.equals(isHead)) {
            int columnWidth = cell.getStringCellValue().length();
            columnWidth = Math.max(columnWidth * 5, 20);
            if (columnWidth > 255) {
                columnWidth = 255;
            }
            if(cell.getStringCellValue().equals("模版使用说明")){
                writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(),150 * 255);
            }else{
                writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256);
            }
        }

    }
}

 

 

优化后的工具类:

/**
     * 动态Excel导出,根据headMap表头顺序组装sourceList对应内容,再导出
     *
     * @param response     response
     * @param fileName     文件名
     * @param sheetMapList sheet页相关内容:
     *                     sheetName名称
     *                     titleEntityList    动态表头对象(titleEntity),例如:{"title":"name","titleName":"姓名"}
     *                     sourceList 原数据List,例如:{"姓名":"张三"}
     */
    public static void exportDynamicExcel(HttpServletResponse response, String fileName, List<Map<String, Object>> sheetMapList) throws Exception {

        response.setCharacterEncoding("UTF-8");
        response.setHeader("Content-Transfer-Encoding", "binary");
        response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
        response.setHeader("Pragma", "public");
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
        fileName = new String(fileName.getBytes(), "ISO-8859-1");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName);

        //初始化输出流
        ExcelWriter writer;
        try {

            // 创建并配置写入样式
            WriteCellStyle contentStyle = new WriteCellStyle();
            // 启用自动换行
            contentStyle.setWrapped(true);

            // 应用样式到特定列或所有列
            HorizontalCellStyleStrategy horizontalCellStyleStrategy =
                    new HorizontalCellStyleStrategy(contentStyle, contentStyle);

            writer = EasyExcel.write(response.getOutputStream()).build();


            sheetMapList.forEach(sheetMap -> {
                String sheetName = sheetMap.get("sheetName").toString();
                List<Map<String, String>> sourceList = (List<Map<String, String>>) sheetMap.get("sourceList");
                List<FileTitleEntity> titleEntityList = (List<FileTitleEntity>) sheetMap.get("titleEntityList");

                // 设置动态表头对象
                List<List<String>> head = new ArrayList<>();

                // 设置对应表头转换属性名列表
                List<String> headRow = new ArrayList<>();
                titleEntityList.forEach(titleEntity -> {
                    headRow.add(titleEntity.getTitleName());
                });

                // 列表设置列头
                headRow.forEach(item -> {
                    List<String> list = new ArrayList<>();
                    list.add(item);
                    head.add(list);
                });
                // 构造数据列表
                List<List<Object>> excelData = new ArrayList<>();
                if (CollectionUtils.isNotEmpty(sourceList)) {
                    for (Map<String, String> map : sourceList) {
                        List<Object> row = new ArrayList<>();
                        titleEntityList.forEach(titleEntity -> {
                            String value = map.get(titleEntity.getTitleName());
                            // 转换为字符串,如果为null则填充空字符串
                            row.add(StringUtils.isNotEmpty(value) ? value : "");
                        });
                        excelData.add(row);
                    }
                }
//                writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256);
//            EasyExcel.write(response.getOutputStream()).head(head).registerConverter(new LongStringConverter()).sheet(sheetName).doWrite(excelData);

                writer.write(excelData, EasyExcel.writerSheet(sheetName).head(head).registerWriteHandler(new ExcelColumnWidthHandler()).registerWriteHandler(horizontalCellStyleStrategy).registerConverter(new LongStringConverter()).build());
            });
            writer.finish();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                response.flushBuffer();
            } catch (IOException ignored) {
            }
        }
    }

 

 

 

工具方法:

/**
* 动态Excel导出,先sourceList转换成List<targetClass>,再导出
*
* @param response response
* @param fileName 文件名
* @param sheetName sheetName
* @param headMap 动态表头对象(Map<String,String>),例如:{"id":"ID","name":"姓名"}
* @param sourceList 原数据List,例如:{"ID":"1","姓名":"张三"}
*/
public static void exportDynamicExcel(HttpServletResponse response, String fileName, String sheetName, List<Map<String, String>> sourceList, Map<String,String> headMap) throws Exception {

// response.setContentType("application/vnd.ms-excel");
// response.addHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
// response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1) + ".xlsx");

response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
fileName = new String(fileName.getBytes(), "ISO-8859-1");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);




// 设置动态表头对象
List<List<String>> head = new ArrayList<>();

// 设置对应表头转换属性名列表
// List<String> headPropertyList = new ArrayList<>();
List<String> headRow = new ArrayList<>();
headMap.forEach((k, v) -> {
headRow.add(v);
});

// 列表设置列头
headRow.forEach(item -> {
List<String> list = new ArrayList<>();
list.add(item);
head.add(list);
});
// 构造数据列表
List<List<Object>> excelData = new ArrayList<>();
for (Map<String, String> map : sourceList) {
List<Object> row = new ArrayList<>();
headMap.forEach((k, v) -> {
String value = map.get(k);
// 转换为字符串,如果为null则填充空字符串
row.add(StringUtils.isNotEmpty(value) ? value : "");
});
excelData.add(row);
}

EasyExcel.write(response.getOutputStream()).head(head).registerConverter(new LongStringConverter()).sheet(sheetName).doWrite(excelData);
}

 

标签:titleEntityList,easyExcel,List,表头,add,ArrayList,new,动态,response
From: https://www.cnblogs.com/mangwusuozhi/p/18299134

相关文章

  • vue3 setup lang=ts实现router-link的动态传参
    一、实现目标 可以通过router-link在url里面配置参数然后传递给markdown页面 二、页面配置主页面,即配置router-link的页面templates:<router-link:to="{path:`/mark/${itemId}`}">fff</router-link>script:constitemId=ref('333'); 接收数据页面,即mark页面......
  • echarts根据数据动态生成饼图的个数,并排序
    动态生成个数functioninitPurchaseContract(){//获取数据的keysletkeys=Object.keys(dataPurchaseContract[0]);lettotalCharts=keys.length-1;//饼图数量//动态计算行数和列数(使布局接近正方形)letcols=3;//列数letrows......
  • 在K8S中,有一种情况,公司希望向具有各种环境的客户提供所有必需的分发,他们如何以动态的
    在Kubernetes(K8S)中,公司若希望向具有各种环境的客户提供所有必需的分发,并以动态的方式实现这一关键目标,可以遵循以下步骤和策略:1.多环境部署策略创建不同的命名空间在Kubernetes中,命名空间是一种将集群内部资源(如Pod、Service等)分组的方式。公司可以为每个客户或环境创建一个......
  • 【LeetCode】动态规划—790. 多米诺和托米诺平铺(附完整Python/C++代码)
    动态规划—790.多米诺和托米诺平铺题目描述前言基本思路1.定义2.理解问题和递推关系3.解决方法4.进一步优化5.小总结代码实现Python代码Python代码解释总结C++代码C++代码解释总结总结题目描述前言本文将详细讨论LeetCode上的"多米诺和三米诺平铺"问题。......
  • EasyExcel读取文件数据不能映射到实体的一种情况(对于链式调用实体的数据映射支持)
    除去在网上能搜到的由于表头配置不对、单元格格式影响、文件编码以及依赖版本之类的问题以外,还存在一个可能导致这个问题的原因,也是我现在遇到的,记录一下。先说结论,EasyExcel不支持映射数据到使用了链式调用的实体类上。我的情况是在接收Excel数据的实体类上添加了Lombok注解:@A......
  • 动态内存管理(下)
    目录常见的动态内存的错误对NULL指针的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用free释放使用free释放⼀块动态开辟内存的一部分对同一块动态内存多次释放动态开辟内存忘记释放(内存泄漏)柔性数组柔性数组的特点柔性数组的使用柔性数组的优势感谢各位......
  • 调速系统的静态指标和动态指标
    调速系统的静态指标和动态指标如下:静态指标调速范围(D):指电动机在额定负载运行时,最高转速与最低转速的比值。它反映了系统在不同工况下的适应能力。例如,精密机床要求加工精度达到几十微米至几微米,其调速范围可能高达20~30倍;而重型机床的进给机构需要在很宽的范围内调速,最高和......
  • HarmonyOS:应用程序包结构(2)HSP(Harmony Shared Package)动态共享包
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(MaoistLearning)➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/......
  • mybatis - [09] 动态SQL
    题记部分 一、if&test如果id,name,age不为空,则按照指定的值进行查询。如果这三者都是空(null和空字符串),则该sql执行结果为全表查询的结果集。<selectid="getUserByUser"parameterTytpe="vo.User"resultMap="userResultMap">selectin,name,agefrom......
  • 【数据结构】动态规划:揭开算法优化的秘密
    在算法世界中,动态规划(DynamicProgramming,DP)无疑是一个充满魅力的思想,特别是在解决复杂的优化问题时,它展现出了极大的威力。它不仅能优化问题的求解速度,还能通过减少重复计算来提高效率。然而,对于很多初学者来说,动态规划常常显得有些晦涩难懂。本文将通过浅显的例子,帮助你......