[ASP.net WebForm] 把Excel資料匯入資料庫的懶人Code分享 - NPOI篇
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
/*該注意的引用 Start*/
using System.IO;
using System.Data;
using System.Data.SqlClient;
using NPOI;
using NPOI.HPSF;
using NPOI.HSSF;
using NPOI.HSSF.UserModel;
using NPOI.POIFS;
using NPOI.POIFS.FileSystem;
using NPOI.Util;
/*該注意的引用 End*/
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
/***Copy Start***/
//畫面上要先擺一個FileUpload控制項
HSSFWorkbook workbook=null;
HSSFSheet u_sheet = null;
//要上傳Excel檔的Server端 檔案總管目錄
string upload_excel_Dir = @"C:\NPOIExcelImportDB\upload\";
//參考:在 Server 端存取 Excel 檔案的利器:NPOI Library:http://msdn.microsoft.com/zh-tw/ee818993.aspx
//http://www.cnblogs.com/tonyqus/archive/2009/04/12/1434209.html
//http://www.dotblogs.com.tw/mis2000lab/archive/2010/05/07/npoi_excel_vb_asp_net.aspx.aspx
#region 匯入EXCEL
//按鈕Click事件
protected void lbtOK_Click(object sender, EventArgs e)
{
string excel_filePath = "";
try
{
excel_filePath = SaveFileAndReturnPath();//先上傳EXCEL檔案給Server
this.workbook = new HSSFWorkbook(FileUpload1.FileContent);
this.u_sheet = (HSSFSheet)workbook.GetSheetAt(0); //取得第0個Sheet
//不同於Microsoft Object Model,NPOI都是從索引0開始算起
//從第一個Worksheet讀資料
SaveOrInsertSheet(this.u_sheet);
ClientScript.RegisterClientScriptBlock(typeof(System.Web.UI.Page), "匯入完成", "alert('匯入完成');", true);
}
catch (Exception ex)
{
throw ex;
}
finally
{
//釋放 NPOI的資源
if(this.workbook!=null) this.workbook=null;
if(this.u_sheet!=null) this.u_sheet=null;
//是否刪除Server上的Excel檔(預設true)
bool isDeleteFileFromServer = true;
if (isDeleteFileFromServer)
{
System.IO.File.Delete(excel_filePath);
}
GC.Collect();
}
}
private void SaveOrInsertSheet(HSSFSheet u_sheet)
{
//因為要讀取的資料列不包含標頭,所以i從u_sheet.FirstRowNum + 1開始讀
for (int i = u_sheet.FirstRowNum + 1; i < u_sheet.LastRowNum; i++)/*一列一列地讀取資料*/
{
HSSFRow row = (HSSFRow)u_sheet.GetRow(i);//取得目前的資料列
//目前資料列第1格的值
string cell0 = row.GetCell(0).ToString();
//目前資料列第2格的值
string cell1 = row.GetCell(1).ToString();
//目前資料列第3格的值
string cell2 = row.GetCell(2).ToString();
//目前資料列第4格的值
string cell3 = row.GetCell(3).ToString();
//再對各Cell處理完商業邏輯後,Insert into Table...(略
}
}
#endregion
#region 儲存EXCEL檔案給Server
private string SaveFileAndReturnPath()
{
string return_file_path = "";//上傳的Excel檔在Server上的位置
if (FileUpload1.FileName != "")
{
return_file_path = System.IO.Path.Combine(this.upload_excel_Dir, Guid.NewGuid().ToString() + ".xls");
FileUpload1.SaveAs(return_file_path);
}
return return_file_path;
}
#endregion
/***Copy End***/
}
(裡頭的NPOI 1.2.3 final binary.zip已經解壓縮完,放在WebSite的Bin目錄夾底下了)
※2012.01.10 要怎麼取出公式運算的值而非公式字串,請見MIS 2000 Lab老師的文章:http://www.dotblogs.com.tw/mis2000lab/Tags/Excel/default.aspx
※2012.01.11追記,在for迴圈裡直接row.GetCell().ToString()真是個不聰明的辦法
正解為:請問我是使用NPOI,但是使用CellValue時不能定義
2013.10.23 追記
不知道是不是改版關係
for迴圈的LastRowNum要用等號:for (int i = u_sheet.FirstRowNum + 1; i <= u_sheet.LastRowNum; i++)