This commit is contained in:
RB 2024-03-05 21:47:09 +08:00
parent ed2cb1083a
commit e83a3277cc
4 changed files with 40 additions and 31 deletions

2
@rbv

@ -1 +1 @@
Subproject commit f07527b06b21bee5e2bf6b927b733903178c1954
Subproject commit 6e417047e85ea8813744b5d6317ad7b26c10747f

View file

@ -81,8 +81,8 @@ import static com.rebuild.core.service.datareport.TemplateExtractor33.NROW_PREFI
@Slf4j
public class EasyExcelGenerator extends SetUser {
final protected static String DKEY_RECORD_MAIN = ".";
final protected static String DKEY_LIST = DKEY_RECORD_MAIN + "36LIST";
final protected static String REFKEY_RECORD_MAIN = ".";
final protected static String REFKEY_LIST = REFKEY_RECORD_MAIN + "36LIST";
protected File templateFile;
protected Integer writeSheetAt = null;
@ -113,9 +113,9 @@ public class EasyExcelGenerator extends SetUser {
// 记录模板-主记录
Map<String, Object> main = null;
if (datas.containsKey(DKEY_RECORD_MAIN)) {
main = datas.get(DKEY_RECORD_MAIN).get(0);
datas.remove(DKEY_RECORD_MAIN);
if (datas.containsKey(REFKEY_RECORD_MAIN)) {
main = datas.get(REFKEY_RECORD_MAIN).get(0);
datas.remove(REFKEY_RECORD_MAIN);
}
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
@ -126,18 +126,20 @@ public class EasyExcelGenerator extends SetUser {
.registerWriteHandler(new FormulaCellWriteHandler())
.build();
// 一个列表/列表模板
if (datas.size() == 1) {
Object datas35 = datas.values().iterator().next();
excelWriter.fill(datas35, fillConfig, writeSheet);
int datasLen = datas.size();
boolean useRefKeys = datasLen > 1;
if (datasLen == 1) {
String refKey = datas.keySet().iterator().next();
useRefKeys = refKey.startsWith("$");
}
// fix: v3.6 多个列表
else if (datas.size() > 1) {
// fix: v3.6 多个列表 $前缀
if (useRefKeys) {
for (Map.Entry<String, List<Map<String, Object>>> e : datas.entrySet()) {
final String refKey = NROW_PREFIX2 + e.getKey().substring(1);
final List<Map<String, Object>> refDatas = e.getValue();
List<Map<String, Object>> refDatasNew = new ArrayList<>();
List<Map<String, Object>> refDatas2New = new ArrayList<>();
for (Map<String, Object> map : refDatas) {
Map<String, Object> mapNew = new HashMap<>();
for (Map.Entry<String, Object> ee : map.entrySet()) {
@ -145,12 +147,17 @@ public class EasyExcelGenerator extends SetUser {
if (keyNew.startsWith("$") || keyNew.startsWith(".")) keyNew = keyNew.substring(1);
mapNew.put(keyNew, ee.getValue());
}
refDatasNew.add(mapNew);
refDatas2New.add(mapNew);
}
excelWriter.fill(new FillWrapper(refKey, refDatasNew), fillConfig, writeSheet);
excelWriter.fill(new FillWrapper(refKey, refDatas2New), fillConfig, writeSheet);
}
}
// 一个列表/列表模板
else if (datasLen == 1) {
Object datas35 = datas.values().iterator().next();
excelWriter.fill(datas35, fillConfig, writeSheet);
}
// 主记录
if (main != null) {
@ -255,7 +262,7 @@ public class EasyExcelGenerator extends SetUser {
Assert.notNull(record, "No record found : " + recordId);
Map<String, Object> d = buildData(record, varsMapOfMain);
datas.put(DKEY_RECORD_MAIN, Collections.singletonList(d));
datas.put(REFKEY_RECORD_MAIN, Collections.singletonList(d));
}
// 明细
@ -276,7 +283,7 @@ public class EasyExcelGenerator extends SetUser {
detailList.add(buildData(c, varsMapOfDetail));
phNumber++;
}
datas.put(DKEY_RECORD_MAIN + "detail", detailList);
datas.put(REFKEY_RECORD_MAIN + "detail", detailList);
}
// 审批
@ -295,7 +302,7 @@ public class EasyExcelGenerator extends SetUser {
approvalList.add(buildData(c, varsMapOfApproval));
phNumber++;
}
datas.put(DKEY_RECORD_MAIN + "approval", approvalList);
datas.put(REFKEY_RECORD_MAIN + "approval", approvalList);
}
return datas;

View file

@ -65,7 +65,7 @@ public class EasyExcelGenerator33 extends EasyExcelGenerator {
final private List<ID> recordIdMultiple;
private Set<String> inShapeVars;
private Map<String, Object> mdataHolder;
private Map<String, Object> recordMainHolder;
protected EasyExcelGenerator33(File templateFile, ID recordId) {
super(templateFile, recordId);
@ -98,9 +98,9 @@ public class EasyExcelGenerator33 extends EasyExcelGenerator {
String refKey = null;
if (varName.startsWith(NROW_PREFIX) || varName.startsWith(NROW_PREFIX2)) {
if (varName.startsWith(APPROVAL_PREFIX) || varName.startsWith(APPROVAL_PREFIX2)) {
refKey = APPROVAL_PREFIX;
refKey = varName.startsWith(NROW_PREFIX) ? APPROVAL_PREFIX : APPROVAL_PREFIX2;
} else if (varName.startsWith(DETAIL_PREFIX) || varName.startsWith(DETAIL_PREFIX2)) {
refKey = DETAIL_PREFIX;
refKey = varName.startsWith(NROW_PREFIX) ? DETAIL_PREFIX : DETAIL_PREFIX2;
} else {
// 在客户中导出订单下列 AccountId 为订单中引用客户的引用字段
// .AccountId.SalesOrder.SalesOrderName or $AccountId$SalesOrder$SalesOrderName
@ -120,7 +120,9 @@ public class EasyExcelGenerator33 extends EasyExcelGenerator {
}
// 占位字段
if (TemplateExtractor33.isPlaceholder(varName)) continue;
if (TemplateExtractor33.isPlaceholder(varName)) {
continue;
}
// 无效字段
if (fieldName == null) {
log.warn("Invalid field `{}` in template : {}", e.getKey(), templateFile);
@ -155,14 +157,15 @@ public class EasyExcelGenerator33 extends EasyExcelGenerator {
Assert.notNull(record, "No record found : " + recordId);
Map<String, Object> d = buildData(record, varsMapOfMain);
datas.put(DKEY_RECORD_MAIN, Collections.singletonList(d));
mdataHolder = d;
datas.put(REFKEY_RECORD_MAIN, Collections.singletonList(d));
recordMainHolder = d;
}
// 相关记录含明细审批
for (Map.Entry<String, List<String>> e : fieldsOfRefs.entrySet()) {
final String refKey = e.getKey();
final boolean isApproval = refKey.startsWith(APPROVAL_PREFIX);
final boolean isApproval = refKey.startsWith(APPROVAL_PREFIX) || refKey.startsWith(APPROVAL_PREFIX2);
final boolean isDetail = refKey.startsWith(DETAIL_PREFIX) || refKey.startsWith(DETAIL_PREFIX2);
String querySql = baseSql;
if (isApproval) {
@ -170,12 +173,11 @@ public class EasyExcelGenerator33 extends EasyExcelGenerator {
querySql = String.format(querySql, StringUtils.join(e.getValue(), ","),
"createdOn,recordId,state,stepId", "RobotApprovalStep", "recordId");
} else if (refKey.startsWith(DETAIL_PREFIX)) {
Entity de = entity.getDetailEntity();
} else if (isDetail) {
String sortField = templateExtractor33.getSortField(DETAIL_PREFIX);
querySql += " order by " + StringUtils.defaultIfBlank(sortField, "createdOn asc");
Entity de = entity.getDetailEntity();
querySql = String.format(querySql, StringUtils.join(e.getValue(), ","),
de.getPrimaryField().getName(), de.getName(), MetadataHelper.getDetailToMainField(de).getName());
@ -312,7 +314,7 @@ public class EasyExcelGenerator33 extends EasyExcelGenerator {
private File superGenerate() {
File file = super.generate();
if (inShapeVars.isEmpty() || mdataHolder == null) return file;
if (inShapeVars.isEmpty() || recordMainHolder == null) return file;
// v3.6 提取文本框
try (Workbook wb = WorkbookFactory.create(file)) {
@ -324,7 +326,7 @@ public class EasyExcelGenerator33 extends EasyExcelGenerator {
while (matcher.find()) {
String varName = matcher.group(1);
if (StringUtils.isNotBlank(varName)) {
shapeText = shapeText.replace("{" + varName +"}", String.valueOf(mdataHolder.get(varName)));
shapeText = shapeText.replace("{" + varName +"}", String.valueOf(recordMainHolder.get(varName)));
}
}

View file

@ -97,7 +97,7 @@ public class EasyExcelListGenerator extends EasyExcelGenerator {
if (varsMap.containsKey(PH__CURRENTDATETIME)) phValues.put(PH__CURRENTDATETIME, getPhValue(PH__CURRENTDATETIME));
Map<String, List<Map<String, Object>>> datasMap = new HashMap<>();
datasMap.put(DKEY_LIST, datas);
datasMap.put(REFKEY_LIST, datas);
return datasMap;
}