[ASP.net WebForm] 把Excel資料匯入資料庫的懶人Code分享 - NPOI篇

[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++)