2016-08-23 19 views
0

複数のExcelシートをC#の1つのExcelドキュメントにマージする際に問題が発生しています。本質的に、複数のシートを備えた1つのワークブック。しかし、これは動作しますC#とOpenXMLを使用してシートをマージするときに同じExcelスタイルを保持

問題はフォーマットとスタイリングを保持していないということです。最初のシートは正しくフォーマットされていますが、同じスタイルをシート全体にコピーしてはいけません。

私はシートをマージし、同じスタイルとフォーマットを維持するのに助けが必要です。シート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); 
          } 
         } 

enter image description here

第一シートを通して

ループは、フォーマットし、その正しいを保持し、完全です。 残りのシートは、書式設定された場所に配置されています。それは同じではありません。

enter image description here

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++; 
} 
+0

いつでも書式設定はパズルの重要な部分です。写真は高く評価されています。現在の(バギー)動作と予想される動作の両方の画像を追加できますか? – Mikegrann

+0

@Mikegrannこんにちは、最初の画像は、ワークシートの最初のシートを示しています。それは同じ書式を保持しており、問題ありません。他のシートはそうではありませんが、書式設定は間違っており、保持されていません。 –

+1

あなたの 'GetCellFormat'メソッドと' InsertCellFormat'メソッドを表示できますか? – petelids

答えて

0

あなたの代わりにこれを行うことができるかどうかはわからないが、私はで参照として範囲を選択し、「PasteSpecial」のOPENXML相当を使用しての角度からこれを攻撃しようとします

How to apply cell style to each cell in new row from previous row

ので

ではなく、個別にフォーマットを取得しようと、セルを作成し、データを記入してからフォーマットをコピー...

:以下

ソースRangeSetを定義します。 https://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.rangeset_members.aspx

CloneNode(true)です。 それをマージしたシートに挿入します。 (これはスタイリングを含む範囲に関するすべてをコピーする必要があるため)。

(免責事項:私はこれをテストする時間がない持っていますが、うまくいけば提案は、代替経路をダウンに役立ちます)

0

私はWorksheet Templateを作成することを検討します。テンプレートを使用して新しいシートを作成する

含むこのような(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は、検索するのに十分なはずです。