Эх сурвалжийг харах

fix:修改导出下载模版冷链设备型号为下拉框选择

黄渊昊 5 сар өмнө
parent
commit
fbf55a9246

+ 1 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/controller/MonitorDeviceController.java

@@ -188,7 +188,7 @@ public class MonitorDeviceController {
      * 导入数据
      */
     @Operation(summary = "导入数据")
-    @GetMapping("/coldchain/monitordevice/import")
+    @PostMapping("/coldchain/monitordevice/import")
     public CommonResult<String> importMonitorDevice(MultipartFile file) {
         monitorDeviceService.importMonitorDevice(file);
         return CommonResult.ok();

+ 92 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/handler/CustomCellWriteHandler.java

@@ -0,0 +1,92 @@
+package vip.xiaonuo.coldchain.modular.monitordevice.handler;
+
+import com.alibaba.excel.write.handler.SheetWriteHandler;
+import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
+import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddressList;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class CustomCellWriteHandler implements SheetWriteHandler {
+
+    /**
+     * 普通下拉数据
+     */
+    private Map<Integer, String[]> map;
+
+
+    /**
+     * 问题属性
+     */
+//    private Map<String, List<String>> probPropsNameArray;
+    public CustomCellWriteHandler(Map<Integer, String[]> map) {
+        this.map = map;
+    }
+
+    @Override
+    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
+
+    }
+
+    @Override
+    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
+        // 获取第一个sheet页
+        Sheet sheet = writeSheetHolder.getCachedSheet();
+        // 获取sheet页的数据校验对象
+        DataValidationHelper helper = sheet.getDataValidationHelper();
+        // 获取工作簿对象,用于创建存放下拉数据的字典sheet数据页
+        Workbook workbook = writeWorkbookHolder.getWorkbook();
+
+        // 普通数据,迭代索引,用于存放下拉数据的字典sheet数据页命名
+        int index = 1;
+        for (Map.Entry<Integer, String[]> entry : map.entrySet()) {
+
+            // 设置存放下拉数据的字典sheet,并把这些sheet隐藏掉,这样用户交互更友好
+            String dictSheetName = "dict_hide_sheet" + index;
+            Sheet dictSheet = workbook.createSheet(dictSheetName);
+            // 隐藏字典sheet页
+            workbook.setSheetHidden(index++, true);
+
+            // 设置下拉列表覆盖的行数,从第一行开始到最后一行,这里注意,Excel行的
+            // 索引是从0开始的,我这边第0行是标题行,第1行开始时数据化,可根据实
+            // 际业务设置真正的数据开始行,如果要设置到最后一行,那么一定注意,
+            // 最后一行的行索引是1048575,千万别写成1048576,不然会导致下拉列表
+            // 失效,出不来
+            CellRangeAddressList infoList = new CellRangeAddressList(1, 1048575, entry.getKey(), entry.getKey());
+            int rowLen = entry.getValue().length;
+            for (int i = 0; i < rowLen; i++) {
+                // 向字典sheet写数据,从第一行开始写,此处可根据自己业务需要,自定
+                // 义从第几行还是写,写的时候注意一下行索引是从0开始的即可
+                dictSheet.createRow(i).createCell(0).setCellValue(entry.getValue()[i]);
+            }
+
+            // 设置关联数据公式,这个格式跟Excel设置有效性数据的表达式是一样的
+            String refers = dictSheetName + "!$A$1:$A$" + entry.getValue().length;
+            Name name = workbook.createName();
+            name.setNameName(dictSheetName);
+            // 将关联公式和sheet页做关联
+            name.setRefersToFormula(refers);
+
+            // 将上面设置好的下拉列表字典sheet页和目标sheet关联起来
+            DataValidationConstraint constraint = helper.createFormulaListConstraint(dictSheetName);
+            setValidation(sheet, helper, constraint, infoList);
+        }
+    }
+
+    /**
+     * 设置验证规则
+     *
+     * @param sheet       sheet对象
+     * @param helper      验证助手
+     * @param constraint  createExplicitListConstraint
+     * @param addressList 验证位置对象
+     */
+    private void setValidation(Sheet sheet, DataValidationHelper helper, DataValidationConstraint constraint, CellRangeAddressList addressList) {
+        DataValidation dataValidation = helper.createValidation(constraint, addressList);
+        dataValidation.createErrorBox("错误提示", "您输入的内容,不符合限制条件");
+        sheet.addValidationData(dataValidation);
+    }
+}

+ 35 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/service/impl/MonitorDeviceServiceImpl.java

@@ -46,6 +46,7 @@ import vip.xiaonuo.coldchain.modular.monitordevice.dto.MonitorDevicePageDto;
 import vip.xiaonuo.coldchain.modular.monitordevice.entity.MonitorDevice;
 import vip.xiaonuo.coldchain.modular.monitordevice.entity.MonitorDeviceTemplate;
 import vip.xiaonuo.coldchain.modular.monitordevice.enums.MonitorDeviceStatusEnum;
+import vip.xiaonuo.coldchain.modular.monitordevice.handler.CustomCellWriteHandler;
 import vip.xiaonuo.coldchain.modular.monitordevice.mapper.MonitorDeviceMapper;
 import vip.xiaonuo.coldchain.modular.monitordevice.param.MonitorDeviceAddParam;
 import vip.xiaonuo.coldchain.modular.monitordevice.param.MonitorDeviceEditParam;
@@ -410,7 +411,7 @@ public class MonitorDeviceServiceImpl extends ServiceImpl<MonitorDeviceMapper, M
     public void downloadTemplate(HttpServletResponse response) {
         String fileName = "冷链设备导入模板";
         String sheetName = "冷链设备导入模板";
-        try {
+        /*try {
 //            ExcelUtil.writeExcel(response, null, fileName, sheetName, MonitorDeviceTemplate.class);
             //表头样式
             WriteCellStyle headWriteCellStyle = new WriteCellStyle();
@@ -432,9 +433,42 @@ public class MonitorDeviceServiceImpl extends ServiceImpl<MonitorDeviceMapper, M
                     .doWrite(new ArrayList<MonitorDeviceTemplate>());
         } catch (Exception e) {
             throw new RuntimeException(e);
+        }*/
+        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+        response.setCharacterEncoding("utf-8");
+        //设置导出文件名
+        String filename = "笼位信息模版";
+
+        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + URLEncoder.encode(fileName, StandardCharsets.UTF_8) + ".xlsx");
+        //模板实体类
+        List<MonitorDeviceTemplate> secondInspProbExcelDTOS = new ArrayList<>();
+        //普通下拉数据
+        Map<Integer, String[]> map = ordinarySelect();
+        try (OutputStream outputStream = response.getOutputStream()) {
+            EasyExcel.write(outputStream, MonitorDeviceTemplate.class)
+                    .registerWriteHandler(new CustomCellWriteHandler(map))
+                    .excelType(ExcelTypeEnum.XLSX)
+                    .sheet(sheetName)
+                    .doWrite(secondInspProbExcelDTOS);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
         }
     }
 
+    /**
+     * 普通下拉数据
+     *
+     * @return
+     */
+    private Map<Integer, String[]> ordinarySelect() {
+        Map<Integer, String[]> map = new HashMap<>();
+
+        List<MonitorDeviceType> list = monitorDeviceTypeService.list();
+        List<String> billingNameList = list.stream().map(MonitorDeviceType::getCode).toList();
+        map.put(0, billingNameList.toArray(new String[0]));
+        return map;
+    }
+
     @Override
     public void importMonitorDevice(MultipartFile file) {
         List<MonitorDeviceTemplate> monitorDeviceTemplateList = null;