[Office 2010 開發 ] 如何使用 OpenXML 把 Excel 中的圖表匯到 Word 中
在本文中將會介紹及實作下方幾項動作:
- 先建立一個含有「內容控制項」的 Word 文件以當成範本內容
- 利用 Open XML SDK 來開啟 Word 及 Excel 以利進行相關操作
- 透過「內容控制項」來判別成 Word 文件插入圖表的依據
- 然後開啟 Excel 並把 Excel 中的圖表進行複製作業
- 給定讓圖表的 ID 及 Name 值
- 複製到 Word 的 「內容控制項」 中
- 存檔
>> 這是來源檔案 ( Excel 檔 ),內含一個圖表
>> 然後我們建立一個 Word 樣版檔案,其中 設立一個「內容控制項」以利嵌入 Excel 中的圖表
>> 這就最後嵌入完成之後的 Word 檔案。
☆ 程式部份
◇ 請先建立一個 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 DocumentFormat.OpenXml.Packaging;
7: using DocumentFormat.OpenXml.Wordprocessing;
8: using d = DocumentFormat.OpenXml.Drawing;
9: using DocumentFormat.OpenXml.Drawing.Charts;
10: using wp = DocumentFormat.OpenXml.Drawing.Wordprocessing;
11: using DocumentFormat.OpenXml.Drawing.Spreadsheet;
12: 13: 14: namespace ImportChartFromExcelToWord
15: { 16: class Program
17: { 18: static void Main(string[] args)
19: { 20: //設定變數:
21: //檔案匯出(output.docx) 及 來源檔案(chart.xlsx) 和樣版檔案(template.docx)
22: string outputDoc = "output.docx";
23: File.Copy("template.docx", outputDoc, true);
24: ImportChartFromSpreadsheet("chart.xlsx", outputDoc);
25: } 26: 27: static void ImportChartFromSpreadsheet(string spreadsheetFileName, string wordFileName)
28: { 29: //開啟 Word 檔案
30: using (WordprocessingDocument myWordDoc = WordprocessingDocument.Open(wordFileName, true))
31: { 32: //尋找內容控制項以放入圖表
33: MainDocumentPart mainPart = myWordDoc.MainDocumentPart; 34: SdtBlock sdt = mainPart.Document.Descendants<SdtBlock>().Where( 35: s => s.SdtProperties.GetFirstChild<Alias>().Val.Value.Equals("Chart1")).First();
36: 37: Paragraph p = sdt.SdtContentBlock.GetFirstChild<Paragraph>(); 38: p.RemoveAllChildren(); 39: 40: //建立一個新的嵌入圖像物件執行個體
41: Run r = new Run();
42: p.Append(r); 43: Drawing drawing = new Drawing();
44: r.Append(drawing); 45: 46: //透過樣版文件檔案以利嵌入作業
47: wp.Inline inline = new wp.Inline(
48: new wp.Extent()
49: { Cx = 5486400, Cy = 3200400 }); 50: 51: //開啟 Excel 檔案
52: using (SpreadsheetDocument mySpreadsheet = SpreadsheetDocument.Open(spreadsheetFileName, true))
53: { 54: //取得所適切的內容
55: WorkbookPart workbookPart = mySpreadsheet.WorkbookPart; 56: WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById("rId1");
57: DrawingsPart drawingPart = worksheetPart.DrawingsPart; 58: ChartPart chartPart = (ChartPart)drawingPart.GetPartById("rId1");
59: 60: //複製圖表並新增至 Word 檔案中
61: ChartPart importedChartPart = mainPart.AddPart<ChartPart>(chartPart); 62: string relId = mainPart.GetIdOfPart(importedChartPart);
63: 64: //該架構項目中包含圖表的相關資訊
65: GraphicFrame frame = drawingPart.WorksheetDrawing.Descendants<GraphicFrame>().First(); 66: string chartName = frame.NonVisualGraphicFrameProperties.NonVisualDrawingProperties.Name;
67: 68: //複製該截點以新增至 Word 檔案裡
69: d.Graphic clonedGraphic = (d.Graphic)frame.Graphic.CloneNode(true);
70: ChartReference c = clonedGraphic.GraphicData.GetFirstChild<ChartReference>(); 71: c.Id = relId; 72: 73: //給定圖表一個唯一的 ID 及名稱
74: wp.DocProperties docPr = new wp.DocProperties();
75: docPr.Name = chartName; 76: docPr.Id = GetMaxDocPrId(mainPart) + 1; 77: 78: //新增圖表資料到內嵌的圖形物像中
79: inline.Append(docPr, clonedGraphic); 80: drawing.Append(inline); 81: } 82: mainPart.Document.Save(); 83: } 84: } 85: 86: static uint GetMaxDocPrId(MainDocumentPart mainPart)
87: { 88: uint max = 1;
89: 90: //取得 docPr 變數項目中之最大 ID 值
91: foreach (wp.DocProperties docPr in mainPart.Document.Descendants<wp.DocProperties>())
92: { 93: uint id = docPr.Id;
94: if (id > max)
95: max = id; 96: } 97: return max;
98: } 99: } 100: }
>> 檔案下載:點我下載
>> 參考翻譯及引用:Importing Charts from Spreadsheets to Wordprocessing Documents