# export **Repository Path**: lilin1126/exporte ## Basic Information - **Project Name**: export - **Description**: 一款通用的excel导出功能,继承了poi和jxl两种实现,详细效果看文档,实现的是高版本,低版本可能不兼容 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-04-18 - **Last Updated**: 2023-07-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # POI/JXL导出工具包 # 开发环境 * jdk1.8版本 * poi:5.2.2 * jxl:2.6.12 * 可直接下载:export-X.X.jar引入到工程中 # 实现功能 * poi和jxl的导出功能实现 * 支持多行标题,横向标题合并,标题样式自定义 * 支持字典映射,即:数据是0,要导出对应为:XXX * 支持导出的单元格添加下拉列表(如单元格的字典可选为:A,B,C,D) * 支持拆分成多个Sheet标签 * 支持多个不同的list集合对象列表导出(多个不同对象集合,导出到Excel中) * 通过简单的api和注解实现,并能对数据处理,例如日期的格式化等。 * 支持List的数据格式,但不推荐,用不了注解所带的扩展功能。 * 可实现Content接口,对对象的内容做处理,例如进行复杂的对象中包含list对象或枚举对象或其他对象 # 一、引入方式 * 将jar包引入到项目中 #### maven方式(export-1.0.jar) ##### 1.引入工具包 ```xml com.erhya export 0.0.1-SNAPSHOT system ${basedir}/src/main/resources/lib/export-X.X.jar ``` #### 2.添加依赖,需要poi导出就引入poi的依赖,需要jxl的就引入jxl的依赖 #### 3.非maven项目,引入export-1.0-app.jar # 二、需要掌握包中的内容 * 注解(加在字段上) ```java @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ExportField { /** * 字段加上该注解后,字段值将不使用,该字段将替换为从1开始的计数 * 使用场景:导出的excel中,需要加入序号显示 */ boolean isNo() default false; /** * 仅作为标记,entity中有时在用lombok的注解作为字段注释,可以用这个替换 */ String fieldName() default ""; /** * 导出的单元格的宽度 */ int width() default 18; /** * 当字段为Date类型时,格式化转换 */ String dateFormat() default "yyyy-MM-dd HH:mm:ss"; /** 单元格内容处理(可处理复杂的单元格,例如需要多个字段拼接作为单元格整体)或者特殊数据类型的数据解析 */ Class[] contentHandler() default {}; /** 数据字段为BigDecimal时有效,分别为【小数保留位数】及【四舍五入方式】例如{2,2} */ int[] scale() default {}; } ``` * 工具类入口 ```text 1.poi new PoiExcelTemplate(); 2.jxl new JxlExcelTemplate(); ``` # 具体代码示例 效果一:基本的数据导出(方法:test01) ![对应代码示例test01](img.png) 效果二:添加字典映射和下拉框(方法:test02) ![img_1.png](img_1.png) 效果三:数据太大,分多个表单(方法:test03) * poiExcelTemplate.setFetchSize(300); ![img_2.png](img_2.png) 效果四:多个不同数据列表导出(方法:test04) * 责任链模式实现(每个链条新增一个Sheet表单) ![img_3.png](img_3.png) ![img_4.png](img_4.png) 代码一 ```java package com.erhya.export.temp; import com.erhya.export.poi.JxlExcelTemplate; import com.erhya.export.poi.PoiExcelTemplate; import com.erhya.export.poi.chain.ExcelExecuteChain; import com.erhya.export.poi.chain.jxl.JxlNewSheetExcelExecute; import com.erhya.export.poi.chain.poi.PoiNewSheetExcelExecute; import org.apache.commons.lang3.time.DateUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.math.BigDecimal; import java.util.*; @RestController @RequestMapping("/export") public class TestController { @GetMapping("/test01") public void test01() throws Exception { String[][] title = { {"独占一行标题"}, {"基本信息", "基本信息", "其他行", "其他行", "其他行", "多行标题"}, {"职称", "姓名", "参加工作日期", "备注", "分数", "工作年限"} }; List demos = new ArrayList<>(); int i = 0; while (i < 10) { Demo demo = new Demo(); demo.setId(UUID.randomUUID().toString()); demo.setName("小王" + i); demo.setRemark("备注" + i); demo.setZc(5); demo.setScore(new BigDecimal("89.05")); demo.setJoinDate(DateUtils.parseDate("2021-04-04", "yyyy-MM-dd")); demos.add(demo); i++; } // JxlExcelTemplate excelTemplate = new JxlExcelTemplate<>("导出名称", title, "Sheet名称"); PoiExcelTemplate excelTemplate = new PoiExcelTemplate<>("导出名称", title, "Sheet名称"); excelTemplate.setFetchSize(3); excelTemplate.setCellSelect(true); excelTemplate.put("zc", "1", "等级V1"); excelTemplate.put("zc", "2", "等级V2"); excelTemplate.put("zc", "3", "等级V3"); excelTemplate.put("zc", "4", "等级V4"); excelTemplate.put("zc", "5", "等级V5"); excelTemplate.put("remark", "备注", "这是一个高级备注"); excelTemplate.execute(demos, "zc", "name", "joinDate", "remark", "score", "id"); } @GetMapping("/test02") public void test02() throws Exception { String[][] title = { {"基本信息", "基本信息", "其他行", "其他行", "其他行", "多行标题"}, {"职称", "姓名", "参加工作日期", "备注", "分数", "工作年限"} }; List> data = buildMapData(200); JxlExcelTemplate> carPoiExcelTemplate = new JxlExcelTemplate<>("导出名称211", title, "xxxx"); // PoiExcelTemplate> carPoiExcelTemplate = new PoiExcelTemplate<>("导出名称", title, "xxxx"); carPoiExcelTemplate.setFetchSize(160); carPoiExcelTemplate.put("size", "2", "111111111"); carPoiExcelTemplate.put("size", "3", "22222222222222"); carPoiExcelTemplate.put("size", "4", "3333333333333333"); carPoiExcelTemplate.put("size", "5", "4444444444444444"); carPoiExcelTemplate.put("size", "6", "55555555555555555555"); carPoiExcelTemplate.put("size", "7", "666666666666666666"); carPoiExcelTemplate.execute(data, "name","size","color"); } @GetMapping("/test04") public void test04() throws Exception { String[][] title = { {"第一列标题","第二列标题","第三列标题","第四列标题","第五列标题"}, {"可以独占一行"}, {"占用两列","占用两列","第三行三列","可以少一列,如果你非要这么弄"}, {"序号","姓名","年龄","性别","生日yyyy-MM"}, {"序号","姓名","姓名","姓名","生日yyyy-MM"}, {"序号","姓名","年龄","年龄","年龄"}, {"序号"}, {"序号","序号","序号","反对","反对"}, }; String[][] carTitle = { {"名称","价格"}, }; // 查询数据,从数据库中 List dataList = buildList(1000); List carList = buildCar(300); JxlExcelTemplate poiExcelTemplate = new JxlExcelTemplate<>("此字段无用", title,"人员",false); // 加入字典 poiExcelTemplate.setFetchSize(600); poiExcelTemplate.put("sex", "0", "男"); poiExcelTemplate.put("sex", "1", "女"); poiExcelTemplate.unExecute(dataList, "id","name","age","sex","birthDay"); JxlExcelTemplate carPoiExcelTemplate = new JxlExcelTemplate<>("此字段无用", carTitle, "小汽车",false); carPoiExcelTemplate.setFetchSize(160); carPoiExcelTemplate.put("name", "小三轮1", "三蹦子贴膜0000"); carPoiExcelTemplate.put("name", "小三轮2", "三蹦子贴膜XXXX"); carPoiExcelTemplate.unExecute(carList, "name","price"); // 责任链模式 ExcelExecuteChain mainChain = new ExcelExecuteChain("最终导出名字"); // 添加第一个导出对象 JxlNewSheetExcelExecute chainA = new JxlNewSheetExcelExecute<>(poiExcelTemplate); mainChain.addChain(chainA); // 添加第二个导出对象 JxlNewSheetExcelExecute chainB = new JxlNewSheetExcelExecute<>(carPoiExcelTemplate); mainChain.addChain(chainB); mainChain.executeChain(); } @GetMapping("/test05") public void test05() throws Exception { String[][] title = { {"第一列标题","第二列标题","第三列标题","第四列标题","第五列标题"}, {"可以独占一行"}, {"占用两列","占用两列","第三行三列","可以少一列,如果你非要这么弄"}, {"序号","姓名","年龄","性别","生日yyyy-MM"}, {"序号","姓名","姓名","姓名","生日yyyy-MM"}, {"序号","姓名","年龄","年龄","年龄"}, {"序号"}, {"序号","序号","序号","反对","反对"}, }; String[][] carTitle = { {"名称","价格"}, }; // 查询数据,从数据库中 List dataList = buildList(1000); List carList = buildCar(300); PoiExcelTemplate poiExcelTemplate = new PoiExcelTemplate<>("此字段无用", title,"人员",false); // 加入字典 poiExcelTemplate.setFetchSize(600); poiExcelTemplate.put("sex", "0", "男"); poiExcelTemplate.put("sex", "1", "女"); poiExcelTemplate.unExecute(dataList, "id","name","age","sex","birthDay"); PoiExcelTemplate carPoiExcelTemplate = new PoiExcelTemplate<>("此字段无用", carTitle, "小汽车",false); carPoiExcelTemplate.setFetchSize(160); carPoiExcelTemplate.put("name", "小三轮1", "三蹦子贴膜0000"); carPoiExcelTemplate.put("name", "小三轮2", "三蹦子贴膜XXXX"); carPoiExcelTemplate.unExecute(carList, "name","price"); // 责任链模式 ExcelExecuteChain mainChain = new ExcelExecuteChain("最终导出名字"); // 添加第一个导出对象 PoiNewSheetExcelExecute chainA = new PoiNewSheetExcelExecute<>(poiExcelTemplate); mainChain.addChain(chainA); // 添加第二个导出对象 PoiNewSheetExcelExecute chainB = new PoiNewSheetExcelExecute<>(carPoiExcelTemplate); mainChain.addChain(chainB); mainChain.executeChain(); } /** * 构建数据(从数据库中查询出来) * @return */ private List buildList(Integer dataSize){ List list = new ArrayList<>(); int i = 0; while (i < dataSize){ Person person = new Person(); person.setName(new Random().nextInt() + "名字"); person.setAge(new Random().nextInt(100)); person.setSex(new Random().nextInt(1)); person.setBirthDay(new Date()); list.add(person); i++; } return list; } private List buildCar(Integer dataSize){ List list = new ArrayList<>(); int i = 0; while (i < dataSize){ Car car = new Car(); car.setName("小三轮"+new Random().nextInt(5)); car.setPrice(new Random().nextInt(100000)); list.add(car); i++; } return list; } private List> buildMapData(Integer dataSize){ List> list = new ArrayList<>(); int i = 0; while (i < dataSize){ Map data = new HashMap<>(); data.put("size", new Random().nextInt(100)); data.put("name", new Random().nextInt(200)); data.put("color", "红色"+new Random().nextInt(800)); data.put("color222", "红色"+new Random().nextInt(800)); list.add(data); i++; } return list; } } ```