From cd227c3f4c41bba77bac1cfbbf599a74193fa490 Mon Sep 17 00:00:00 2001 From: walon Date: Wed, 27 Oct 2021 14:44:33 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E9=87=8D=E6=9E=84=E3=80=91=E8=B0=83?= =?UTF-8?q?=E6=95=B4excel=E6=A0=BC=E5=BC=8F=E5=90=8E=E7=9B=B8=E5=BA=94?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BA=86LubanAssistant=E5=AF=B9sheet?= =?UTF-8?q?=E7=9A=84=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source/DataExporters/RawJsonExportor.cs | 1 + .../Source/DataSources/Excel/SheetLoadUtil.cs | 2 +- src/LubanAssistant/AssistantTab.cs | 15 ++-- src/LubanAssistant/ExcelUtil.cs | 77 ++++++++++++------- src/LubanAssistant/LubanAssistant.csproj | 10 ++- 5 files changed, 66 insertions(+), 39 deletions(-) rename src/{LubanAssistant => Luban.Job.Cfg}/Source/DataExporters/RawJsonExportor.cs (99%) diff --git a/src/LubanAssistant/Source/DataExporters/RawJsonExportor.cs b/src/Luban.Job.Cfg/Source/DataExporters/RawJsonExportor.cs similarity index 99% rename from src/LubanAssistant/Source/DataExporters/RawJsonExportor.cs rename to src/Luban.Job.Cfg/Source/DataExporters/RawJsonExportor.cs index 5d31784..d0b26a3 100644 --- a/src/LubanAssistant/Source/DataExporters/RawJsonExportor.cs +++ b/src/Luban.Job.Cfg/Source/DataExporters/RawJsonExportor.cs @@ -1,4 +1,5 @@ using Luban.Job.Cfg.Datas; +using Luban.Job.Cfg.DataSources; using Luban.Job.Cfg.DataVisitors; using Luban.Job.Cfg.Defs; using Luban.Job.Cfg.Utils; diff --git a/src/Luban.Job.Cfg/Source/DataSources/Excel/SheetLoadUtil.cs b/src/Luban.Job.Cfg/Source/DataSources/Excel/SheetLoadUtil.cs index dc6dd17..3e30b75 100644 --- a/src/Luban.Job.Cfg/Source/DataSources/Excel/SheetLoadUtil.cs +++ b/src/Luban.Job.Cfg/Source/DataSources/Excel/SheetLoadUtil.cs @@ -226,7 +226,7 @@ namespace Luban.Job.Cfg.DataSources.Excel return false; } - foreach (var attr in metaStr.Substring(2).Split("&")) + foreach (var attr in metaStr.Substring(2).Split('&')) { if (string.IsNullOrWhiteSpace(attr)) { diff --git a/src/LubanAssistant/AssistantTab.cs b/src/LubanAssistant/AssistantTab.cs index e16bbd3..adb6861 100644 --- a/src/LubanAssistant/AssistantTab.cs +++ b/src/LubanAssistant/AssistantTab.cs @@ -1,4 +1,5 @@ using Luban.Job.Cfg.Datas; +using Luban.Job.Cfg.DataSources; using Luban.Job.Cfg.DataSources.Excel; using Luban.Job.Cfg.Defs; using Luban.Job.Cfg.Utils; @@ -113,7 +114,7 @@ namespace LubanAssistant { var tableDataInfo = LastLoadTableData = await DataLoaderUtil.LoadTableDataAsync(RootDefineFile, InputDataDir, rawSheet.TableName); var title = ExcelUtil.ParseTitles(sheet); - ExcelUtil.FillRecords(sheet, rawSheet.TitleRowCount, title, tableDataInfo); + ExcelUtil.FillRecords(sheet, title, tableDataInfo); MessageBox.Show("加载成功"); } catch (Exception e) @@ -159,7 +160,7 @@ namespace LubanAssistant } } - private void SaveRecords(Func saveTask) + private void SaveRecords(Func saveTask) { Worksheet sheet = Globals.LubanAssistant.Application.ActiveSheet; @@ -182,7 +183,7 @@ namespace LubanAssistant var tableDef = await DataLoaderUtil.LoadTableDefAsync(RootDefineFile, InputDataDir, tableName); var title = ExcelUtil.ParseTitles(sheet); - await saveTask(sheet, rawSheet.TitleRowCount, LastLoadTableData, tableDef, title); + await saveTask(sheet, LastLoadTableData, tableDef, title); } catch (Exception e) { @@ -193,10 +194,10 @@ namespace LubanAssistant private void BtnSaveAllClick(object sender, RibbonControlEventArgs e) { - SaveRecords(async (Worksheet sheet, int titleRowNum, TableDataInfo tableDataInfo, DefTable defTable, Title title) => + SaveRecords(async (Worksheet sheet, TableDataInfo tableDataInfo, DefTable defTable, Title title) => { int usedRowNum = sheet.UsedRange.Rows.Count; - int firstDataRowNum = titleRowNum + 2; + int firstDataRowNum = ExcelUtil.GetTitleRowCount(sheet) + 1; if (firstDataRowNum <= usedRowNum) { var newRecords = ExcelUtil.LoadRecordsInRange(defTable, sheet, title, (sheet.Range[$"A{firstDataRowNum}:A{usedRowNum}"]).EntireRow); @@ -252,10 +253,10 @@ namespace LubanAssistant MessageBox.Show("没有选中的行"); return; } - SaveRecords(async (Worksheet sheet, int titleRowNum, TableDataInfo tableDataInfo, DefTable defTable, Title title) => + SaveRecords(async (Worksheet sheet, TableDataInfo tableDataInfo, DefTable defTable, Title title) => { int usedRowNum = sheet.UsedRange.Rows.Count; - if (titleRowNum + 1 < usedRowNum) + if (ExcelUtil.GetTitleRowCount(sheet) < usedRowNum) { var newRecords = ExcelUtil.LoadRecordsInRange(defTable, sheet, title, selectRange.EntireRow); await ExcelUtil.SaveRecordsAsync(InputDataDir, defTable, GetModifyRecords(LastLoadTableData, newRecords)); diff --git a/src/LubanAssistant/ExcelUtil.cs b/src/LubanAssistant/ExcelUtil.cs index 71d48bf..5261441 100644 --- a/src/LubanAssistant/ExcelUtil.cs +++ b/src/LubanAssistant/ExcelUtil.cs @@ -2,6 +2,7 @@ using Luban.Job.Cfg.DataConverts; using Luban.Job.Cfg.DataExporters; using Luban.Job.Cfg.Datas; +using Luban.Job.Cfg.DataSources; using Luban.Job.Cfg.DataSources.Excel; using Luban.Job.Cfg.DataVisitors; using Luban.Job.Cfg.Defs; @@ -23,7 +24,7 @@ namespace LubanAssistant { public static RawSheet ParseRawSheet(Worksheet sheet, Range toSaveRecordRows) { - if (!ParseMetaAttrs(sheet, out var orientRow, out var titleRows, out var tableName)) + if (!ParseMetaAttrs(sheet, out var orientRow, out var tableName)) { throw new Exception($"meta行不合法"); } @@ -47,12 +48,12 @@ namespace LubanAssistant } cells.Add(rowCell); } - return new RawSheet() { Title = title, TitleRowCount = titleRows, TableName = tableName, Cells = cells }; + return new RawSheet() { Title = title, TableName = tableName, Cells = cells }; } public static RawSheet ParseRawSheetTitleOnly(Worksheet sheet) { - if (!ParseMetaAttrs(sheet, out var orientRow, out var titleRows, out var tableName)) + if (!ParseMetaAttrs(sheet, out var orientRow, out var tableName)) { throw new Exception($"meta行不合法"); } @@ -64,29 +65,17 @@ namespace LubanAssistant Title title = ParseTitles(sheet); var cells = new List>(); - return new RawSheet() { Title = title, TitleRowCount = titleRows, TableName = tableName, Cells = cells }; + return new RawSheet() { Title = title, TableName = tableName, Cells = cells }; } - public static bool ParseMetaAttrs(Worksheet sheet, out bool orientRow, out int titleRows, out string tableName) + public static bool ParseMetaAttrs(Worksheet sheet, out bool orientRow, out string tableName) { - Range metaRow = sheet.Rows[1]; - - var cells = new List(); - for (int i = 1, n = sheet.UsedRange.Columns.Count; i <= n; i++) - { - cells.Add(((Range)metaRow.Cells[1, i]).Value?.ToString()); - } - return SheetLoadUtil.TryParseMeta(cells, out orientRow, out titleRows, out tableName); + string metaStr = ((Range)sheet.Cells[1, 1]).Value?.ToString(); + return SheetLoadUtil.TryParseMeta(metaStr, out orientRow, out tableName); } public static Title ParseTitles(Worksheet sheet) { - int titleRows = 1; - Range c1 = sheet.Cells[2, 1]; - if (c1.MergeCells) - { - titleRows = c1.MergeArea.Count; - } var rootTile = new Title() { FromIndex = 0, @@ -95,13 +84,31 @@ namespace LubanAssistant Root = true, Tags = new Dictionary(), }; - ParseSubTitle(sheet, 2, titleRows + 1, rootTile); + ParseSubTitle(sheet, 1, rootTile); rootTile.ToIndex = rootTile.SubTitleList.Max(t => t.ToIndex); rootTile.Init(); return rootTile; } - private static void ParseSubTitle(Worksheet sheet, int rowIndex, int maxRowIndex, Title title) + private static bool IsSubFieldRow(Range cell) + { + var s = cell.Value?.ToString()?.Trim(); + return s == "##field"; + } + + private static bool IsTypeRow(Range cell) + { + var s = cell.Value?.ToString()?.Trim(); + return s == "##type"; + } + + private static bool IsHeaderRow(Range cell) + { + var s = cell.Value?.ToString()?.Trim(); + return !string.IsNullOrEmpty(s) && s.StartsWith("##"); + } + + private static void ParseSubTitle(Worksheet sheet, int rowIndex, Title title) { Range row = sheet.Rows[rowIndex]; for (int i = title.FromIndex; i <= title.ToIndex; i++) @@ -133,21 +140,37 @@ namespace LubanAssistant } title.AddSubTitle(newSubTitle); } - if (rowIndex < maxRowIndex) + if (rowIndex < sheet.UsedRange.Rows.Count && IsSubFieldRow(sheet.Cells[rowIndex + 1, 1])) { foreach (var subTitle in title.SubTitleList) { - ParseSubTitle(sheet, rowIndex + 1, maxRowIndex, subTitle); + ParseSubTitle(sheet, rowIndex + 1, subTitle); } } } - public static void FillRecords(Worksheet sheet, int titleRowNum, Title title, TableDataInfo tableDataInfo) + public static int GetTitleRowCount(Worksheet sheet) + { + int firstDataRowIndex = 1; + while (true) + { + string tagCellStr = ((Range)sheet.Cells[firstDataRowIndex, 1]).Value?.ToString(); + if (string.IsNullOrEmpty(tagCellStr) || !tagCellStr.StartsWith("##")) + { + break; + } + ++firstDataRowIndex; + } + return firstDataRowIndex - 1; + } + + public static void FillRecords(Worksheet sheet, Title title, TableDataInfo tableDataInfo) { int usedRowNum = sheet.UsedRange.Rows.Count; - if (usedRowNum > titleRowNum + 1) + int firstDataRowIndex = GetTitleRowCount(sheet) + 1; + if (usedRowNum >= firstDataRowIndex) { - Range allDataRange = sheet.Range[sheet.Cells[titleRowNum + 2, 1], sheet.Cells[usedRowNum, sheet.UsedRange.Columns.Count]]; + Range allDataRange = sheet.Range[sheet.Cells[firstDataRowIndex, 1], sheet.Cells[usedRowNum, sheet.UsedRange.Columns.Count]]; allDataRange.ClearContents(); } @@ -190,7 +213,7 @@ namespace LubanAssistant } } - Range recordFillRange = sheet.Range[sheet.Cells[titleRowNum + 2, 1], sheet.Cells[titleRowNum + 1 + dataRangeArray.Count, title.ToIndex + 1]]; + Range recordFillRange = sheet.Range[sheet.Cells[firstDataRowIndex, 1], sheet.Cells[firstDataRowIndex + dataRangeArray.Count - 1, title.ToIndex + 1]]; recordFillRange.Value = resultDataRangeArray; } diff --git a/src/LubanAssistant/LubanAssistant.csproj b/src/LubanAssistant/LubanAssistant.csproj index 885ab19..6a21588 100644 --- a/src/LubanAssistant/LubanAssistant.csproj +++ b/src/LubanAssistant/LubanAssistant.csproj @@ -282,6 +282,9 @@ Source\DataCreators\YamlDataCreator.cs + + Source\DataExporters\RawJsonExportor.cs + Source\DataSources\AbstractDataSource.cs @@ -324,6 +327,9 @@ Source\DataSources\Lua\LuaDataSource.cs + + Source\DataSources\Record.cs + Source\DataSources\Xml\XmlDataSource.cs @@ -402,9 +408,6 @@ Source\Datas\DVector4.cs - - Source\Datas\Record.cs - Source\DataVisitors\IDataActionVisitor.cs @@ -643,7 +646,6 @@ Code - AssistantTab.cs