diff --git a/src/LubanAssistant/ExcelUtil.cs b/src/LubanAssistant/ExcelUtil.cs index 06701b8..22ca2f7 100644 --- a/src/LubanAssistant/ExcelUtil.cs +++ b/src/LubanAssistant/ExcelUtil.cs @@ -12,6 +12,7 @@ using System.Linq; using System.Text; using System.Text.Json; using System.Threading.Tasks; +using System.Windows.Forms; namespace LubanAssistant { @@ -32,12 +33,14 @@ namespace LubanAssistant Title title = ParseTitles(sheet); var cells = new List>(); - foreach (Range row in toSaveRecordRows) + var rangeAsArray = (object[,])toSaveRecordRows.Value; + int lowBound0 = rangeAsArray.GetLowerBound(0); + for (int r = lowBound0, n = r + rangeAsArray.GetLength(0); r < n; r++) { var rowCell = new List(); for (int i = title.FromIndex; i <= title.ToIndex; i++) { - rowCell.Add(new Cell(row.Row - 1, i, (row.Cells[1, i + 1] as Range).Value)); + rowCell.Add(new Cell(r - 1, i, rangeAsArray[r, i + 1])); } cells.Add(rowCell); } @@ -90,6 +93,7 @@ namespace LubanAssistant Tags = new Dictionary(), }; ParseSubTitle(sheet, 2, titleRows + 1, rootTile); + rootTile.ToIndex = rootTile.SubTitleList.Max(t => t.ToIndex); rootTile.Init(); return rootTile; } @@ -140,18 +144,32 @@ namespace LubanAssistant int usedRowNum = sheet.UsedRange.Rows.Count; if (usedRowNum > titleRowNum + 1) { - //Range allDataRange = sheet.Range[sheet.Cells[titleRowNum + 1, 1], sheet.Cells[$"A{titleRowNum + 2},A{usedRowNum}"].EntireRow; Range allDataRange = sheet.Range[sheet.Cells[titleRowNum + 2, 1], sheet.Cells[usedRowNum, sheet.UsedRange.Columns.Count]]; allDataRange.ClearContents(); } - int nextRowIndex = titleRowNum + 2; + //int nextRowIndex = titleRowNum + 2; + int totalRowCount = 0; + var dataRangeArray = new List(); foreach (var rec in tableDataInfo.MainRecords) { - var fillVisitor = new FillSheetVisitor(sheet, nextRowIndex); - nextRowIndex += rec.Data.Apply(fillVisitor, title); + var fillVisitor = new FillSheetVisitor(dataRangeArray, title.ToIndex + 1, totalRowCount); + totalRowCount += rec.Data.Apply(fillVisitor, title); } + + object[,] resultDataRangeArray = new object[dataRangeArray.Count, title.ToIndex + 1]; + for (int i = 0; i < dataRangeArray.Count; i++) + { + object[] row = dataRangeArray[i]; + for (int j = 0; j < row.Length; j++) + { + resultDataRangeArray[i, j] = row[j]; + } + } + + Range recordFillRange = sheet.Range[sheet.Cells[titleRowNum + 2, 1], sheet.Cells[titleRowNum + dataRangeArray.Count, title.ToIndex + 1]]; + recordFillRange.Value = resultDataRangeArray; } public static List LoadRecordsInRange(DefTable table, Worksheet sheet, Title title, Range toSaveRecordRows) diff --git a/src/LubanAssistant/FillSheetVisitor.cs b/src/LubanAssistant/FillSheetVisitor.cs index 1bcd7e5..1cf8d3c 100644 --- a/src/LubanAssistant/FillSheetVisitor.cs +++ b/src/LubanAssistant/FillSheetVisitor.cs @@ -13,90 +13,98 @@ namespace LubanAssistant { class FillSheetVisitor : IDataFuncVisitor { - private readonly Worksheet _sheet; - private readonly Range _cells; + private readonly List _cells; + private readonly int _columnSize; private int _startRowIndex; - public FillSheetVisitor(Worksheet sheet, int startRowIndex) + public FillSheetVisitor(List cells, int columnSize, int startRowIndex) { - _sheet = sheet; - _cells = sheet.Cells; + _cells = cells; + _columnSize = columnSize; _startRowIndex = startRowIndex; } - Range Current(Title title) => _cells[_startRowIndex, title.FromIndex + 1] as Range; + void SetTitleValue(Title title, object value) + { + while (_cells.Count <= _startRowIndex) + { + var row = new object[_columnSize]; + _cells.Add(row); + } + _cells[_startRowIndex][title.FromIndex] = value; + } public int Accept(DBool type, Title x) { - Current(x).Value = type.Value; + SetTitleValue(x, type.Value); return 1; } public int Accept(DByte type, Title x) { - Current(x).Value = type.Value; + SetTitleValue(x, type.Value); return 1; } public int Accept(DShort type, Title x) { - Current(x).Value = type.Value; + SetTitleValue(x, type.Value); return 1; } public int Accept(DFshort type, Title x) { - Current(x).Value = type.Value; + SetTitleValue(x, type.Value); return 1; } public int Accept(DInt type, Title x) { - Current(x).Value = type.Value; + SetTitleValue(x, type.Value); return 1; } public int Accept(DFint type, Title x) { - Current(x).Value = type.Value; + SetTitleValue(x, type.Value); return 1; } public int Accept(DLong type, Title x) { - Current(x).Value = type.Value; + SetTitleValue(x, type.Value); return 1; } public int Accept(DFlong type, Title x) { - Current(x).Value = type.Value; + SetTitleValue(x, type.Value); return 1; } public int Accept(DFloat type, Title x) { - Current(x).Value = type.Value; + SetTitleValue(x, type.Value); return 1; } public int Accept(DDouble type, Title x) { - Current(x).Value = type.Value; + SetTitleValue(x, type.Value); return 1; } public int Accept(DEnum type, Title x) { - Current(x).Value = type.StrValue; + SetTitleValue(x, type.StrValue); return 1; } public int Accept(DString type, Title x) { - Current(x).Value = type.Value; + SetTitleValue(x, type.Value); return 1; } @@ -111,7 +119,7 @@ namespace LubanAssistant //{ // throw new Exception($"title:{x.Name}为text类型,至少要占两列"); //} - Current(x).Value = type.Apply(ToExcelStringVisitor.Ins, x.Sep); + SetTitleValue(x, type.Apply(ToExcelStringVisitor.Ins, x.Sep)); //(_cells[_startRowIndex, x.FromIndex + 1] as Range).Value = type.RawValue; return 1; } @@ -129,11 +137,11 @@ namespace LubanAssistant } if (type.ImplType != null) { - Current(typeTitle).Value = type.ImplType.Name; + SetTitleValue(typeTitle, type.ImplType.Name); } else { - Current(typeTitle).Value = DefBean.BEAN_NULL_STR; + SetTitleValue(typeTitle, DefBean.BEAN_NULL_STR); } } else @@ -178,7 +186,7 @@ namespace LubanAssistant } else { - Current(x).Value = type.Apply(ToExcelStringVisitor.Ins, x.Sep); + SetTitleValue(x, type.Apply(ToExcelStringVisitor.Ins, x.Sep)); return 1; } } @@ -205,7 +213,7 @@ namespace LubanAssistant } else { - Current(x).Value = type.Apply(ToExcelStringVisitor.Ins, x.Sep); + SetTitleValue(x, type.Apply(ToExcelStringVisitor.Ins, x.Sep)); return 1; } } @@ -232,47 +240,47 @@ namespace LubanAssistant } else { - Current(x).Value = type.Apply(ToExcelStringVisitor.Ins, x.Sep); + SetTitleValue(x, type.Apply(ToExcelStringVisitor.Ins, x.Sep)); return 1; } } public int Accept(DSet type, Title x) { - Current(x).Value = type.Apply(ToExcelStringVisitor.Ins, x.Sep); + SetTitleValue(x, type.Apply(ToExcelStringVisitor.Ins, x.Sep)); return 1; } public int Accept(DMap type, Title x) { - Current(x).Value = type.Apply(ToExcelStringVisitor.Ins, x.Sep); + SetTitleValue(x, type.Apply(ToExcelStringVisitor.Ins, x.Sep)); return 1; } public int Accept(DVector2 type, Title x) { var v = type.Value; - Current(x).Value = $"{v.X},{v.Y}"; + SetTitleValue(x, $"{v.X},{v.Y}"); return 1; } public int Accept(DVector3 type, Title x) { var v = type.Value; - Current(x).Value = $"{v.X},{v.Y},{v.Z}"; + SetTitleValue(x, $"{v.X},{v.Y},{v.Z}"); return 1; } public int Accept(DVector4 type, Title x) { var v = type.Value; - Current(x).Value = $"{v.X},{v.Y},{v.Z},{v.W}"; + SetTitleValue(x, $"{v.X},{v.Y},{v.Z},{v.W}"); return 1; } public int Accept(DDateTime type, Title x) { - Current(x).Value = type.Time; + SetTitleValue(x, type.Time); return 1; } }