|
@@ -0,0 +1,155 @@
|
|
|
+package com.zcxk.rmcp.web;
|
|
|
+
|
|
|
+import com.alibaba.excel.EasyExcel;
|
|
|
+import com.alibaba.excel.ExcelReader;
|
|
|
+import com.alibaba.excel.ExcelWriter;
|
|
|
+import com.alibaba.excel.read.metadata.ReadSheet;
|
|
|
+import com.alibaba.excel.write.metadata.WriteSheet;
|
|
|
+import com.alibaba.excel.write.metadata.fill.FillConfig;
|
|
|
+import com.zcxk.rmcp.core.entity.Community;
|
|
|
+import com.zcxk.rmcp.web.excel.model.CommImportData;
|
|
|
+import com.zcxk.rmcp.web.excel.model.DeviceImportData;
|
|
|
+import org.junit.Test;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author linqingwei
|
|
|
+ * @date 2021-07-22 11:39
|
|
|
+ */
|
|
|
+public class Excel {
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void listFill() {
|
|
|
+ // 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
|
|
|
+ // 填充list 的时候还要注意 模板中{.} 多了个点 表示list
|
|
|
+ String templateFileName = "E:\\test\\deviceTemplate_V2.1.xlsx";
|
|
|
+
|
|
|
+ // 方案1 一下子全部放到内存里面 并填充
|
|
|
+ //String fileName = TestFileUtil.getPath() + "listFill" + System.currentTimeMillis() + ".xlsx";
|
|
|
+ // 这里 会填充到第一个sheet, 然后文件流会自动关闭
|
|
|
+ //EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(data());
|
|
|
+
|
|
|
+ List<Community> list = new ArrayList<>();
|
|
|
+ Community community1 = new Community();
|
|
|
+ community1.setId(1);
|
|
|
+ community1.setName("小区1");
|
|
|
+ list.add(community1);
|
|
|
+ Community community2 = new Community();
|
|
|
+ community2.setId(2);
|
|
|
+ community2.setName("小区2");
|
|
|
+ list.add(community2);
|
|
|
+ // 方案2 分多次 填充 会使用文件缓存(省内存)
|
|
|
+ String fileName = "E:\\test\\test1.xlsx";
|
|
|
+ ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();
|
|
|
+ WriteSheet deviceSheet = EasyExcel.writerSheet("档案管理-批量导入").build();
|
|
|
+ WriteSheet deviceTypeSheet = EasyExcel.writerSheet("设备型号").build();
|
|
|
+ WriteSheet orgSheet = EasyExcel.writerSheet("公司").build();
|
|
|
+ WriteSheet writeSheet = EasyExcel.writerSheet("小区").build();
|
|
|
+ //excelWriter.fill(new ArrayList<DeviceImportData>(), deviceSheet);
|
|
|
+ //excelWriter.fill(new ArrayList<>(), deviceTypeSheet);
|
|
|
+ //excelWriter.fill(new ArrayList<>(), orgSheet);
|
|
|
+ excelWriter.fill(list, writeSheet);
|
|
|
+
|
|
|
+ // 千万别忘记关闭流
|
|
|
+ excelWriter.finish();
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void repeatedRead() {
|
|
|
+
|
|
|
+ String fileName = "E:\\test\\template.xlsx";
|
|
|
+ // 读取全部sheet
|
|
|
+ // 这里需要注意 DemoDataListener的doAfterAllAnalysed 会在每个sheet读取完毕后调用一次。然后所有sheet都会往同一个DemoDataListener里面写
|
|
|
+ //EasyExcel.read(fileName, DeviceImportData.class, new DemoDataListener()).doReadAll();
|
|
|
+
|
|
|
+ // 读取部分sheet
|
|
|
+ //fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
|
|
|
+ ExcelReader excelReader = EasyExcel.read(fileName).build();
|
|
|
+ // 这里为了简单 所以注册了 同样的head 和Listener 自己使用功能必须不同的Listener
|
|
|
+ DemoDataListener demoDataListener = new DemoDataListener();
|
|
|
+
|
|
|
+ ReadSheet readSheet1 =
|
|
|
+ EasyExcel.readSheet(0).head(DeviceImportData.class).headRowNumber(4).registerReadListener(demoDataListener).build();
|
|
|
+ ReadSheet readSheet2 =
|
|
|
+ EasyExcel.readSheet(1).head(CommImportData.class).registerReadListener(new CommDataListener()).build();
|
|
|
+ // 这里注意 一定要把sheet1 sheet2 一起传进去,不然有个问题就是03版的excel 会读取多次,浪费性能
|
|
|
+ excelReader.read(readSheet1, readSheet2);
|
|
|
+ // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
|
|
|
+ excelReader.finish();
|
|
|
+
|
|
|
+ List<DeviceImportData> list = demoDataListener.getData();
|
|
|
+ System.out.println(list);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void templateWrite() {
|
|
|
+ List<DeviceImportData> list = new ArrayList<>();
|
|
|
+ DeviceImportData data1 = new DeviceImportData();
|
|
|
+ data1.setDeviceNo("11111111111");
|
|
|
+ data1.setMeterNo("11111111111");
|
|
|
+ data1.setDeviceTypeName("华旭/LoRaWAN水表/智能水表");
|
|
|
+
|
|
|
+ DeviceImportData data2 = new DeviceImportData();
|
|
|
+ data2.setDeviceNo("2222222222222");
|
|
|
+ data2.setMeterNo("22222222222222");
|
|
|
+ data2.setDeviceTypeName("华旭/LoRaWAN水表/智能水表");
|
|
|
+ list.add(data1);
|
|
|
+ list.add(data2);
|
|
|
+
|
|
|
+ String templateFileName = "E:\\test\\template.xlsx";
|
|
|
+ String fileName = "E:\\test\\test.xlsx";
|
|
|
+ // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
|
|
|
+ EasyExcel.write(fileName, DeviceImportData.class).withTemplate(templateFileName).sheet().doWrite(list);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void complexFill() {
|
|
|
+
|
|
|
+ List<CommImportData> list = new ArrayList<>();
|
|
|
+ CommImportData data1 = new CommImportData();
|
|
|
+ data1.setId(1);
|
|
|
+ data1.setName("测试1");
|
|
|
+ list.add(data1);
|
|
|
+ CommImportData data2 = new CommImportData();
|
|
|
+ data2.setId(2);
|
|
|
+ data2.setName("测试2");
|
|
|
+ list.add(data2);
|
|
|
+
|
|
|
+ List<CommImportData> list1 = new ArrayList<>();
|
|
|
+ CommImportData data3 = new CommImportData();
|
|
|
+ data3.setId(3);
|
|
|
+ data3.setName("测试3");
|
|
|
+ list1.add(data3);
|
|
|
+ // 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
|
|
|
+ // {} 代表普通变量 {.} 代表是list的变量
|
|
|
+ String templateFileName = "E:\\test\\installPlanTemplate20210727.xlsx";
|
|
|
+
|
|
|
+ String fileName = "E:\\test\\test2.xlsx";
|
|
|
+ ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();
|
|
|
+ WriteSheet listheet = EasyExcel.writerSheet("安装计划").build();
|
|
|
+ WriteSheet deviceTypeSheet = EasyExcel.writerSheet("设备型号").build();
|
|
|
+ WriteSheet orgSheet = EasyExcel.writerSheet("公司").build();
|
|
|
+ WriteSheet writeSheet = EasyExcel.writerSheet("小区").build();
|
|
|
+ // 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
|
|
|
+ // forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用
|
|
|
+ // 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
|
|
|
+ // 如果数据量大 list不是最后一行 参照下一个
|
|
|
+ excelWriter.fill(list, deviceTypeSheet);
|
|
|
+ excelWriter.fill(list1, orgSheet);
|
|
|
+ excelWriter.fill(list, writeSheet);
|
|
|
+
|
|
|
+ Map<String,String> map = new HashMap<>();
|
|
|
+ map.put("unit","test");
|
|
|
+ map.put("phone","test1");
|
|
|
+ FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
|
|
|
+ excelWriter.fill(map, fillConfig, listheet);
|
|
|
+ excelWriter.fill(list1, fillConfig, listheet);
|
|
|
+ excelWriter.finish();
|
|
|
+ }
|
|
|
+}
|