diff --git a/core/backend/src/main/java/io/dataease/controller/datafill/DataFillController.java b/core/backend/src/main/java/io/dataease/controller/datafill/DataFillController.java index ded0b2acb1..32ae997834 100644 --- a/core/backend/src/main/java/io/dataease/controller/datafill/DataFillController.java +++ b/core/backend/src/main/java/io/dataease/controller/datafill/DataFillController.java @@ -3,7 +3,6 @@ package io.dataease.controller.datafill; import com.alibaba.excel.EasyExcel; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; -import com.google.gson.Gson; import io.dataease.commons.utils.AuthUtils; import io.dataease.commons.utils.PageUtils; import io.dataease.commons.utils.Pager; @@ -187,28 +186,20 @@ public class DataFillController { @ApiIgnore @PostMapping("/form/{formId}/excel/template") - public void userFillData(@PathVariable String formId, HttpServletResponse response) throws Exception { - try { - response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); - response.setCharacterEncoding("utf-8"); - // 这里URLEncoder.encode可以防止中文乱码 - String fileName = URLEncoder.encode("template", StandardCharsets.UTF_8).replaceAll("\\+", "%20"); - response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); - // 这里需要设置不关闭流 - EasyExcel.write(response.getOutputStream()) - .head(dataFillService.getExcelHead(formId)) - .autoCloseStream(Boolean.FALSE) - .sheet("模板") - .doWrite(new ArrayList()); - } catch (Exception e) { - // 重置response - response.reset(); - response.setContentType("application/json"); - response.setCharacterEncoding("utf-8"); - - ResultHolder resultHolder = ResultHolder.error("get template excel error", e); - response.getWriter().println(new Gson().toJson(resultHolder)); - } + public void getExcelTemplate(@PathVariable String formId, HttpServletResponse response) throws Exception { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + // 这里URLEncoder.encode可以防止中文乱码 + String fileName = URLEncoder.encode("template", StandardCharsets.UTF_8).replaceAll("\\+", "%20"); + response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); + // 这里需要设置不关闭流 + EasyExcel.write(response.getOutputStream()) + .head(dataFillService.getExcelHead(formId)) + .inMemory(true) + .registerWriteHandler(dataFillService.getCommentWriteHandler(formId)) + .autoCloseStream(Boolean.FALSE) + .sheet("模板") + .doWrite(new ArrayList()); } @ApiIgnore diff --git a/core/backend/src/main/java/io/dataease/service/datafill/CommentWriteHandler.java b/core/backend/src/main/java/io/dataease/service/datafill/CommentWriteHandler.java new file mode 100644 index 0000000000..5a82022062 --- /dev/null +++ b/core/backend/src/main/java/io/dataease/service/datafill/CommentWriteHandler.java @@ -0,0 +1,85 @@ +package io.dataease.service.datafill; + +import com.alibaba.excel.write.handler.RowWriteHandler; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteTableHolder; +import io.dataease.plugins.common.dto.datafill.ExtTableField; +import lombok.Getter; +import lombok.Setter; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.Comment; +import org.apache.poi.ss.usermodel.Drawing; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.xssf.usermodel.XSSFClientAnchor; +import org.apache.poi.xssf.usermodel.XSSFRichTextString; + +import java.util.List; + +@Getter +@Setter +public class CommentWriteHandler implements RowWriteHandler { + + private List fields; + + @Override + public void beforeRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Integer rowIndex, Integer relativeRowIndex, Boolean isHead) { + + } + + @Override + public void afterRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) { + + } + + @Override + public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) { + if (isHead) { + Drawing drawingPatriarch = writeSheetHolder.getSheet().createDrawingPatriarch(); + for (int i = 0; i < fields.size(); i++) { + ExtTableField field = fields.get(i); + String required = field.getSettings().isRequired() ? "必填" : ""; + String example = ""; + StringBuilder options = new StringBuilder(); + switch (field.getSettings().getMapping().getType()) { + case datetime: + example = "\n(日期格式: yyyy/MM/dd" + (field.getSettings().isEnableTime() ? " HH:mm:ss" : "") + ")"; + break; + case number: + example = "\n(整形数字)"; + break; + case decimal: + example = "\n(小数数字)"; + break; + case text: + case nvarchar: + if (StringUtils.equalsIgnoreCase("select", field.getType()) && field.getSettings().isMultiple() || StringUtils.equalsIgnoreCase("checkbox", field.getType())) { + example = "\n(多个值使用分号\";\"分割)"; + } else if (StringUtils.equalsIgnoreCase("email", field.getSettings().getInputType())) { + example = "\n(邮箱格式)"; + } else if (StringUtils.equalsIgnoreCase("phone", field.getSettings().getInputType())) { + example = "\n(手机号格式)"; + } + if (StringUtils.equalsIgnoreCase("select", field.getType()) || StringUtils.equalsIgnoreCase("checkbox", field.getType())) { + options = new StringBuilder("\n选项值为:\n"); + for (ExtTableField.Option option : field.getSettings().getOptions()) { + options.append(option.getName()).append("\n"); + } + } + break; + } + + if (StringUtils.isBlank(required) && StringUtils.isBlank(example) && StringUtils.isBlank(options.toString())) { + continue; + } + + Comment comment = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, (short) i + 1, i, (short) i + 7, i + 6)); + comment.setString(new XSSFRichTextString(required + example + options.toString())); + + row.getCell(i).setCellComment(comment); + + } + + + } + } +} \ No newline at end of file diff --git a/core/backend/src/main/java/io/dataease/service/datafill/DataFillService.java b/core/backend/src/main/java/io/dataease/service/datafill/DataFillService.java index 8bafbfde0e..61e6411288 100644 --- a/core/backend/src/main/java/io/dataease/service/datafill/DataFillService.java +++ b/core/backend/src/main/java/io/dataease/service/datafill/DataFillService.java @@ -349,6 +349,29 @@ public class DataFillService { dataFillUserTaskMapper.updateByPrimaryKeySelective(task); } + public CommentWriteHandler getCommentWriteHandler(String formId) { + DataFillFormWithBLOBs dataFillForm = dataFillFormMapper.selectByPrimaryKey(formId); + List formFields = gson.fromJson(dataFillForm.getForms(), new TypeToken>() { + }.getType()); + + List fields = new ArrayList<>(); + for (ExtTableField field : formFields) { + if (StringUtils.equalsIgnoreCase(field.getType(), "dateRange")) { + ExtTableField start = gson.fromJson(gson.toJson(field), ExtTableField.class); + start.getSettings().getMapping().setColumnName(start.getSettings().getMapping().getColumnName1()); + fields.add(start); + + ExtTableField end = gson.fromJson(gson.toJson(field), ExtTableField.class); + end.getSettings().getMapping().setColumnName(end.getSettings().getMapping().getColumnName2()); + fields.add(end); + } else { + fields.add(field); + } + } + CommentWriteHandler commentWriteHandler = new CommentWriteHandler(); + commentWriteHandler.setFields(fields); + return commentWriteHandler; + } public List> getExcelHead(String formId) { List> list = new ArrayList<>(); @@ -358,45 +381,18 @@ public class DataFillService { }.getType()); for (ExtTableField formField : fields) { String name = formField.getSettings().getName(); - String required = formField.getSettings().isRequired() ? "\n必填" : ""; if (StringUtils.equalsIgnoreCase(formField.getType(), "dateRange")) { String name1 = formField.getSettings().getName() + "(开始时间) "; String name2 = formField.getSettings().getName() + "(结束时间) "; - String example = "\n(日期格式: yyyy/MM/dd" + (formField.getSettings().isEnableTime() ? " HH:mm:ss" : "") + ")"; - List head1 = List.of(name1 + required + example); - List head2 = List.of(name2 + required + example); + List head1 = List.of(name1); + List head2 = List.of(name2); list.add(head1); list.add(head2); } else { - String example = ""; - switch (formField.getSettings().getMapping().getType()) { - case datetime: - example = "\n(日期格式: yyyy/MM/dd" + (formField.getSettings().isEnableTime() ? " HH:mm:ss" : "") + ")"; - list.add(List.of(name + required + example)); - break; - case number: - example = "\n(整形数字)"; - list.add(List.of(name + required + example)); - break; - case decimal: - example = "\n(小数数字)"; - list.add(List.of(name + required + example)); - break; - case text: - case nvarchar: - if (StringUtils.equalsIgnoreCase("select", formField.getType()) && formField.getSettings().isMultiple() || StringUtils.equalsIgnoreCase("checkbox", formField.getType())) { - example = "\n(多个值使用分号\";\"分割)"; - } else if (StringUtils.equalsIgnoreCase("email", formField.getSettings().getInputType())) { - example = "\n(邮箱格式)"; - } else if (StringUtils.equalsIgnoreCase("phone", formField.getSettings().getInputType())) { - example = "\n(手机号格式)"; - } - list.add(List.of(name + required + example)); - break; - } + list.add(List.of(name)); } }