openXMLでシートをコピーしたExcelファイルをOpenXmlSdkToolで見てみると
The relationship 'Rbc3d40956dac4fb9' referenced by attribute 'http://schemas.openxmlformats.org/officeDocument/2006/realationships:id' does not exist.
というエラーが発生しました。
workbook.xml.relsを見てみると
<?xml version="1.0" encoding="UTF-8" standalone="true"?> -<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> <Relationship Target="styles.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Id="rId3"/> <Relationship Target="theme/theme1.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Id="rId2"/> <Relationship Target="worksheets/sheet1.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Id="rId1"/> <Relationship Target="calcChain.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain" Id="rId5"/> <Relationship Target="sharedStrings.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" Id="rId4"/> </Relationships>
追加したはずのシートがありませんでした。
xl\worksheetsの方には2つ目のシートはありました。
以下のサイトを参考にしました。
How to Copy a Worksheet within a Workbook
コードは以下の通りです。
C#
1private static void CopySheet(WorkbookPart workBookPart, string sheetName, string clonedSheetName) 2{ 3 // コピー対象のワークシートを取得 4 WorksheetPart sourceSheetPart = GetWorkSheetPart(workBookPart, sheetName); 5 6 // 一時ドキュメント取得 7 using (SpreadsheetDocument tempSpreadSheet = SpreadsheetDocument.Create(new MemoryStream(), SpreadsheetDocumentType.Workbook)) 8 { 9 // WorkbookPartのコピー 10 WorkbookPart tempWorkBookPart = tempSpreadSheet.AddWorkbookPart(); 11 12 WorksheetPart tempWorkSheetPart = tempWorkBookPart.AddPart<WorksheetPart>(sourceSheetPart); 13 14 WorksheetPart clonedSheet = workBookPart.AddPart<WorksheetPart>(tempWorkSheetPart); 15 16 // テーブルID作成 17 int numTableDefParts = sourceSheetPart.GetPartsCountOfType<TableDefinitionPart>(); 18 19 tableId = numTableDefParts; 20 21 if (numTableDefParts != 0) 22 { 23 // テーブル定義のクリーンアップ 24 FixupTableParts(clonedSheet, numTableDefParts); 25 } 26 27 // フォーカスが当たってるシートが1つのみ存在するのでクリーン 28 CleanView(clonedSheet); 29 30 // シートのコピー 31 Sheets sheets = workBookPart.Workbook.GetFirstChild<Sheets>(); 32 33 Sheet copiedSheet = new Sheet(); 34 35 copiedSheet.Name = clonedSheetName; 36 37 copiedSheet.Id = workBookPart.GetIdOfPart(clonedSheet); 38 39 copiedSheet.SheetId = workBookPart.Workbook.Descendants<Sheet>().LastOrDefault().SheetId + 1; 40 41 sheets.Append(copiedSheet); 42 43 workBookPart.Workbook.Save(); 44 } 45}
ご教示おねがいします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/08 06:34
2016/09/08 09:06