# export_client **Repository Path**: hushnows/export_client ## Basic Information - **Project Name**: export_client - **Description**: 一个集成easyexcel以及自定义excel的下载器 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-01-13 - **Last Updated**: 2024-07-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 导出 这是一个导出的工具包 ## 说明 * 使用时打成jar包,集成到主项目中 ```java org.robert export_client 1.0-SNAPSHOT ``` * 整体基于EasyExcel实现 * 需要配置EasyExcel相关注解实现 * 参考代码在demo包中 * 计划支持 数据集合、数据源、excel模板三种导出方式 * 支持web导出、写入指定目录两种方式 * 目前已经支持数据集合、数据源两种方式, * 写入指定位置的接口支持同步、异步两种方式 ## easyExcel * 字典支持字符串拼接转换 ### Web数据集合导出 * ExcelExportDataExportService.exportToExcel() * 导出excel到web,通过数据导出,直接提供List集合数据 * 使用正确的构造函数 * 支持字典转换,需要在实体需要转换的属性中添加@ExportDict("字典Key") * 需要将字典的key-value 放入 Map, 设置在dictMap属性中 * 属性值必须时String类型,因为转换后字典值也是赋值在属性中 ### Web数据源导出 * ExcelDownLoad.exportToExcelWeb(HttpServletResponse response, ExcelSourceWebRequest request) * 导出excel到web,通过数据源导出 * 需要实现ExcelBaseQuery接口,并且重写 List query(T t)方法,web导出不支持分页 * 传入时需要将具体的实现对象注入到SpringBoot中,或者实例化,然后传入到request对象中。 * 支持字典转换,需要在实体需要转换的属性中添加@ExportDict("字典Key") * 需要将字典的key-value 放入 Map, 设置在dictMap属性中 * 属性值必须时String类型,因为转换后字典值也是赋值在属性中 ### 磁盘数据源导出 * ExcelDownLoad.exportToExcel(ExcelSourceRequest excelRequest, boolean isAsync) * 支持同步异步写入磁盘 * path是文件夹目录 * 需要实现ExcelBaseQuery接口,并且重写List query(T t, int page, int size)方法和Long queryCount(T t) * 一个提供数据源分页查询,一个提供数据总和查询,使用原生sql即可 ### Web前端代码 * axios, 获取到的response ```js export function exportExcel(response) { // 解析文件 var dispositionStr = response.headers['content-disposition']; if (dispositionStr == null || dispositionStr === '') { message.error('下载失败!'); return; } // 获取文件名 let dispositionArr = dispositionStr.split(';'); // 我们的文件名可能含有汉字,因此在后端进行了UTF-8编码处理,此处进行解码 let fileName = decodeURIComponent(dispositionArr[1]); fileName = fileName.split("filename*=utf-8''")[1]; response.name = fileName; const blob = new Blob([response?.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8', }); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.setAttribute('download', response?.name || new Date().getTime + '.xlsx'); link.click(); document.body.appendChild(link); } ``` # 自定义Excel * 在excel包下,是根据poi参考easyexcel构建的符合业务的导出包 * 支持字段json解析成对象 * 支持时间转换 * 支持字段位置排序 * 支持字典转换,多字典分割转换 * 支持字段合并 * 主属性使用 @ExcelProperty(value = "处理日志") * @ExcelFieldMerge(value = "connect", total = 3) 两个注解,total必填 * connect 字段选填,默认是, 只需要填写在 主属性中 * 子字段只使用 @ExcelFieldMerge(value = "connect", index = 1) 字段,index和value 必填, * value 是主属性的name,index是拼接位置,下标默认从0开始,0是主属性的位置,剩下的从1开始 * 支持字段按条件展示,可以数据依赖 ## 注解 ### 一级注解 * 一级注解是排斥的,不可以同时使用 * @ExcelProperty(value = "处理日志") * @ExcelJson(parserFor = JSONTest.class) * @ExcelFieldMerge(value = "connect", index = 1) 这个介于一级注解和二级注解,作为二级注解需要和@ExcelProperty(value = "处理日志") 联用 ### 二级注解 * 二级注解可以和一级注解一起使用 * @ExcelDepend 依赖,单条件依赖, 可以依赖其他属性,也可以根据属性值进行是否展示,也可以根据条件设置固定值,具体查看枚举类,比如 当state不为空时,就展示【是】,否则就展示空 * 比如:这个是指 依赖于state字段,当state = 1 的时候,才会显示description 字段,否则就不展示,name如果不填,就是value与description的值比较 ```java @ExcelDepend(value = "1", name = "state", type = ComparisonEnum.EQUAL, valueType = String.class) private String description; ``` * @ExportDict 字典解析 * @DateTimeFormat 时间格式化 * @ExcelFieldMerge 中可以 使用@ExcelDepend注解,待开发 * 如果字段是值是null,或者toString() 是空、空格,都会输出 "", ## 样式 * CellStyleEntity 可以根据这个类去构建样式,在 createSheet中传入,构建标题样式, * 在 doWrite中传入,构建内容行样式,包括背景颜色,填充方式,行高,字体大小,颜色 ## 根据数据导出本地 ```java // 参考ExcelLambdaTest.java文件 ExcelWrite.write("D:\\文档\\测试\\").createSheet("Sheet1", ExcelTempDemo.class, dictMap).doWrite(list); // 循环导出多个sheet WorkbookPathWrite build = ExcelWrite.write("D:\\文档\\测试\\").build(); for (int j = 0; j < 5; j++){ WriteSheet sheet = build.createSheet("Sheet"+j, ExcelTempDemo.class, dictMap).build(); List list1 = new ArrayList<>(); for(int i=j*10000; i< (j+1) * 10000; i++){ JSONTest jsonTest = new JSONTest("1", "测试" + i, "测试2" + i, "测试3" + i); list1.add(new ExcelTempDemo(i, "test" + i, "test" + i, "这是一个测试" + i, JSONObject.toJSONString(jsonTest), "1", new Date())); } build.write(list1, sheet); sheet.finish(); } // 循环导出到一个sheet(两种写法) // 循环导出到一个sheet WorkbookPathWrite build1 = ExcelWrite.write("D:\\文档\\测试\\").build(); WriteSheet sheet1 = build1.createSheet("Sheet1", ExcelTempDemo.class, dictMap).build(); for (int j = 0; j < 5; j++){ List list1 = new ArrayList<>(); for(int i=j*10000; i< (j+1) * 10000; i++){ JSONTest jsonTest = new JSONTest("1", "测试" + i, "测试2" + i, "测试3" + i); list1.add(new ExcelTempDemo(i, "test" + i, "test" + i, "这是一个测试" + i, JSONObject.toJSONString(jsonTest), "1", new Date())); } build.write(list1, sheet1); } sheet1.finish(); //或者 WriteSheet sheet2 = ExcelWrite.write("D:\\文档\\测试\\").createSheet("Sheet1", ExcelTempDemo.class, dictMap).build(); for (int j = 0; j < 5; j++){ List list1 = new ArrayList<>(); for(int i=j*10000; i< (j+1) * 10000; i++){ JSONTest jsonTest = new JSONTest("1", "测试" + i, "测试2" + i, "测试3" + i); list1.add(new ExcelTempDemo(i, "test" + i, "test" + i, "这是一个测试" + i, JSONObject.toJSONString(jsonTest), "1", new Date())); } build.write(list1, sheet2); } sheet2.finish(); ``` ## 根据数据导出到浏览器