diff --git a/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/controller/McBasicCmtyController.java b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/controller/McBasicCmtyController.java index e494dda..d87024b 100644 --- a/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/controller/McBasicCmtyController.java +++ b/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; import com.chinagas.modules.schsf.domain.vo.McBasicCmtyVo; import com.chinagas.modules.schsf.service.ICommonService; import com.chinagas.modules.schsf.service.IMcBasicCmtyService; +import com.chinagas.modules.schsf.utils.listener.McBasicCmtySheetWriteHandler; import com.chinagas.modules.schsf.utils.listener.McBasicCmtyImportInspection; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -28,6 +29,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -188,8 +190,16 @@ public class McBasicCmtyController extends BaseController { // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 String fileName = URLEncoder.encode("基础数据-户数", "UTF-8").replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); + //测试数据,实际开发中一般查询查询库,调用Service查询获得 + List xllist = new ArrayList<>(); + xllist.add("乡燃"); + xllist.add("城燃"); // 这里需要设置不关闭流 - EasyExcel.write(response.getOutputStream(), McBasicCmty.class).autoCloseStream(Boolean.FALSE).sheet("客户信息列表").doWrite(list); + EasyExcel.write(response.getOutputStream(), McBasicCmty.class) + .registerWriteHandler(new McBasicCmtySheetWriteHandler(xllist, 11)) + .autoCloseStream(Boolean.FALSE) + .sheet("客户信息列表") + .doWrite(list); } catch (Exception e) { // 重置response e.printStackTrace(); diff --git a/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/controller/McBasicMoneyController.java b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/controller/McBasicMoneyController.java index b0dd1eb..48f4995 100644 --- a/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/controller/McBasicMoneyController.java +++ b/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; import com.chinagas.modules.schsf.domain.vo.McBasicMoneyVo; import com.chinagas.modules.schsf.service.ICommonService; import com.chinagas.modules.schsf.service.IMcBasicMoneyService; +import com.chinagas.modules.schsf.utils.listener.McBasicCmtySheetWriteHandler; import com.chinagas.modules.schsf.utils.listener.McBasicMoneyImportInspection; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -31,6 +32,7 @@ import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; import java.sql.SQLIntegrityConstraintViolationException; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -146,8 +148,14 @@ public class McBasicMoneyController extends BaseController { // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 String fileName = URLEncoder.encode("基础数据-金额", "UTF-8").replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); + List xllist = new ArrayList<>(); + xllist.add("乡燃"); + xllist.add("城燃"); // 这里需要设置不关闭流 - EasyExcel.write(response.getOutputStream(), McBasicMoney.class).autoCloseStream(Boolean.FALSE).sheet("客户信息列表") + EasyExcel.write(response.getOutputStream(), McBasicMoney.class) + .registerWriteHandler(new McBasicCmtySheetWriteHandler(xllist, 11)) + .autoCloseStream(Boolean.FALSE) + .sheet("客户信息列表") .doWrite(list); } catch (Exception e) { // 重置response diff --git a/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/listener/McBasicCmtyImportInspection.java b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/listener/McBasicCmtyImportInspection.java index 70125db..f8f24fe 100644 --- a/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/listener/McBasicCmtyImportInspection.java +++ b/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 selectDataList; + private int ls = 0; + + public McBasicCmtySheetWriteHandler(List selectDataList, int ls) { + this.selectDataList = selectDataList; + this.ls = ls; + } + + /** + * 想实现Excel引用其他sheet页数据作为单元格下拉选项值, + * 需要重写该方法 + * + * @param writeWorkbookHolder + * @param writeSheetHolder + */ + @Override + public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { + // 构造下拉选项单元格列的位置,以及下拉选项可选参数值的map集合 + Map> selectParamMap = new HashMap<>(); + selectParamMap.put(ls, selectDataList); // 假设下拉选项放在第一列 + + // 获取第一个sheet页 + Sheet sheet = writeSheetHolder.getCachedSheet(); + // 获取sheet页的数据校验对象 + DataValidationHelper helper = sheet.getDataValidationHelper(); + // 获取工作簿对象,用于创建存放下拉数据的字典sheet数据页 + Workbook workbook = writeWorkbookHolder.getWorkbook(); + + // 迭代索引,用于存放下拉数据的字典sheet命名 + int index = 1; + for (Map.Entry> entry : selectParamMap.entrySet()) { + // 设置存放下拉数据的字典sheet,并把这些sheet隐藏掉,这样用户交互更友好 + String dictSheetName = "dict_hide_sheet" + index; + Sheet dictSheet = workbook.createSheet(dictSheetName); + // 隐藏字典sheet页 + workbook.setSheetHidden(index++, true); + // 创建一个名为“dictSheetName”的名称,指向字典表中的数据区域 + String refers = dictSheetName + "!$A$1:$A$" + (entry.getValue().size() + 1); + Name name = workbook.createName(); + name.setNameName(dictSheetName); + name.setRefersToFormula(refers); + + // 向字典sheet写数据,从第一行开始写 + for (int i = 0; i < entry.getValue().size(); i++) { + Row row = dictSheet.createRow(i); + Cell cell = row.createCell(0); + cell.setCellValue(entry.getValue().get(i)); + } + + // 设置下拉列表覆盖的行数,从第一行开始到最后一行 + CellRangeAddressList infoList = new CellRangeAddressList(1, Short.MAX_VALUE, entry.getKey(), entry.getKey()); + + // 创建下拉列表约束 + DataValidationConstraint constraint = helper.createFormulaListConstraint(dictSheetName); + DataValidation dataValidation = helper.createValidation(constraint, infoList); + sheet.addValidationData(dataValidation); + + index++; + } + } +} diff --git a/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/listener/McBasicMoneyImportInspection.java b/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/listener/McBasicMoneyImportInspection.java index 6a98692..c6df421 100644 --- a/zr-cloud/zr-modules/zr-schsf/src/main/java/com/chinagas/modules/schsf/utils/listener/McBasicMoneyImportInspection.java +++ b/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