一直想沉下心來研究研究OpenXML編程,可是由於公司編程項目一筆接一筆,很難靜下來,所以一直是采用的COM操作Excel。現在終於得閑,特將心得歷程記錄下來。
今天的第一個實例代碼是來源於MSDN,關於如何創建一個空的工作簿文件。不過在正式開始堆砌代碼前,首先你的配置好你的開發環境。
1、你得安裝VS2010或以上版本,去網上下吧,我不提供鏈接了;
2、你得安裝OpenXMLSDKV25,去網上下吧,我不提供鏈接了;
接下來你就需要再VS中創建一個項目,編寫代碼了。但是你必須注意這么幾件事情:
1、在項目中添加對DocumentFormat.OpenXml庫的引用;

2、VS2010的默認框架是4.0,如果你未修改這個設置,需要添加WindowsBase.dll的引用;如果你選擇的是3.5的就不用管了,否則你會收到類似下面所示的錯誤;
類型“System.IO.Packaging.Package”在未被引用的程序集中定義。必須添加對程序集“WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”的引用。
我創建的是一個WinForm的C#項目,並新添加了一個靜態類OpenXMLHelper,在后續的同主題文章我會不斷擴充這個OpenXMLHelper的代碼,以形成常用的操作Excel的類。接下來我們將從MSDN獲取的函數代碼拷貝進去,注意一定要自己手動添加5-7行的using語句:
以下代碼的重點是CreateSpreadsheetWorkbook方法,它接受一個路徑字符串參數,(我們可以考慮改造改方法返回創建的工作簿對象,因為沒有必要創建完畢后,還要再去用代碼找這個新創建的工作簿):
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using DocumentFormat.OpenXml; 6 using DocumentFormat.OpenXml.Packaging; 7 using DocumentFormat.OpenXml.Spreadsheet; 8 9 namespace OpenXMLTest 10 { 11 static class OpenXMLHelper 12 { 13 public static void CreateSpreadsheetWorkbook(string filepath) 14 { 15 // Create a spreadsheet document by supplying the filepath. 16 // By default, AutoSave = true, Editable = true, and Type = xlsx. 17 SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook); 18 19 // Add a WorkbookPart to the document. 20 WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart(); 21 workbookpart.Workbook = new Workbook(); 22 23 // Add a WorksheetPart to the WorkbookPart. 24 WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>(); 25 worksheetPart.Worksheet = new Worksheet(new SheetData()); 26 27 // Add Sheets to the Workbook. 28 Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets()); 29 30 // Append a new worksheet and associate it with the workbook. 31 Sheet sheet = new Sheet() { Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "mySheet" }; 32 sheets.Append(sheet); 33 34 workbookpart.Workbook.Save(); 35 36 // Close the document. 37 spreadsheetDocument.Close(); 38 } 39 } 40 }
也可以參考一下來自於CodeProject網站的一段代碼
1 public static SpreadsheetDocument CreateWorkbook(string fileName) { 2 SpreadsheetDocument spreadSheet = null; 3 SharedStringTablePart sharedStringTablePart; 4 WorkbookStylesPart workbookStylesPart; 5 6 try { 7 // Create the Excel workbook 8 spreadSheet = SpreadsheetDocument.Create(fileName, SpreadsheetDocumentType.Workbook, false); 9 10 // Create the parts and the corresponding objects 11 // Workbook 12 spreadSheet.AddWorkbookPart(); 13 spreadSheet.WorkbookPart.Workbook = new Workbook(); 14 spreadSheet.WorkbookPart.Workbook.Save(); 15 16 // Shared string table 17 sharedStringTablePart = spreadSheet.WorkbookPart.AddNewPart<SharedStringTablePart>(); 18 sharedStringTablePart.SharedStringTable = new SharedStringTable(); 19 sharedStringTablePart.SharedStringTable.Save(); 20 21 // Sheets collection 22 spreadSheet.WorkbookPart.Workbook.Sheets = new Sheets(); 23 spreadSheet.WorkbookPart.Workbook.Save(); 24 25 // Stylesheet 26 workbookStylesPart = spreadSheet.WorkbookPart.AddNewPart<WorkbookStylesPart>(); 27 workbookStylesPart.Stylesheet = new Stylesheet(); 28 workbookStylesPart.Stylesheet.Save(); 29 } catch (System.Exception exception) { 30 System.Windows.MessageBox.Show(exception.Message, "Excel OpenXML basics", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Hand); 31 } 32 33 return spreadSheet; 34 }
我在窗體上添加了一個按鈕控件,並未改按鈕添加了相應的代碼,窗體的完整代碼如下:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace OpenXMLTest 11 { 12 public partial class Form1 : Form 13 { 14 public Form1() 15 { 16 InitializeComponent(); 17 } 18 19 private void button1_Click(object sender, EventArgs e) 20 { 21 OpenXMLHelper.CreateSpreadsheetWorkbook(@"C:\Users\Administrator\Desktop\OpenXMLTest\OpenXMLTest.xlsx"); 22 } 23 } 24 }
