一、簡介
要將資料寫入 EXCEL 檔案有許多的方法,但假如電腦不想安裝 Microsoft Office EXCEL,又想要寫入資料到 EXCEL,可以使用 NPOI、OpenXML SDK、OpenOffice.org SDK 等方式。本文透過簡單的範例 - 寫入資料到 EXCEL 讓大家初步了解如何使用這些 Library。
附註 : 本文程式為 Windows Forms (.NET Framework 3.5 專案),開發環境為 Windows XP SP3、Visual Studio 2008 SP1。
二、NPOI
NPOI 是可在 .NET 上的處理 Office 檔案的函式庫,由於 NPOI 相當熱門,因此不多加介紹,有興趣的可以參考小朱的文章 在 Server 端存取 Excel 檔案的利器:NPOI Library,而在使用上能讀寫 xls 檔案。接著介紹如何使用 NPOI 寫入資料到 EXCEL (xls) 檔案。
1. NOPI 下載與加入參考
(1) 到 CodePlex 的 NPOI 網站中下載 NPOI Lirary,在此下載的是 NPOI 1.2.2 for .NET 2.0,下載並且壓縮後,會有 7 個 dll 檔案,分別是
(2) 解壓縮後,將 NPOI 的 dll 加入參考中。
2. 程式撰寫
請參考以下程式碼與註解,了解如何透過 NPOI 寫入資料到 Excel 檔案,以下程式為建立工作簿、工作表、寫入資料、儲存檔案。
01 |
using System; |
02 |
using System.Collections.Generic; |
03 |
using System.ComponentModel; |
04 |
using System.Data; |
05 |
using System.Drawing; |
06 |
using System.Linq; |
07 |
using System.Text; |
08 |
using System.Windows.Forms; |
09 |
10 |
using System.IO; |
11 |
12 |
#region NPOI |
13 |
using NPOI.HSSF.UserModel; |
14 |
using NPOI.HPSF; |
15 |
using NPOI.POIFS.FileSystem; |
16 |
#endregion NPOI |
17 |
18 |
namespace WinFormNPOI |
19 |
{ |
20 |
public partial class Form1 : Form |
21 |
{ |
22 |
public Form1() |
23 |
{ |
24 |
InitializeComponent(); |
25 |
} |
26 |
27 |
private void btnNPOI_Click( object sender, EventArgs e) |
28 |
{ |
29 |
// 建立新的 Excel 工作簿 |
30 |
HSSFWorkbook hssfworkbook = new HSSFWorkbook(); |
31 |
32 |
// 在 Excel 工作簿中建立工作表,名稱為 Sheet1 |
33 |
HSSFSheet sheet1 = hssfworkbook.CreateSheet( "Sheet1" ); |
34 |
35 |
// 寫入資料到工作表中 |
36 |
sheet1.CreateRow(1).CreateCell(1).SetCellValue( "點部落" ); |
37 |
sheet1.CreateRow(2).CreateCell(1).SetCellValue( "小歐ou" ); |
38 |
|
39 |
// 儲存檔案 |
40 |
FileStream file = new FileStream( @"C:\NPOI.xls" , FileMode.Create); |
41 |
hssfworkbook.Write(file); |
42 |
file.Close(); |
43 |
} |
44 |
} |
45 |
} |
3. 執行結果
三、OpenXML SDK
Open XML SDK 是微軟所提供可以用來處理 Office 檔案,但只限 Open XML 檔案格式 (以 Excel 來說副檔名為 xlsx)。
目前 Open XML Format SDK 有以下版本
接著介紹如何使用 OpenXML SDK 寫入資料到 EXCEL (xlsx) 檔案。
1. OpenXML SDK 下載與加入參考
(1) 連結到 Open XML Format SDK 2.0 進行下載
(2) 執行 OpenXMLSDKv2.msi 進行安裝,安裝過程並沒有特別的過程,只是要記得安裝路徑在哪,免得找不到 dll。
(3) 將 DocumentFormat.OpenXml.dll、WindowsBase.dll 加入參考
DocumentFormat.OpenXml.dll 位置在 C:\Program Files\Open XML SDK\V2.0\lib\DocumentFormat.OpenXml.dll
2. 程式撰寫
參考程式碼與註解說明,程式流程如下
(1) 開啟 Excel 檔案,取得工作簿
(2) 取得工作簿中的工作表,並透過 Linq 判斷工作表是否存在
(3) 建立 Cell 物件,設定寫入位置,格式,資料
(4) 建立 Row 物件,將 Cell 加入
(5) 將 Row 加入工作表中
(6) 儲存檔案
01 |
using System; |
02 |
using System.Collections.Generic; |
03 |
using System.ComponentModel; |
04 |
using System.Data; |
05 |
using System.Drawing; |
06 |
using System.Linq; |
07 |
using System.Text; |
08 |
using System.Windows.Forms; |
09 |
10 |
#region OpenXML SDK |
11 |
using DocumentFormat.OpenXml.Packaging; |
12 |
using DocumentFormat.OpenXml.Spreadsheet; |
13 |
using DocumentFormat.OpenXml; |
14 |
#endregion OpenXML SDK |
15 |
16 |
namespace WinFormOpenXML |
17 |
{ |
18 |
public partial class Form1 : Form |
19 |
{ |
20 |
public Form1() |
21 |
{ |
22 |
InitializeComponent(); |
23 |
} |
24 |
25 |
private void btnOpenXML_Click( object sender, EventArgs e) |
26 |
{ |
27 |
// 1. 開啟 Excel 檔案,取得工作簿 |
28 |
using (SpreadsheetDocument document = SpreadsheetDocument.Open( @"C:\OpenXML.xlsx" , true )) |
29 |
{ |
30 |
WorkbookPart wbPart = document.WorkbookPart; |
31 |
32 |
// 2. 取得工作簿中的工作表,並透過 Linq 判斷工作表是否存在 |
33 |
Sheet theSheet = wbPart.Workbook.Descendants<Sheet>(). |
34 |
Where(s => s.Name == "工作表1" ).FirstOrDefault(); |
35 |
if (theSheet != null ) |
36 |
{ |
37 |
// 3. 建立 Cell 物件,設定寫入位置,格式,資料 |
38 |
Cell cell = new Cell() { CellReference = "A1" }; |
39 |
cell.DataType = new EnumValue<CellValues>(CellValues.String); |
40 |
cell.CellValue = new CellValue(); |
41 |
cell.CellValue.Text = "點部落" ; |
42 |
43 |
// 4. 建立 Row 物件,將 Cell 加入 |
44 |
Row theRow = new Row(); |
45 |
theRow.InsertAt(cell, 0); |
46 |
47 |
// 5. 將 Row 加入工作表中 |
48 |
Worksheet ws = ((WorksheetPart)(wbPart.GetPartById(theSheet.Id))).Worksheet; |
49 |
SheetData sheetData = ws.GetFirstChild<SheetData>(); |
50 |
sheetData.Append(theRow); |
51 |
52 |
// 6. 儲存檔案 |
53 |
ws.Save(); |
54 |
} |