在 Server 端存取 Excel 檔案的利器:NPOI Library
可使用 NPOIhttp://msdn.microsoft.com/zh-tw/evalcenter/ee818993.aspx
NPOI 函式庫
NPOI 函式庫可以在 http://npoi.codeplex.com 中下載,目前的版本為 1.2.1,有分為 .NET 1.1 與 .NET 2.0 以上版本兩種,支援主要的 POI 專案提供的功能,但專案中的範例程式碼都是以 Excel 為標的,原因應該是 Excel 在伺服器端的處理遠比 Word 和 PowerPoint 等文件要多太多了,故筆者在本篇文章也是以 Excel 檔案為主要說明的標的。
NPOI 函式庫檔案有七個,分別是:
- NPOI.DLL:NPOI 核心函式庫。
- NPOI.DDF.DLL:NPOI 繪圖區讀寫函式庫。
- NPOI.HPSF.DLL:NPOI 文件摘要資訊讀寫函式庫。
- NPOI.HSSF.DLL:NPOI Excel BIFF 檔案讀寫函式庫。
- NPOI.Util.DLL:NPOI 工具函式庫。
- NPOI.POIFS.DLL:NPOI OLE 格式存取函式庫。
- ICSharpCode.SharpZipLib.DLL:檔案壓縮函式庫。
一般需要存取 Excel 97-2003 格式(.xls)的檔案時,需要使用 NPOI、NPOI.HSSF、NPOI.POIFS 與 NPOI.Util 函式庫,因此專案中要引用這四個 DLL,若要一併存取文件摘要資訊時,則也要引用 NPOI.HPSF.DLL 檔案,以取得必要的類別宣告。開發人員通常只要集中精神在 NPOI.HSSF.UserModel 命名空間即可,它包含了控制 Excel 資料的各式類別物件供開發人員取用。
例如下列的 ASP.NET 程式碼可以生成一個空白的 Excel 檔案,並且添加三個指定名稱的試算表:
[C#]
HSSFWorkbook workbook = new HSSFWorkbook();
MemoryStream ms = new MemoryStream();
// 新增試算表。
workbook.CreateSheet("試算表 A");
workbook.CreateSheet("試算表 B");
workbook.CreateSheet("試算表 C");
workbook.Write(ms);
Response.AddHeader("Content-Disposition", string.Format("attachment; filename=EmptyWorkbook.xls"));
Response.BinaryWrite(ms.ToArray());
workbook = null;
ms.Close();
ms.Dispose();
我們可以在裡面添加資料,例如下列的程式碼:
[C#]
HSSFWorkbook workbook = new HSSFWorkbook();
MemoryStream ms = new MemoryStream();
// 新增試算表。
HSSFSheet sheet = workbook.CreateSheet("My Sheet");
// 插入資料值。
sheet.CreateRow(0).CreateCell(0).SetCellValue("0");
sheet.CreateRow(1).CreateCell(0).SetCellValue("1");
sheet.CreateRow(2).CreateCell(0).SetCellValue("2");
sheet.CreateRow(3).CreateCell(0).SetCellValue("3");
sheet.CreateRow(4).CreateCell(0).SetCellValue("4");
sheet.CreateRow(5).CreateCell(0).SetCellValue("5");
workbook.Write(ms);
Response.AddHeader("Content-Disposition", string.Format("attachment; filename=EmptyWorkbook.xls"));
Response.BinaryWrite(ms.ToArray());
workbook = null;
ms.Close();
ms.Dispose();
那麼輸入呢?當然也沒有問題啦。
利用下列的程式碼:
利用下列的程式碼:
[C#]
if (this.fuUpload.HasFile)
{
HSSFWorkbook workbook = new HSSFWorkbook(this.fuUpload.FileContent);
HSSFSheet sheet = workbook.GetSheetAt(0);
DataTable table = new DataTable();
HSSFRow headerRow = sheet.GetRow(0);
int cellCount = headerRow.LastCellNum;
for (int i = headerRow.FirstCellNum; i < cellCount; i++)
{
DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
table.Columns.Add(column);
}
int rowCount = sheet.LastRowNum;
for (int i = (sheet.FirstRowNum + 1); i < sheet.LastRowNum; i++)
{
HSSFRow row = sheet.GetRow(i);
DataRow dataRow = table.NewRow();
for (int j = row.FirstCellNum; j < cellCount; j++)
{
if (row.GetCell(j) != null)
dataRow[j] = row.GetCell(j).ToString();
}
table.Rows.Add(dataRow);
}
workbook = null;
sheet = null;
this.gvExcel.DataSource = table;
this.gvExcel.DataBind();
}
0 留言