Merge pull request #9436 from ulleo/dev

feat(X-Pack): 数据填报Excel模板字段头增加批注
This commit is contained in:
ulleo 2024-04-29 12:00:04 +08:00 committed by GitHub
commit 1f05f46a0e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 125 additions and 53 deletions

View File

@ -3,7 +3,6 @@ package io.dataease.controller.datafill;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcel;
import com.github.pagehelper.Page; import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.google.gson.Gson;
import io.dataease.commons.utils.AuthUtils; import io.dataease.commons.utils.AuthUtils;
import io.dataease.commons.utils.PageUtils; import io.dataease.commons.utils.PageUtils;
import io.dataease.commons.utils.Pager; import io.dataease.commons.utils.Pager;
@ -187,28 +186,20 @@ public class DataFillController {
@ApiIgnore @ApiIgnore
@PostMapping("/form/{formId}/excel/template") @PostMapping("/form/{formId}/excel/template")
public void userFillData(@PathVariable String formId, HttpServletResponse response) throws Exception { public void getExcelTemplate(@PathVariable String formId, HttpServletResponse response) throws Exception {
try { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8"); // 这里URLEncoder.encode可以防止中文乱码
// 这里URLEncoder.encode可以防止中文乱码 String fileName = URLEncoder.encode("template", StandardCharsets.UTF_8).replaceAll("\\+", "%20");
String fileName = URLEncoder.encode("template", StandardCharsets.UTF_8).replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); // 这里需要设置不关闭流
// 这里需要设置不关闭流 EasyExcel.write(response.getOutputStream())
EasyExcel.write(response.getOutputStream()) .head(dataFillService.getExcelHead(formId))
.head(dataFillService.getExcelHead(formId)) .inMemory(true)
.autoCloseStream(Boolean.FALSE) .registerWriteHandler(dataFillService.getCommentWriteHandler(formId))
.sheet("模板") .autoCloseStream(Boolean.FALSE)
.doWrite(new ArrayList()); .sheet("模板")
} catch (Exception e) { .doWrite(new ArrayList());
// 重置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));
}
} }
@ApiIgnore @ApiIgnore

View File

@ -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<ExtTableField> 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);
}
}
}
}

View File

@ -349,6 +349,29 @@ public class DataFillService {
dataFillUserTaskMapper.updateByPrimaryKeySelective(task); dataFillUserTaskMapper.updateByPrimaryKeySelective(task);
} }
public CommentWriteHandler getCommentWriteHandler(String formId) {
DataFillFormWithBLOBs dataFillForm = dataFillFormMapper.selectByPrimaryKey(formId);
List<ExtTableField> formFields = gson.fromJson(dataFillForm.getForms(), new TypeToken<List<ExtTableField>>() {
}.getType());
List<ExtTableField> 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<List<String>> getExcelHead(String formId) { public List<List<String>> getExcelHead(String formId) {
List<List<String>> list = new ArrayList<>(); List<List<String>> list = new ArrayList<>();
@ -358,45 +381,18 @@ public class DataFillService {
}.getType()); }.getType());
for (ExtTableField formField : fields) { for (ExtTableField formField : fields) {
String name = formField.getSettings().getName(); String name = formField.getSettings().getName();
String required = formField.getSettings().isRequired() ? "\n必填" : "";
if (StringUtils.equalsIgnoreCase(formField.getType(), "dateRange")) { if (StringUtils.equalsIgnoreCase(formField.getType(), "dateRange")) {
String name1 = formField.getSettings().getName() + "(开始时间) "; String name1 = formField.getSettings().getName() + "(开始时间) ";
String name2 = formField.getSettings().getName() + "(结束时间) "; String name2 = formField.getSettings().getName() + "(结束时间) ";
String example = "\n(日期格式: yyyy/MM/dd" + (formField.getSettings().isEnableTime() ? " HH:mm:ss" : "") + ")";
List<String> head1 = List.of(name1 + required + example); List<String> head1 = List.of(name1);
List<String> head2 = List.of(name2 + required + example); List<String> head2 = List.of(name2);
list.add(head1); list.add(head1);
list.add(head2); list.add(head2);
} else { } else {
String example = ""; list.add(List.of(name));
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;
}
} }
} }