From 7a85fc8b953b375c85a114abb79f56dff630a98b Mon Sep 17 00:00:00 2001 From: canonical Date: Fri, 3 Jan 2025 18:19:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E8=BF=9BTreeTableLayout=EF=BC=8C?= =?UTF-8?q?=E4=BD=BF=E7=94=A8flex=E5=B1=9E=E6=80=A7=E6=9D=A5=E6=8C=87?= =?UTF-8?q?=E5=AE=9A=E5=8F=AF=E6=89=A9=E5=B1=95=E7=9A=84=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nop/core/model/table/tree/TreeCell.java | 36 ++++++ .../model/table/tree/TreeTableLayout.java | 104 ++++++++++++++---- .../codegen/TestDynCodeGenRelation2.java | 36 +++--- .../java/io/nop/ooxml/xlsx/XlsxConstants.java | 2 +- ...bjectLayout.java => ImportBeanLayout.java} | 61 ++++++---- .../xlsx/imp/ImportModelToExportModel.java | 35 ++++-- .../nop/ooxml/templates/simple-data.xpt.xlsx | Bin 9246 -> 9307 bytes .../_vfs/test/test-imp-to-excel.imp.xml | 8 +- nop-sys/model/nop-sys.orm.xlsx | Bin 46235 -> 49016 bytes .../resources/_vfs/nop/schema/excel/imp.xdef | 4 +- 10 files changed, 208 insertions(+), 78 deletions(-) rename nop-ooxml/nop-ooxml-xlsx/src/main/java/io/nop/ooxml/xlsx/imp/{TreeObjectLayout.java => ImportBeanLayout.java} (70%) diff --git a/nop-core/src/main/java/io/nop/core/model/table/tree/TreeCell.java b/nop-core/src/main/java/io/nop/core/model/table/tree/TreeCell.java index fae1cd0a3..de498c6c5 100644 --- a/nop-core/src/main/java/io/nop/core/model/table/tree/TreeCell.java +++ b/nop-core/src/main/java/io/nop/core/model/table/tree/TreeCell.java @@ -45,6 +45,11 @@ public class TreeCell extends AbstractFreezable implements ITreeStructure, ICell private int rowIndex = -1; private int colIndex = -1; + /** + * 如果不为0,则表示允许自动延展。flex表示自动延展时的占比 + */ + private int flex; + /** * 树节点所处的层次,顶层的treeLevel为0,子层加1 */ @@ -69,6 +74,14 @@ public String getFormula() { return null; } + public int getFlex() { + return flex; + } + + public void setFlex(int flex) { + this.flex = flex; + } + public String getComment() { return comment; } @@ -109,6 +122,7 @@ public TreeCell cloneInstance() { ret.colIndex = colIndex; ret.leafIndex = leafIndex; ret.treeLevel = treeLevel; + ret.flex = flex; return ret; } @@ -137,6 +151,18 @@ public void setLeafIndex(int leafIndex) { this.leafIndex = leafIndex; } + public TreeCell getFirstChild() { + if (children == null || children.isEmpty()) + return null; + return children.get(0); + } + + public TreeCell getLastChild() { + if (children == null || children.isEmpty()) + return null; + return children.get(children.size() - 1); + } + public void addChild(TreeCell cell) { Guard.checkArgument(cell.getParent() == null); if (this.children == null) { @@ -185,6 +211,16 @@ public int getRowSpan() { return mergeDown + 1; } + public void setColSpan(int colSpan) { + Guard.positiveInt(colSpan, "colSpan"); + this.mergeAcross = colSpan - 1; + } + + public void setRowSpan(int rowSpan) { + Guard.positiveInt(rowSpan, "rowSpan"); + this.mergeDown = rowSpan - 1; + } + public Object getValue() { return value; } diff --git a/nop-core/src/main/java/io/nop/core/model/table/tree/TreeTableLayout.java b/nop-core/src/main/java/io/nop/core/model/table/tree/TreeTableLayout.java index fffb305ff..402d0daea 100644 --- a/nop-core/src/main/java/io/nop/core/model/table/tree/TreeTableLayout.java +++ b/nop-core/src/main/java/io/nop/core/model/table/tree/TreeTableLayout.java @@ -10,7 +10,6 @@ import io.nop.api.core.exceptions.NopException; import io.nop.core.model.table.IRow; import io.nop.core.model.table.ITable; -import io.nop.core.model.tree.TreeVisitors; import java.util.List; @@ -49,11 +48,16 @@ public TreeCell calcLayout(List cells, boolean bVer) { public void assignToTable(List cells, ITable table) { for (TreeCell cell : cells) { - for (TreeCell c : TreeVisitors.depthFirstIterator(cell, true)) { - if (c.isVirtual()) - continue; - table.setCell(c.getRowIndex(), c.getColIndex(), cell); + if (cell.isVirtual()) { + if (cell.getChildren() != null) + assignToTable(cell.getChildren(), table); + continue; } + + + table.setCell(cell.getRowIndex(), cell.getColIndex(), cell); + if (cell.getChildren() != null) + assignToTable(cell.getChildren(), table); } } @@ -95,7 +99,7 @@ void calcBbox(TreeCell cell) { case right_ver: case left_ver: { int w = maxBboxWidth(children); - int h = sumBboxWidth(children); + int h = sumBboxHeight(children); cell.setMergeDown(Math.max(cell.getMergeDown(), h - 1)); cell.setBboxWidth(cell.getColSpan() + w); cell.setBboxHeight(cell.getRowSpan()); @@ -113,7 +117,7 @@ void calcBbox(TreeCell cell) { case bottom_ver: case top_ver: { int w = maxBboxWidth(children); - int h = sumBboxWidth(children); + int h = sumBboxHeight(children); cell.setMergeAcross(Math.max(cell.getMergeAcross(), w - 1)); cell.setBboxWidth(cell.getColSpan()); cell.setBboxHeight(cell.getRowSpan() + h); @@ -122,17 +126,17 @@ void calcBbox(TreeCell cell) { case hor: { int w = sumBboxWidth(children); int h = maxBboxHeight(children); - cell.setMergeAcross(0); - cell.setMergeDown(0); + cell.setColSpan(w); + cell.setRowSpan(h); cell.setBboxWidth(w); cell.setBboxHeight(h); break; } case ver: { int w = maxBboxWidth(children); - int h = sumBboxWidth(children); - cell.setMergeAcross(0); - cell.setMergeDown(0); + int h = sumBboxHeight(children); + cell.setColSpan(w); + cell.setRowSpan(h); cell.setBboxWidth(w); cell.setBboxHeight(h); break; @@ -191,46 +195,54 @@ void adjustBbox(TreeCell cell, int w, int h) { int bboxWidth = cell.getBboxWidth(); int bboxHeight = cell.getBboxHeight(); + int sumFlex = childrenFlex(cell); cell.setBboxWidth(w); cell.setBboxHeight(h); - switch (cell.getChildPos()) { + TreeCellChildPosition pos = cell.getChildPos(); + if (pos == null) + pos = TreeCellChildPosition.ver; + + switch (pos) { case right_hor: case left_hor: { - // 如果边框宽度增加了,则延展最后一个child - lastChild(children).incWidth(w - bboxWidth); - adjustChildrenHor(children, h); cell.setMergeDown(h - 1); + distributeWidth(children, sumFlex, w - bboxWidth); + adjustChildrenHor(children, h); break; } case right_ver: case left_ver: { - lastChild(children).incHeight(h - bboxHeight); - adjustChildrenVer(children, w - cell.getColSpan()); cell.setMergeDown(h - 1); + distributeHeight(children, sumFlex, h - bboxHeight); + adjustChildrenVer(children, w - cell.getColSpan()); break; } case bottom_hor: case top_hor: { - lastChild(children).incWidth(w - bboxWidth); - adjustChildrenHor(children, h - cell.getRowSpan()); cell.setMergeAcross(w - 1); + distributeWidth(children, sumFlex, w - bboxWidth); + adjustChildrenHor(children, h - cell.getRowSpan()); break; } case bottom_ver: case top_ver: { cell.setMergeAcross(w - 1); - lastChild(children).incHeight(h - bboxHeight); + distributeHeight(children, sumFlex, h - bboxHeight); adjustChildrenVer(children, w); break; } case hor: - lastChild(children).incWidth(w - bboxWidth); + cell.setMergeDown(h - 1); + cell.setMergeAcross(w - 1); + distributeWidth(children, sumFlex, w - bboxWidth); adjustChildrenHor(children, h); break; case ver: - lastChild(children).incHeight(h - bboxHeight); + cell.setMergeDown(h - 1); + cell.setMergeAcross(w - 1); + distributeHeight(children, sumFlex, h - bboxHeight); adjustChildrenVer(children, w); break; default: @@ -238,6 +250,52 @@ void adjustBbox(TreeCell cell, int w, int h) { } } + void distributeWidth(List children, int sumFlex, int deltaWidth) { + if (sumFlex == 0 || deltaWidth <= 0) + return; + + for (TreeCell child : children) { + int flex = child.getFlex(); + if (flex > 0) { + if (flex == sumFlex) { + child.incWidth(deltaWidth); + } else { + int dw = deltaWidth * flex / sumFlex; + child.incWidth(dw); + deltaWidth -= dw; + sumFlex -= flex; + } + } + } + } + + void distributeHeight(List children, int sumFlex, int deltaHeight) { + if (sumFlex == 0 || deltaHeight <= 0) + return; + + for (TreeCell child : children) { + int flex = child.getFlex(); + if (flex > 0) { + if (flex == sumFlex) { + child.incHeight(deltaHeight); + } else { + int dh = deltaHeight * flex / sumFlex; + child.incHeight(dh); + deltaHeight -= dh; + sumFlex -= flex; + } + } + } + } + + int childrenFlex(TreeCell cell) { + int total = 0; + for (TreeCell child : cell.getChildren()) { + total += child.getFlex(); + } + return total; + } + TreeCell lastChild(List children) { return children.get(children.size() - 1); } diff --git a/nop-dyn/nop-dyn-service/src/test/java/io/nop/dyn/service/codegen/TestDynCodeGenRelation2.java b/nop-dyn/nop-dyn-service/src/test/java/io/nop/dyn/service/codegen/TestDynCodeGenRelation2.java index f4fceddeb..04c7d9b8f 100644 --- a/nop-dyn/nop-dyn-service/src/test/java/io/nop/dyn/service/codegen/TestDynCodeGenRelation2.java +++ b/nop-dyn/nop-dyn-service/src/test/java/io/nop/dyn/service/codegen/TestDynCodeGenRelation2.java @@ -83,25 +83,25 @@ public void testOneToManyRelation() { // List items = BeanTool.castBeanToType(response.getData(), List.class); // assertEquals(1, items.size()); - // {deptName=2222, deptUsers=[{userId=7ab81}, {id=dasda2}]} - - Map mapData = new HashMap<>(); - mapData.put("roleKey", "test1"); - mapData.put("roleName", "test1"); - Map deptUserData = new HashMap<>(); - deptUserData.put("id", "1"); - mapData.put("roleUsers", List.of(deptUserData)); - - ApiRequest request = ApiRequest.build(Map.of("data", mapData)); - request.setSelection(FieldSelectionBean.fromProp("roleUsers")); - IGraphQLExecutionContext context = graphQLEngine.newRpcContext(GraphQLOperationType.mutation, - "RoleEntity__save", request); - Object result = FutureHelper.syncGet(graphQLEngine.executeRpcAsync(context)); - System.out.println(result); + // {deptName=2222, deptUsers=[{id=7ab81}, {id=dasda2}]} + + Map mapData = new HashMap<>(); + mapData.put("roleKey", "test1"); + mapData.put("roleName", "test1"); + Map deptUserData = new HashMap<>(); + deptUserData.put("id", "1"); + mapData.put("roleUsers", List.of(deptUserData)); + + ApiRequest request = ApiRequest.build(Map.of("data", mapData)); + request.setSelection(FieldSelectionBean.fromProp("roleUsers.userName")); + IGraphQLExecutionContext context = + graphQLEngine.newRpcContext(GraphQLOperationType.mutation,"RoleEntity__save", request); + ApiResponse response = FutureHelper.syncGet(graphQLEngine.executeRpcAsync(context)); + assertEquals(true, response.isOk()); + List roleUsers = (List)BeanTool.getProperty(response.getData(), "roleUsers"); + assertEquals(1, roleUsers.size()); } - @EnableSnapshot - @Test public void testManyToManyRelation() { testGen(OrmRelationType.m2m); @@ -206,7 +206,7 @@ private void addRelation(OrmRelationType relationType, String relationName, Stri relationMeta.setLeftPropName(leftPropName); relationMeta.setRightPropName(rightPropName); relationMeta.setStatus(1); - relationMeta.setTagsText("pub"); + relationMeta.setTagsText("pub,insertable"); // relationMeta.setMiddleTableName(middleTableName); leftEntity.getRelationMetasForEntity().add(relationMeta); } diff --git a/nop-ooxml/nop-ooxml-xlsx/src/main/java/io/nop/ooxml/xlsx/XlsxConstants.java b/nop-ooxml/nop-ooxml-xlsx/src/main/java/io/nop/ooxml/xlsx/XlsxConstants.java index 0d3c92042..49d98abfe 100644 --- a/nop-ooxml/nop-ooxml-xlsx/src/main/java/io/nop/ooxml/xlsx/XlsxConstants.java +++ b/nop-ooxml/nop-ooxml-xlsx/src/main/java/io/nop/ooxml/xlsx/XlsxConstants.java @@ -14,7 +14,7 @@ public interface XlsxConstants { String SHEET_DATA = "Data"; - String EXT_PROP_XPT_SINGLE_ROW = "xpt:singleRow"; + String EXT_PROP_XPT_SINGLE_COL_LAYOUT = "xpt:singleColLayout"; String EXT_PROP_XPT_LABEL_COL_SIZE = "xpt:labelColSize"; String EXT_PROP_XPT_VALUE_COL_SIZE = "xpt:valueColSize"; diff --git a/nop-ooxml/nop-ooxml-xlsx/src/main/java/io/nop/ooxml/xlsx/imp/TreeObjectLayout.java b/nop-ooxml/nop-ooxml-xlsx/src/main/java/io/nop/ooxml/xlsx/imp/ImportBeanLayout.java similarity index 70% rename from nop-ooxml/nop-ooxml-xlsx/src/main/java/io/nop/ooxml/xlsx/imp/TreeObjectLayout.java rename to nop-ooxml/nop-ooxml-xlsx/src/main/java/io/nop/ooxml/xlsx/imp/ImportBeanLayout.java index 7c67e40a0..4df319073 100644 --- a/nop-ooxml/nop-ooxml-xlsx/src/main/java/io/nop/ooxml/xlsx/imp/TreeObjectLayout.java +++ b/nop-ooxml/nop-ooxml-xlsx/src/main/java/io/nop/ooxml/xlsx/imp/ImportBeanLayout.java @@ -5,6 +5,7 @@ import io.nop.core.model.table.tree.TreeCell; import io.nop.core.model.table.tree.TreeCellChildPosition; import io.nop.core.model.table.tree.TreeTableLayout; +import io.nop.core.reflect.hook.IExtensibleObject; import io.nop.excel.imp.model.ImportFieldModel; import io.nop.excel.imp.model.ImportSheetModel; import io.nop.ooxml.xlsx.XlsxConstants; @@ -13,7 +14,7 @@ import java.util.ArrayList; import java.util.List; -public class TreeObjectLayout { +public class ImportBeanLayout { public static final String STYLE_ID_ROW = "row"; public static final String STYLE_ID_LIST = "list"; public static final String STYLE_ID_SEQ = "seq"; @@ -24,23 +25,25 @@ public class TreeObjectLayout { public static final String STYLE_ID_COL = "col"; public static final String STYLE_ID_FIELD = "field"; public static final String STYLE_ID_AUTO_SEQ = "auto-seq"; + public static final String STYLE_ID_SEQ_VALUE = "seq-value"; + public static final String STYLE_ID_SEPARATOR = "separator"; private final List cells = new ArrayList<>(); public TreeCell init(ImportSheetModel sheetModel) { if (sheetModel.isList()) { - TreeCell cell = buildListCell(sheetModel.getFields(), sheetModel.isNoSeqCol()); + TreeCell cell = buildListCell(sheetModel.getFields(), sheetModel.isNoSeqCol(), isSingleColLayout(sheetModel)); cells.add(cell); } else { - addFields(sheetModel.getFields()); + addFields(sheetModel.getFields(), isSingleColLayout(sheetModel)); } return TreeTableLayout.instance().calcLayout(cells, true); } - private void addFields(List fields) { + private void addFields(List fields, boolean singleColLayout) { for (ImportFieldModel field : fields) { - addField(field); + addField(field, singleColLayout); } } @@ -48,8 +51,15 @@ public List getCells() { return cells; } - private void addField(ImportFieldModel mainField) { + private void addField(ImportFieldModel mainField, boolean singleColLayout) { if (mainField.isList()) { + if (!cells.isEmpty()) { + TreeCell cell = new TreeCell(null); + cell.setStyleId(STYLE_ID_SEPARATOR); + cell.setFlex(1); + cells.add(cell); + } + TreeCell cell = new TreeCell(mainField, TreeCellChildPosition.ver); cell.setStyleId(STYLE_ID_FIELD); @@ -57,20 +67,20 @@ private void addField(ImportFieldModel mainField) { title.setStyleId(STYLE_ID_TITLE); cell.addChild(title); - cell.addChild(buildListCell(mainField.getFields(), mainField.isNoSeqCol())); + cell.addChild(buildListCell(mainField.getFields(), mainField.isNoSeqCol(), isSingleColLayout(mainField))); cells.add(cell); } else if (mainField.hasFields()) { for (ImportFieldModel field : mainField.getFields()) { - addField(field); + addField(field, singleColLayout || isSingleColLayout(field)); } } else { - addSimpleCell(mainField, isSingleRow(mainField)); + addSimpleCell(mainField, singleColLayout || isSingleColLayout(mainField)); } } - private boolean isSingleRow(ImportFieldModel field) { - return ConvertHelper.toPrimitiveBoolean(field.prop_get(XlsxConstants.EXT_PROP_XPT_SINGLE_ROW)); + private boolean isSingleColLayout(IExtensibleObject field) { + return ConvertHelper.toPrimitiveBoolean(field.prop_get(XlsxConstants.EXT_PROP_XPT_SINGLE_COL_LAYOUT)); } private boolean hasSubFields(List fields) { @@ -81,14 +91,17 @@ private boolean hasSubFields(List fields) { return false; } - public void addSimpleCell(Object value, boolean singleRow) { + public void addSimpleCell(Object value, boolean singleColLayout) { TreeCell labelCell = new TreeCell(value); labelCell.setStyleId(STYLE_ID_LABEL); + labelCell.setColSpan(2); TreeCell valueCell = new TreeCell(value); valueCell.setStyleId(STYLE_ID_VALUE); + valueCell.setColSpan(2); + valueCell.setFlex(1); - if (cells.isEmpty() || singleRow || (cells.get(cells.size()-1).getChildren().size()/2) % 2 == 1) { + if (cells.isEmpty() || singleColLayout || (cells.get(cells.size() - 1).getChildren().size() / 2) % 2 == 0) { TreeCell row = new TreeCell(null, TreeCellChildPosition.hor); row.setStyleId(STYLE_ID_ROW); row.addChild(labelCell); @@ -101,7 +114,7 @@ public void addSimpleCell(Object value, boolean singleRow) { } } - public TreeCell buildListCell(List fields, boolean noSeqCol) { + public TreeCell buildListCell(List fields, boolean noSeqCol, boolean singleColLayout) { TreeCell cell = new TreeCell(null); cell.setStyleId(STYLE_ID_LIST); cell.setChildPos(TreeCellChildPosition.hor); @@ -113,24 +126,28 @@ public TreeCell buildListCell(List fields, boolean noSeqCol) { cell.addChild(child); TreeCell child2 = new TreeCell(null); + child2.setFlex(1); child2.setChildPos(TreeCellChildPosition.ver); cell.addChild(child2); - TreeObjectLayout layout = new TreeObjectLayout(); - layout.addFields(fields); + ImportBeanLayout layout = new ImportBeanLayout(); + layout.addFields(fields, singleColLayout); child2.setChildren(layout.cells); } else { boolean addSeqCol = shouldAddSeqCol(noSeqCol, fields); + boolean hasSeqValue = false; if (addSeqCol) { TreeCell col = new TreeCell(null, TreeCellChildPosition.ver); col.setStyleId(STYLE_ID_COL); TreeCell labelCell = new TreeCell(null); labelCell.setStyleId(STYLE_ID_AUTO_SEQ); - TreeCell valueCell = new TreeCell(null); - valueCell.setStyleId(STYLE_ID_VALUE); + TreeCell valueCell = new TreeCell("1"); + valueCell.setStyleId(STYLE_ID_SEQ_VALUE); col.addChild(labelCell); col.addChild(valueCell); cell.addChild(col); + + hasSeqValue = true; } for (ImportFieldModel field : fields) { @@ -139,11 +156,17 @@ public TreeCell buildListCell(List fields, boolean noSeqCol) { TreeCell labelCell = new TreeCell(field); labelCell.setStyleId(STYLE_ID_HEADER); TreeCell valueCell = new TreeCell(field); - valueCell.setStyleId(STYLE_ID_VALUE); + if (!hasSeqValue) { + valueCell.setStyleId(STYLE_ID_SEQ_VALUE); + hasSeqValue = true; + } else { + valueCell.setStyleId(STYLE_ID_VALUE); + } col.addChild(labelCell); col.addChild(valueCell); cell.addChild(col); } + cell.getLastChild().setFlex(1); } return cell; } diff --git a/nop-ooxml/nop-ooxml-xlsx/src/main/java/io/nop/ooxml/xlsx/imp/ImportModelToExportModel.java b/nop-ooxml/nop-ooxml-xlsx/src/main/java/io/nop/ooxml/xlsx/imp/ImportModelToExportModel.java index a20bd065a..db19ea0ef 100644 --- a/nop-ooxml/nop-ooxml-xlsx/src/main/java/io/nop/ooxml/xlsx/imp/ImportModelToExportModel.java +++ b/nop-ooxml/nop-ooxml-xlsx/src/main/java/io/nop/ooxml/xlsx/imp/ImportModelToExportModel.java @@ -22,13 +22,15 @@ import java.util.List; -import static io.nop.ooxml.xlsx.imp.TreeObjectLayout.STYLE_ID_AUTO_SEQ; -import static io.nop.ooxml.xlsx.imp.TreeObjectLayout.STYLE_ID_COL; -import static io.nop.ooxml.xlsx.imp.TreeObjectLayout.STYLE_ID_HEADER; -import static io.nop.ooxml.xlsx.imp.TreeObjectLayout.STYLE_ID_LABEL; -import static io.nop.ooxml.xlsx.imp.TreeObjectLayout.STYLE_ID_SEQ; -import static io.nop.ooxml.xlsx.imp.TreeObjectLayout.STYLE_ID_TITLE; -import static io.nop.ooxml.xlsx.imp.TreeObjectLayout.STYLE_ID_VALUE; +import static io.nop.ooxml.xlsx.imp.ImportBeanLayout.STYLE_ID_AUTO_SEQ; +import static io.nop.ooxml.xlsx.imp.ImportBeanLayout.STYLE_ID_COL; +import static io.nop.ooxml.xlsx.imp.ImportBeanLayout.STYLE_ID_HEADER; +import static io.nop.ooxml.xlsx.imp.ImportBeanLayout.STYLE_ID_LABEL; +import static io.nop.ooxml.xlsx.imp.ImportBeanLayout.STYLE_ID_SEPARATOR; +import static io.nop.ooxml.xlsx.imp.ImportBeanLayout.STYLE_ID_SEQ; +import static io.nop.ooxml.xlsx.imp.ImportBeanLayout.STYLE_ID_SEQ_VALUE; +import static io.nop.ooxml.xlsx.imp.ImportBeanLayout.STYLE_ID_TITLE; +import static io.nop.ooxml.xlsx.imp.ImportBeanLayout.STYLE_ID_VALUE; public class ImportModelToExportModel { private ExcelWorkbook wk; @@ -36,6 +38,7 @@ public class ImportModelToExportModel { private String labelStyle; private String valueStyle; private String titleStyle; + private String seqStyle; private ICache cache = new MapCache<>("import", false); private IEvalScope scope = XLang.newEvalScope(); @@ -47,6 +50,7 @@ public ImportModelToExportModel() { labelStyle = this.getCellStyleId(0, 0); valueStyle = this.getCellStyleId(1, 0); titleStyle = this.getCellStyleId(0, 1); + seqStyle = this.getCellStyleId(0, 2); } String getCellStyleId(int row, int col) { @@ -67,7 +71,7 @@ ExcelSheet buildSheet(ImportSheetModel sheetModel) { sheet.setName(sheetModel.getName()); sheet.setLocation(sheetModel.getLocation()); - TreeObjectLayout layout = new TreeObjectLayout(); + ImportBeanLayout layout = new ImportBeanLayout(); TreeCell rootCell = layout.init(sheetModel); assignToTable(sheet.getTable(), rootCell.getChildren()); @@ -84,7 +88,11 @@ private void assignToTable(ExcelTable table, List cells) { continue; } - ExcelCell ec = (ExcelCell) table.makeCell(cell.getRowIndex(), cell.getColIndex()); + ExcelCell ec = new ExcelCell(); + ec.setMergeAcross(cell.getMergeAcross()); + ec.setMergeDown(cell.getMergeDown()); + table.setCell(cell.getRowIndex(), cell.getColIndex(), ec); + if (STYLE_ID_HEADER.equals(cell.getStyleId())) { ec.setStyleId(labelStyle); ImportFieldModel field = (ImportFieldModel) cell.getValue(); @@ -99,12 +107,17 @@ private void assignToTable(ExcelTable table, List cells) { ec.setStyleId(titleStyle); ImportFieldModel field = (ImportFieldModel) cell.getValue(); ec.setValue(field.getDisplayNameOrName()); - }else if(STYLE_ID_AUTO_SEQ.equals(cell.getStyleId())){ + } else if (STYLE_ID_AUTO_SEQ.equals(cell.getStyleId())) { ec.setStyleId(labelStyle); ec.setValue("序号"); - }else if(STYLE_ID_SEQ.equals(cell.getStyleId())){ + } else if (STYLE_ID_SEQ.equals(cell.getStyleId())) { + ec.setStyleId(seqStyle); + ec.setValue("1"); + } else if (STYLE_ID_SEQ_VALUE.equals(cell.getStyleId())) { ec.setStyleId(valueStyle); ec.setValue("1"); + } else if (STYLE_ID_SEPARATOR.equals(cell.getStyleId())) { + ec.setStyleId(valueStyle); } } } diff --git a/nop-ooxml/nop-ooxml-xlsx/src/main/resources/_vfs/nop/ooxml/templates/simple-data.xpt.xlsx b/nop-ooxml/nop-ooxml-xlsx/src/main/resources/_vfs/nop/ooxml/templates/simple-data.xpt.xlsx index a8d98c64eb3435221f8a8de0aa451143cf0fe3d6..6804e23fa4132fcc4ba5b379c30efffcb1e0a764 100644 GIT binary patch delta 3191 zcmV--42bidNZUxT$_4})@(*m2&ITxdPO!OyLPibUt&Nl!McHif(o*Dr2`GSB+oU^+ z=HI7m`jSkKMw!gC8sEx3oT@ryPCsqB)_9^^G^|fee1c4a_5~}O{vkF0yIxw6X$VRB zlC-R+srgKW`RVNMzfRYTKi)I;XaGPjQnQwFNNigaHSLHvVFT^KQZe2U2~+-mV2goM zQi_^V*|oNVP+)hY>CFit;qSpqHYGUL+gt7z;%Q_j)PUO zZUBh;rfuZ21~rYYNX{R6#>ssPZf~$}Y&iS_crb#-*}Vx&N3ZIdf-}J?c>>V(MEb~o zjBJeGgkWAOy<$=Zv+Wsunf7k46UzNk^X1rQl?!U&p$ z=guO~tRHDc_A5&I4hCwvH+o$+b0P^`_3C!kAvO)3s5kKQ66+N14i%&=ph{GyH^vw_ zvD!g5@dPS$b1>$<a%YElaT`yvv3MC0tvmWCKT`j0063!tPCT6+aM5z?<@5k5cf7< zCr)C;S*3}h?p@XG;hJC^qkwUNoK*GQJ9ZAcQmQIi$%irUfB)barcXzs(Ox>QY*Szs zQ;cLIY^j<}fxmxSMPrP7;7!T3ZDfH@(&MMu#}Ctkbz5Ic84wT}U*I}~HYdc3S{m+S z+sX!JD(egn@aZ;x#J5iJvKJXm5=t{-xN7j3kh@11wyKnnODlFpHsK6$Qu6@$`&zaB zN;BdSoZ)V}Ya?Mz3y8JSDx7*KMn>e%o5ni6*0Ap*8*qV+4z2|5^lH;~(8m&+B>zU@2S>W< zig4A0?lMd^o`4q^Gmr^jOx|7jPdCX5+Iy?XpevaSnv%hC>Inb<|Nj600RR6q&A|%7 zFc1W5&|eAr0ag*|rRl|!2cf?Z+ieomov>LH|K2L(Hg66yLrD;}JWuLYh+P&>2Xgi) z>`8EjyjW|7P&W=GM7{=%S*m;RYM%DHo}A{GS~iq_dm?v(8J}A9pulc`UTKN4iBP0L(OWr1Z@u(Mdg?vsrB4&2kI^9|Su(b} z_IjHjzL>wmZ@zD4NX=f=CA02{tf=5A@ug7ZpmDw*TE zZse4ha@1Iumf1N*N-W>+wst1UEmm|z8C82@3t440eY565;uQm^wHM&bs=Y}1RxP_j z%;VtKU8H{+yna?u8gtQb$2h5ofj!V+4`26SZ zpa1$>uPSg!*}fU|&9)7e6@)-zX&mS=69Dbjl7bw1f6&p;8i4)LiJtii=lq9@?iV}S zcv^w0l(B;rp{5-M<}(OdMI>KB$7$iuKh{ zYDjNIb+p*-$PbcaGV%0p5+`GAd)2O{JSR2DQxqAAoq-ox+j9^<0wC!CxT8suB(WF8 zahwEWe=i73gnfAg2MXL#2ndpKoJ2kVaf8_K`y2#@3J`xKWDZ5OPsMI%K4YX%z^tU} zjs90+t9cemLE)Lta*Ef2W2RH4F><^UiZRsP6sZl=%`R>6PKh>a9c{j~esZnBU?7}a z3NSmAC)YO4oc5(-;akMnk`Gd5gt1#q`cK6{e@|US>%!u@a#^Z3kQQ)l>H^m_As^ai zqhZsT&oHBFUJ?!klSoA~U4Jv^lBP!11*kqeuQ`2i@Z_R{t-5#yg2x>5!N=AyX!eeI zaL=^%Exg^by}oL6IJQ05)Atr8G5Y@Nj*;eS>IvEiNk4$00Y#6Kc7_(g(~!RnkPt>a zf3HCDF|R#$XGPL;1N4E87ip#I4|zjEUDgBH#mG5v0NRyKS@0hwf zOs1%B|3GrOD(RX@^up^S+X_3gL%f9mrh{k|ZzdRxJL1^?Dg(iHu2vzR2;H%s4+ z-9>B%V-ng)xVW~%;A(Mwy-Zx+z4~?Vn18`j-h6vNA@_o5#o)m&TW4GFxBXa(2Au}J zd3gcsA@;5I9}gOQ8#q<8 zB#iP-t4^WeD2N2zC!BCPC7k}lZvHO-laT`ylUXAWlT;h#1^%X{0$Z~`93}yOT}#6- z7=`Zz|3k@ro2L6)gqpu$a$s&tF?jxoxq`ad3}|0L%Fu_WVHe7D{xUDDMz^} z(AIlHF?M_llDQ-}R1nwNO6J3V(QdF|e8)C`voxJz37!e&8E$~F>51r!6ud{8y{%h- z;23I@S!Hy#d$7U2#BVE;!{DnAf)4=Xh{xHdiy}mto243dG&1+<9a>j@1g<0EX&g|= zy8$2`Sj*Il0ky5JOfMdLF33X*Zf|gCZ3O%yc(4nNw|f(qj$YNVQgF#@bpp`NMEb~o z>^c~~3&G|%1|LHT96_I%&f%Vam54scD%xX32QcjZG8zVH8LgxcyicNqdv2b6c3QKR z-cHiB$T0j#I-RN3wpt=pQ87iU%$~uNuj#u5F%I*QwP5vP&zsrK*{rXkS8SK2_pm6J&{xdQ`p|C)IU*IdWq)f?! zydtWxM$u+=o~}yLuX;Y{2LTVkhZi&E93p)fp-n3{D=EsAF1QuI@==sjuI`^}X#l1J zigp9k5*Xfyn;cite~>pRb<7+H+T_?Y{yu=OkYw-Tsj7ziW23Z`xsfGu|?~mIr0&skOOdeZ|+Ajj#(h>&yG; z+8FOxrJBt4-Nc6qoYwxJ?6CpHIGW9LSqe`x%j{P_@silf&ru$KEMgS+L5`AW7DH16 z{&@_V4P(Q|c|*zE!9dOQR&VNNK@@?jUf<3p#I_|;{RVMSVUxn$p^~&EREh4)#ss@w zqIb}Zx|GWFAW#P6aNwTL+$2D5;fE*yHYg5!PjmH(a8@jed8o6azaZ)VagUlhNq3(n z&9Wgv-3U@X!3XVZn$~k7K~9rH!1pcLc^J=K2qy}bc!>f~6`IeZ0ELUCAI|V1FT&-4 ztaiWtMxxZVQ zeE*P?V}hnzlWJ!d>a%|VlaT`yvv3MC0ttQd==af0&pRs?>o=--T130g2TT&h; zlt3$OrP^&te|%p@6H0s#Z6&mAp`>T<^m+dA!|Z6?&Nl#oAffdoZ9?b@#=LC62p`)H zTAZn^Ga_KuZJF;3&epI0rU5b>im^v zLk^4^T>sEMB&)bz-Bj?i0_1BqxVoifwe28OHCFjFQfJTZb6Q z?2_|+`BOG!Lf%OC^*@B+8FO$@{RO_F()Xpr$2V5`3LCwD6PDj#{c*Wsud0&%Nq91v zEYd}^&YzMf%lIOi@a0pqPLtIn=gXWgR)6VyRw=yUzAECNF6n|7D^A&bHu&eKf}?*E zlOQ(VK!Xf`8k~~eo*Qd-{lXU1wB#7pboGEtxNhjoub8m4~;8RkDowon}EWj7~jj_iK05Mz)LhKipS}==Sr&)f`4LE|Ju-G;&e$@ zRiVKsi^tt4*&rF{{R30|NlgeOA3H63`DO|ascb6ZX_1e zUZm85D-~1x+}_lRZievk1_o*JJ{TLU#%(#o)t{dUyTBB7RtJ2yo@L3=g>l) zl{IK|(e0xARQN$mcb%i$HA?pyeKJarFBlT2K42115lG&^`H#8*0096000030|3r?# z3c@fDM1Ljh2Uv@UAZZTj#e?84)OMQ$+ug8P760BwsNUucGtAft#p4mjF`JGbqz%;I z?9Vk4}mfQz@p_|^7bu5bEcYA`)qMbykpmQy8Y2+1*$;mQ ze@pG{+0_F80M88o01W^D0C;RKb98xZWpgfgZEVa}OK;;g5WW}ae-L<=^{`}1hNQ(h zj)4WXK!Kz{ue3zj#8RX{(W$&eZ@ug<>8bZcFa0&e_GffRNtV)Wnnxc=E+I$5nQz|X zxRgN3Z5cw<|2#mTojb=Q}oUCf7XtW)hNsh%mgPXI*|sw%D(&}Y1E04s{}9F!R9XL>4{OVNl@f6YLy zBg&HI5kU$|p(+97%4d4j;;rQgGE+xj1r_qB#K7E?B+e z;yb?8pCH0LSC%yItsBgM;vpwXa>0bO6od{uXDA$3q~rMX^M_Br{HnQ1Tv2xFsJ?l2 zz_Ni9=p@YpO*0A5KdmT)LlYehf2{*Js*d%S|3S}RnCSjzs*R-$m`WKt$0E>f2SS!W z(kdeP7A{tQzCP99bPn~^dCKtJ!@ZaI{rjB}IxBCdAIf3LV>rAie`YJOFTK%Q%iBZxKaN9L&8Se=r&L7z73g zxPB*O0WEDPgb>W`NLj*2slYBt_Xqu7iCSAJl!CI)l7iyB;F#%z9bQadLMw!>mm+n5 zt~C@5J}S}IjHAW(((mOp7z~7aSpnvN@?PG~n19!n&Qs3<^LDVF6~ar5XrHE#^f_Vd zN~hcsN4c_Qx*EyGxc}M)$lT92z^3ispJwF>D+)c7&M!b_(T;^~))}SuUef~3TAWBp%((us<#b{IQVZJB~8)ym+NJ`x!n48 zgaidx|~w7w+rObM5Wi_3U7QBRg8mLwg%~{$>%ZFT-s(!5%(wM|U01>$ZIjK3pkU z5k~nCt06*DDg+6xe`AC*M8X+=iDiEP009600{~D<0|XQRlbr(ylYblb1wGK`^jWid z93}yOUrWO<6vf{KzeCA;o2Ki=3|%KGdvYK+QGAh*+-+seACk;&-`=#{>O}D|Ip_Xz z&LzeCAnWK8tgEz|A(Esh0>!nc)MkcWR*QIwBIlVBtkw!<=m-wY%j>Ix8_KnXC#wxu zUxAAPNjb{R3~jwP6l2G?Ael>oLj`fItzK3I7`zBmf)FSp5Yc4n}LW< zNWllB+1t7U2#%o!3CcT65`w?I9;|eK4s^IJgh48jMZTB+aOc z5%LrKwtRfYRScf|pfh2WH1U|!pDU*L;VySbV_e8*VZTdGrL?IvT+nklx(fz|}fyyk+vY2FXMpk4@$%y8Y_cqXv z`8IEVAy2XXC*~b-yh?BAIH&paf_Mg$UGATMr2GPtkpmR72OmfS1VvYPbCXjdfeC%{ z==a007So000dD000000000000000Hj{QEIsrD5 zu_GrNJ<#X$Spfh5Z~_1T5dZ)H0000000000001nL^CLb1ypu8{BL;{e00000@N5MN diff --git a/nop-ooxml/nop-ooxml-xlsx/src/test/resources/_vfs/test/test-imp-to-excel.imp.xml b/nop-ooxml/nop-ooxml-xlsx/src/test/resources/_vfs/test/test-imp-to-excel.imp.xml index 2598102bd..c86126e7b 100644 --- a/nop-ooxml/nop-ooxml-xlsx/src/test/resources/_vfs/test/test-imp-to-excel.imp.xml +++ b/nop-ooxml/nop-ooxml-xlsx/src/test/resources/_vfs/test/test-imp-to-excel.imp.xml @@ -75,12 +75,12 @@ - - + + - - + + diff --git a/nop-sys/model/nop-sys.orm.xlsx b/nop-sys/model/nop-sys.orm.xlsx index 207520df1b9b92bad8519c43b3eb50ec3bef7426..a831fd5250ec751c0a8cc661e5fc1d3c0b5e6a1e 100644 GIT binary patch delta 10117 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 VRFPkthA;8jm%H!<^|k*~`(NFbvLgTh delta 7357 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 r*AG%GgOYZ#(*JM$V*ORL{wrYi3skF @@ -74,7 +74,7 @@ importDictLabel="!boolean=false" xpt:formatExpr="string" xpt:exportFormula="boolean" xpt:exportFormattedValue="boolean" xpt:rowExtendForSibling="boolean" xpt:colExtendForSibling="boolean" - xpt:labelColSize="int" xpt:valueColSize="int" xpt:singleRow="boolean" + xpt:labelColSize="int" xpt:valueColSize="int" xpt:singleColLayout="boolean" imp:treeChildrenProp="string" imp:treeChildKeyProp="string" imp:treeLevelProp="string" headerRowCount="!int=0" noSeqCol="!boolean=false" >