Commit 552cb337835ac4879cb2492e389d18d9e0d8b072
1 parent
d1214f18
Exists in
dev
1: 导出模板添加下拉框功能
Showing
5 changed files
with
105 additions
and
2 deletions
Show diff stats
zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/controller/McBasicCmtyController.java
... | ... | @@ -18,6 +18,7 @@ import com.chinagas.modules.schsf.domain.dto.CompanyDto; |
18 | 18 | import com.chinagas.modules.schsf.domain.vo.McBasicCmtyVo; |
19 | 19 | import com.chinagas.modules.schsf.service.ICommonService; |
20 | 20 | import com.chinagas.modules.schsf.service.IMcBasicCmtyService; |
21 | +import com.chinagas.modules.schsf.utils.listener.McBasicCmtySheetWriteHandler; | |
21 | 22 | import com.chinagas.modules.schsf.utils.listener.McBasicCmtyImportInspection; |
22 | 23 | import lombok.extern.slf4j.Slf4j; |
23 | 24 | import org.springframework.beans.factory.annotation.Autowired; |
... | ... | @@ -28,6 +29,7 @@ import javax.servlet.http.HttpServletResponse; |
28 | 29 | import java.io.IOException; |
29 | 30 | import java.io.InputStream; |
30 | 31 | import java.net.URLEncoder; |
32 | +import java.util.ArrayList; | |
31 | 33 | import java.util.HashMap; |
32 | 34 | import java.util.List; |
33 | 35 | import java.util.Map; |
... | ... | @@ -188,8 +190,16 @@ public class McBasicCmtyController extends BaseController { |
188 | 190 | // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 |
189 | 191 | String fileName = URLEncoder.encode("基础数据-户数", "UTF-8").replaceAll("\\+", "%20"); |
190 | 192 | response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); |
193 | + //测试数据,实际开发中一般查询查询库,调用Service查询获得 | |
194 | + List<String> xllist = new ArrayList<>(); | |
195 | + xllist.add("乡燃"); | |
196 | + xllist.add("城燃"); | |
191 | 197 | // 这里需要设置不关闭流 |
192 | - EasyExcel.write(response.getOutputStream(), McBasicCmty.class).autoCloseStream(Boolean.FALSE).sheet("客户信息列表").doWrite(list); | |
198 | + EasyExcel.write(response.getOutputStream(), McBasicCmty.class) | |
199 | + .registerWriteHandler(new McBasicCmtySheetWriteHandler(xllist, 11)) | |
200 | + .autoCloseStream(Boolean.FALSE) | |
201 | + .sheet("客户信息列表") | |
202 | + .doWrite(list); | |
193 | 203 | } catch (Exception e) { |
194 | 204 | // 重置response |
195 | 205 | e.printStackTrace(); | ... | ... |
zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/controller/McBasicMoneyController.java
... | ... | @@ -19,6 +19,7 @@ import com.chinagas.modules.schsf.domain.vo.McBasicCmtyVo; |
19 | 19 | import com.chinagas.modules.schsf.domain.vo.McBasicMoneyVo; |
20 | 20 | import com.chinagas.modules.schsf.service.ICommonService; |
21 | 21 | import com.chinagas.modules.schsf.service.IMcBasicMoneyService; |
22 | +import com.chinagas.modules.schsf.utils.listener.McBasicCmtySheetWriteHandler; | |
22 | 23 | import com.chinagas.modules.schsf.utils.listener.McBasicMoneyImportInspection; |
23 | 24 | import lombok.extern.slf4j.Slf4j; |
24 | 25 | import org.apache.commons.lang3.StringUtils; |
... | ... | @@ -31,6 +32,7 @@ import java.io.IOException; |
31 | 32 | import java.io.InputStream; |
32 | 33 | import java.net.URLEncoder; |
33 | 34 | import java.sql.SQLIntegrityConstraintViolationException; |
35 | +import java.util.ArrayList; | |
34 | 36 | import java.util.HashMap; |
35 | 37 | import java.util.List; |
36 | 38 | import java.util.Map; |
... | ... | @@ -146,8 +148,14 @@ public class McBasicMoneyController extends BaseController { |
146 | 148 | // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 |
147 | 149 | String fileName = URLEncoder.encode("基础数据-金额", "UTF-8").replaceAll("\\+", "%20"); |
148 | 150 | response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); |
151 | + List<String> xllist = new ArrayList<>(); | |
152 | + xllist.add("乡燃"); | |
153 | + xllist.add("城燃"); | |
149 | 154 | // 这里需要设置不关闭流 |
150 | - EasyExcel.write(response.getOutputStream(), McBasicMoney.class).autoCloseStream(Boolean.FALSE).sheet("客户信息列表") | |
155 | + EasyExcel.write(response.getOutputStream(), McBasicMoney.class) | |
156 | + .registerWriteHandler(new McBasicCmtySheetWriteHandler(xllist, 11)) | |
157 | + .autoCloseStream(Boolean.FALSE) | |
158 | + .sheet("客户信息列表") | |
151 | 159 | .doWrite(list); |
152 | 160 | } catch (Exception e) { |
153 | 161 | // 重置response | ... | ... |
zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/listener/McBasicCmtyImportInspection.java
... | ... | @@ -28,6 +28,11 @@ public class McBasicCmtyImportInspection extends AnalysisEventListener<McBasicCm |
28 | 28 | if (StringUtils.isEmpty(mcBasicCmty.getVlgOrCmty())) { |
29 | 29 | throw new RuntimeException(String.format("第%s行 小区/村 为空,请核实", context.readRowHolder().getRowIndex() + 1)); |
30 | 30 | } |
31 | + if (StringUtils.isNotEmpty(mcBasicCmty.getUrbRurCls())) { | |
32 | + if (!mcBasicCmty.getUrbRurCls().equals("乡燃") && !mcBasicCmty.getUrbRurCls().equals("城燃")){ | |
33 | + throw new RuntimeException(String.format("第%s行 城乡分类 请选择‘乡燃’或‘城燃’,请核实", context.readRowHolder().getRowIndex() + 1)); | |
34 | + } | |
35 | + } | |
31 | 36 | } |
32 | 37 | |
33 | 38 | /** | ... | ... |
zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/listener/McBasicCmtySheetWriteHandler.java
0 → 100644
... | ... | @@ -0,0 +1,75 @@ |
1 | +package com.chinagas.modules.schsf.utils.listener; | |
2 | + | |
3 | +import com.alibaba.excel.write.handler.SheetWriteHandler; | |
4 | +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; | |
5 | +import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; | |
6 | +import org.apache.poi.ss.usermodel.*; | |
7 | +import org.apache.poi.ss.util.CellRangeAddressList; | |
8 | + | |
9 | +import java.util.HashMap; | |
10 | +import java.util.List; | |
11 | +import java.util.Map; | |
12 | + | |
13 | +public class McBasicCmtySheetWriteHandler implements SheetWriteHandler { | |
14 | + | |
15 | + private List<String> selectDataList; | |
16 | + private int ls = 0; | |
17 | + | |
18 | + public McBasicCmtySheetWriteHandler(List<String> selectDataList, int ls) { | |
19 | + this.selectDataList = selectDataList; | |
20 | + this.ls = ls; | |
21 | + } | |
22 | + | |
23 | + /** | |
24 | + * 想实现Excel引用其他sheet页数据作为单元格下拉选项值, | |
25 | + * 需要重写该方法 | |
26 | + * | |
27 | + * @param writeWorkbookHolder | |
28 | + * @param writeSheetHolder | |
29 | + */ | |
30 | + @Override | |
31 | + public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { | |
32 | + // 构造下拉选项单元格列的位置,以及下拉选项可选参数值的map集合 | |
33 | + Map<Integer, List<String>> selectParamMap = new HashMap<>(); | |
34 | + selectParamMap.put(ls, selectDataList); // 假设下拉选项放在第一列 | |
35 | + | |
36 | + // 获取第一个sheet页 | |
37 | + Sheet sheet = writeSheetHolder.getCachedSheet(); | |
38 | + // 获取sheet页的数据校验对象 | |
39 | + DataValidationHelper helper = sheet.getDataValidationHelper(); | |
40 | + // 获取工作簿对象,用于创建存放下拉数据的字典sheet数据页 | |
41 | + Workbook workbook = writeWorkbookHolder.getWorkbook(); | |
42 | + | |
43 | + // 迭代索引,用于存放下拉数据的字典sheet命名 | |
44 | + int index = 1; | |
45 | + for (Map.Entry<Integer, List<String>> entry : selectParamMap.entrySet()) { | |
46 | + // 设置存放下拉数据的字典sheet,并把这些sheet隐藏掉,这样用户交互更友好 | |
47 | + String dictSheetName = "dict_hide_sheet" + index; | |
48 | + Sheet dictSheet = workbook.createSheet(dictSheetName); | |
49 | + // 隐藏字典sheet页 | |
50 | + workbook.setSheetHidden(index++, true); | |
51 | + // 创建一个名为“dictSheetName”的名称,指向字典表中的数据区域 | |
52 | + String refers = dictSheetName + "!$A$1:$A$" + (entry.getValue().size() + 1); | |
53 | + Name name = workbook.createName(); | |
54 | + name.setNameName(dictSheetName); | |
55 | + name.setRefersToFormula(refers); | |
56 | + | |
57 | + // 向字典sheet写数据,从第一行开始写 | |
58 | + for (int i = 0; i < entry.getValue().size(); i++) { | |
59 | + Row row = dictSheet.createRow(i); | |
60 | + Cell cell = row.createCell(0); | |
61 | + cell.setCellValue(entry.getValue().get(i)); | |
62 | + } | |
63 | + | |
64 | + // 设置下拉列表覆盖的行数,从第一行开始到最后一行 | |
65 | + CellRangeAddressList infoList = new CellRangeAddressList(1, Short.MAX_VALUE, entry.getKey(), entry.getKey()); | |
66 | + | |
67 | + // 创建下拉列表约束 | |
68 | + DataValidationConstraint constraint = helper.createFormulaListConstraint(dictSheetName); | |
69 | + DataValidation dataValidation = helper.createValidation(constraint, infoList); | |
70 | + sheet.addValidationData(dataValidation); | |
71 | + | |
72 | + index++; | |
73 | + } | |
74 | + } | |
75 | +} | ... | ... |
zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/listener/McBasicMoneyImportInspection.java
... | ... | @@ -21,6 +21,11 @@ public class McBasicMoneyImportInspection extends AnalysisEventListener<McBasicM |
21 | 21 | if (StringUtils.isEmpty(mcBasicMoney.getCompanyCode())) { |
22 | 22 | throw new RuntimeException(String.format("第%s行 公司代码 为空,请核实", context.readRowHolder().getRowIndex() + 1)); |
23 | 23 | } |
24 | + if (StringUtils.isNotEmpty(mcBasicMoney.getUrbRurCls())) { | |
25 | + if (!mcBasicMoney.getUrbRurCls().equals("乡燃") && !mcBasicMoney.getUrbRurCls().equals("城燃")){ | |
26 | + throw new RuntimeException(String.format("第%s行 城乡分类 请选择‘乡燃’或‘城燃’,请核实", context.readRowHolder().getRowIndex() + 1)); | |
27 | + } | |
28 | + } | |
24 | 29 | } |
25 | 30 | |
26 | 31 | @Override | ... | ... |