# 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();
```
## 根据数据导出到浏览器