[Office 2010 開發 ] 如何把工作表透過 OpenXML 來複製
在本文中將會介紹及實作下方幾項動作:
- 透過 Open XML SDK 來開啟檔案工作表
- 存取主要的活頁簿
- 存取我們欲複製的工作表
--- 這是我們的來源檔案,即 Book1.xlsx ,其工作表名稱為「 MyData 」
--- 這是我們複製的檔案,檔名為 output.xlsx ,而分別複雜 MyData 工作表 及另一個更名的 CopiedData 工作表
◇ 請先建立一個 Concole Application
◇ 再把 Program.cs 檔更改成如下的程式碼:
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5: using System.IO;
6: using System.Reflection;
7: using DocumentFormat.OpenXml;
8: using DocumentFormat.OpenXml.Packaging;
9: using DocumentFormat.OpenXml.Spreadsheet;
10:
11: namespace CopyWorksheet
12: {
13: class Program
14: {
15: static int tableId = 0;
16:
17: static void Main(string[] args)
18: {
19: // 把 Book1.xlsx 複製到 output.xlsx 中
20: string filename = "output.xlsx";
21: File.Copy("Book1.xlsx", filename, true);
22: CopySheet(filename, "MyData", "CopiedData");
23: }
24:
25: static WorksheetPart GetWorkSheetPart(WorkbookPart workbookPart, string sheetName)
26: {
27: //取得工作表的ID關聯
28: string relId = workbookPart.Workbook.Descendants<Sheet>()
29: .Where(s => s.Name.Value.Equals(sheetName))
30: .First()
31: .Id;
32:
33: return (WorksheetPart)workbookPart.GetPartById(relId);
34: }
35:
36: static void CopySheet(string filename, string sheetName, string clonedSheetName)
37: {
38: // 開啟 活頁簿
39: using (SpreadsheetDocument mySpreadsheet = SpreadsheetDocument.Open(filename, true))
40: {
41: WorkbookPart workbookPart = mySpreadsheet.WorkbookPart;
42: //取得要複製的來源工作表
43: WorksheetPart sourceSheetPart = GetWorkSheetPart(workbookPart, sheetName);
44:
45: //利用 AddPart 來進行複製
46: SpreadsheetDocument tempSheet = SpreadsheetDocument.Create(new MemoryStream(), mySpreadsheet.DocumentType);
47: WorkbookPart tempWorkbookPart = tempSheet.AddWorkbookPart();
48: WorksheetPart tempWorksheetPart = tempWorkbookPart.AddPart<WorksheetPart>(sourceSheetPart);
49:
50: //新增 sheet 並與工作表進行關聯
51: WorksheetPart clonedSheet = workbookPart.AddPart<WorksheetPart>(tempWorksheetPart);
52:
53:
54: int numTableDefParts = sourceSheetPart.GetPartsCountOfType<TableDefinitionPart>();
55: tableId = numTableDefParts;
56:
57: //清除 Table 的定義部份 (Tables 是為唯一的 ID)
58: if (numTableDefParts != 0)
59: FixupTableParts(clonedSheet, numTableDefParts);
60:
61: CleanView(clonedSheet);
62:
63: //新增新的工作表到主要的活頁簿中
64: Sheets sheets = workbookPart.Workbook.GetFirstChild<Sheets>();
65: Sheet copiedSheet = new Sheet();
66: copiedSheet.Name = clonedSheetName;
67: copiedSheet.Id = workbookPart.GetIdOfPart(clonedSheet);
68: copiedSheet.SheetId = (uint)sheets.ChildElements.Count + 1;
69: sheets.Append(copiedSheet);
70:
71: //儲存
72: workbookPart.Workbook.Save();
73: }
74: }
75:
76: static void CleanView(WorksheetPart worksheetPart)
77: {
78: //此部份是將已參照複製的工作表進行移除動作
79: SheetViews views = worksheetPart.Worksheet.GetFirstChild<SheetViews>();
80:
81: if (views != null)
82: {
83: views.Remove();
84: worksheetPart.Worksheet.Save();
85: }
86: }
87:
88: static void FixupTableParts(WorksheetPart worksheetPart, int numTableDefParts)
89: {
90: //每個 Table 都附有一個 ID 及其名稱
91: foreach (TableDefinitionPart tableDefPart in worksheetPart.TableDefinitionParts)
92: {
93: tableId++;
94: tableDefPart.Table.Id = (uint)tableId;
95: tableDefPart.Table.DisplayName = "CopiedTable" + tableId;
96: tableDefPart.Table.Name = "CopiedTable" + tableId;
97: tableDefPart.Table.Save();
98: }
99: }
100: }
101: }
>> 檔案下載:點我下載
>> 參考翻譯及引用:How to Copy a Worksheet within a Workbook