diff --git a/ConsoleApp1/Program.cs b/ConsoleApp1/Program.cs index 1f80a4af..1ff4e721 100644 --- a/ConsoleApp1/Program.cs +++ b/ConsoleApp1/Program.cs @@ -19,19 +19,20 @@ namespace ConsoleApp1 static void Main(/*string[] args*/) { + const string firstExcelPath = @"D:\excels\excel1.xlsx"; + const string secondExcelPath = @"D:\excels\excel2.xlsx"; + const string resultExcelPath = @"D:\excels\result.xlsx"; - using var firstExcel = SpreadsheetDocument.Open(@"D:\excels\excel1.xlsx", true); - using var secondExcel = SpreadsheetDocument.Open(@"D:\excels\excel2.xlsx", true); + using var firstExcel = SpreadsheetDocument.Open(firstExcelPath, true); + using var secondExcel = SpreadsheetDocument.Open(secondExcelPath, true); - using (var resultExcel = SpreadsheetDocument.Create(@"D:\excels\result.xlsx", + using (var resultExcel = SpreadsheetDocument.Create(resultExcelPath, SpreadsheetDocumentType.Workbook, true)) { var workbookPart = resultExcel.AddWorkbookPart(); workbookPart.Workbook = new Workbook(); - var worksheetPart = workbookPart.AddNewPart(); - worksheetPart.Worksheet = new Worksheet(); var sheets = workbookPart.Workbook.AppendChild(new Sheets()); var sharedStringTablePart = resultExcel.WorkbookPart. @@ -40,25 +41,22 @@ namespace ConsoleApp1 var stylesPart = resultExcel.WorkbookPart. AddNewPart(); - //var sheet = new Sheet() - //{ - // Id = workbookPart.GetIdOfPart(worksheetPart), - // SheetId = 1, - // Name = "Test Sheet" - //}; - //sheets.Append(sheet); workbookPart.Workbook.Save(); } - using (var resultExcel = SpreadsheetDocument.Open(@"D:\excels\result.xlsx", true)) + using (var resultExcel = SpreadsheetDocument.Open(resultExcelPath, true)) { - var resultExcelWorkSheetPart = resultExcel.WorkbookPart. - WorksheetParts.First(); - var resultExcelSheetData = resultExcelWorkSheetPart. - Worksheet.AppendChild(new SheetData()); - foreach (var sheet in firstExcel.WorkbookPart.Workbook.Descendants()) { + // Чтобы писать на новый лист, нужен новый WorkSheetPart, WorkSheet, SheetData и Sheet. + // https://stackoverflow.com/questions/9120544/openxml-multiple-sheets + + var resultExcelWorkSheetPart = resultExcel.WorkbookPart.AddNewPart(); + resultExcelWorkSheetPart.Worksheet = new Worksheet(); + + var resultExcelSheetData = resultExcelWorkSheetPart. + Worksheet.AppendChild(new SheetData()); + var newSheet = new Sheet() { Id = resultExcel.WorkbookPart.GetIdOfPart(resultExcelWorkSheetPart), SheetId = sheet.SheetId.Value, @@ -68,13 +66,18 @@ namespace ConsoleApp1 var firstExcelWorkSheetPart = firstExcel.WorkbookPart. GetPartById(sheet.Id) as WorksheetPart; - var firstExcelRows = firstExcelWorkSheetPart.Worksheet. - Descendants(); // retrieved rows from source + + // Не самая лучшая выборка рядов текущей страницы исходного файла. + // Наверняка для этого есть метод. + var firstExcelRows = firstExcelWorkSheetPart.Worksheet.ChildElements + .FirstOrDefault(w => w.LocalName == "sheetData").ChildElements; // Числовые ячейки хранятся как есть и переносятся без проблем, а вот значения строковых ячеек хранятся // в отдельной таблице. При этом в самой строковой ячейке хранится индекс этой строки в таблице // (чтоб не хранить кучу одинаковых строк в документе. Что-то вроде интернирования строк). // Тут как раз переносится клон этой таблицы из исходного файла в результирующий. + // Разные всяческие Part'ы можно найти тут: + // https://docs.microsoft.com/ru-ru/dotnet/api/documentformat.openxml.packaging.spreadsheetdocument.workbookpart?view=openxml-2.8.1 var firstExcelStringTable = firstExcel.WorkbookPart.GetPartsOfType() .FirstOrDefault().SharedStringTable; @@ -94,17 +97,9 @@ namespace ConsoleApp1 foreach (var row in firstExcelRows) resultExcelSheetData.AppendChild(row.CloneNode(true)); } - - //for (uint i = 1; i < 10; i++) // fills cells fine - //{ - // var row = new Row(); - // row.Append(new Cell { CellValue = new CellValue(i.ToString()) }); - // sheetData.AppendChild(row.CloneNode(true)); - //} } - //resultExcel.Close(); Console.WriteLine("Done. Press any key to quit."); Console.ReadKey(); }