Сохранять одинаковые стили Excel при слиянии листов с использованием C # и OpenXML

Я получаю проблемы при объединении нескольких листов excel в один документ excel в C #. Так что, по сути, это одна книга с несколькими листами. Однако это работает

Дело в том, что он не сохраняет форматирование и стиль. Первый лист отформатирован правильно, но он копирует тот же самый стиль на всех листах, когда этого не должно быть.

Мне нужна помощь по слиянию листов и сохранению одинаковых стилей и форматирования.

Петля через листы C #

// For each worksheet in the child workbook... foreach (Sheet childSheet in childWorkbookSheets) { // Get a worksheet part for the child worksheet using // it's relationship Id. childWorksheetPart = (WorksheetPart)childWorkbook.WorkbookPart.GetPartById(childSheet.Id); // Add a worksheet part to the merged workbook based on // the child worksheet. mergedWorksheetPart = mergedWorkbookPart.AddPart<WorksheetPart>(childWorksheetPart); //There should be only one worksheet that is set //as the main view. CleanView(mergedWorksheetPart); // Create a Sheet element for the new sheet in the // merged workbook. newMergedSheet = new Sheet(); // Set the Name, Id, and SheetId attributes of the // new Sheet element. newMergedSheet.Name = GenerateWorksheetName(mergedWorkbookSheets, childSheet.Name.Value); newMergedSheet.Id = mergedWorkbookPart.GetIdOfPart(mergedWorksheetPart); newMergedSheet.SheetId = (uint)mergedWorkbookSheets.ChildElements.Count + 1; // Add the new Sheet element to the Sheets element in the // merged workbook. mergedWorkbookSheets.Append(newMergedSheet); // Get the SheetData element of the new worksheet part // in the merged workbook. mergedSheetData = mergedWorksheetPart.Worksheet.GetFirstChild<SheetData>(); if (styleCounter == 0) { mergedWorkbook.WorkbookPart.AddPart<WorkbookStylesPart>(childSharedStylePart); } styleCounter++; // For each row of data... foreach (Row row in mergedSheetData.Elements<Row>()) { // For each cell in the row... foreach (Cell cell in row.Elements<Cell>()) { // If the cell is using a shared string, merge // the string from the child workbook into the merged // workbook. CellFormat cellFormat = cell.StyleIndex != null ? GetCellFormat(mergedWorkbookPart, cell.StyleIndex).CloneNode(true) as CellFormat : new CellFormat(); GetCellFormat(mergedWorkbookPart, cell.StyleIndex); if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString) { ProcessCellSharedString(mergedWorksheetPart, cell, mergedSharedStringTablePart, childSharedStringTablePart); } cell.StyleIndex = InsertCellFormat(mergedWorkbookPart, cellFormat); mergedSheetData.AppendChild(new Cell()); mergedCellformat = GetCellFormat(mergedWorkbookPart, cell.StyleIndex); //cellFormat.ReplaceChild(mergedCellformat,mergedCellformat); //attempt to add styling to the other worksheets mergedCellformat.FillId.Value = (cellFormat.FillId.Value); mergedCellformat.BorderId.Value = (cellFormat.BorderId.Value); mergedCellformat.FontId.Value = (cellFormat.FontId.Value); //mergedCellformat.FormatId = (cellFormat.FormatId.Value); //cellFormat.AppendChild(mergedCellformat); //cellFormat.Append(mergedCellformat); } } 

введите описание изображения здесь

Первый лист является идеальным, он сохраняет форматирование и его правильность. Остальные листы повсеместно форматируются. Это не одно и то же.

введите описание изображения здесь

 private static CellFormat GetCellFormat(WorkbookPart workbookPart, uint styleIndex) { return workbookPart.WorkbookStylesPart.Stylesheet.Elements<CellFormats>().First().Elements<CellFormat>().ElementAt((int)styleIndex); } private static uint InsertCellFormat(WorkbookPart workbookPart, CellFormat cellFormat) { CellFormats cellFormats = workbookPart.WorkbookStylesPart.Stylesheet.Elements<CellFormats>().First(); cellFormats.Append(cellFormat); return (uint)cellFormats.Count++; } 

Я не знаю, если вы можете это сделать, но я попытался бы атаковать это с точки зрения выбора диапазона и использования эквивалента OPENXML для «PasteSpecial», как указано в следующем:

Как применить стиль ячейки к каждой ячейке в новой строке из предыдущей строки

Таким образом, вместо того, чтобы пытаться индивидуально получить формат, создать ячейку, заполнить данные, а затем скопировать формат …

Определите источник RangeSet. https://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.rangeset_members.aspx

CloneNode (true). Затем вставьте это в объединенный лист. (так как это должно копировать все, что касается диапазона, включая стиль).

(Отказ от ответственности: у меня нет времени проверять это, но, надеюсь, предложение помогает по альтернативному пути)

Я бы подумал о создании шаблона рабочего листа .

Создание нового листа с использованием шаблона включает (VBA) код следующим образом:

 'Insert sheet template With ThisWorkbook Set sh = Sheets.Add(Type:=Application.TemplatesPath & shName, _ after:=.Sheets(.Sheets.Count)) End With 

затем просто заполните его необработанными данными (через VBA) .PasteSpecial Paste:=xlPasteValues или присваивание значений непосредственно ячейкам) и назовите его.

Эквиваленты OpenXML для вышеуказанного кода должны быть достаточно легкими для поиска.

  • как разрешить использование функции xsl document () в Excel 2010?
  • Запрос XML-узлов sibling только внутри родительского узла
  • Какая информация содержит документ листа * .xml, который является частью файла .xlsx Excel 2007?
  • Создавать Excel с поддержкой Xml в iphone
  • Есть ли способ установить безопасный контент в файле excel, созданном из js?
  • Коррекция XSD в XML?
  • Формат EXCEL XML не является стандартным?
  • Как обрабатывать необязательные атрибуты XML в VBA?
  • Извлечение XML в Excel
  • Добавление текста в ячейку в файле xlsx OOXML?
  • Экспорт в XML с использованием VBA - Коррекция заголовка
  • Давайте будем гением компьютера.