1. 程式人生 > >C#操作Excel表

C#操作Excel表


            本文主要介紹一下c#來操作excel表格,主要介紹我使用的,我是使用第三方提供的函式庫(NPOI)來進行excel的操作,而NPOI庫函式在其官網下,我這裡就不拿出來了。

1:NPOI庫函式

NPOI庫函式下載後,解壓出來有一下幾個DLL檔案,我們就是通過這幾個DLL庫檔案中提供的函式來操作

2:介紹一下excel表格

    2.1: excel表格有兩種字尾名 .xls 和 .xlsx。.xls是office2007以前版本的excel表的字尾名,而.xlsx是office2007以後的excel

excel表的字尾名。

    2.2:一個excel檔案表裡有多個工作簿,每一個工作簿中都可以存資料,如下圖

3:通過c#來操作excel

     3.1:新增NPOI庫並引用名稱空間

              

3.2:開啟或建立一個excel表,並向裡寫入資料

            //開啟或建立excel檔案並向裡新增資料

            HSSFWorkbook wk = new HSSFWorkbook();//這是用於字尾名是.xls的excel檔案的操作

            //XSSFWorkbook wk = new XSSFWorkbook();  ////這是用於字尾名是.xlsx的excel檔案的操作

            ISheet isheet = wk.CreateSheet("Sheet1");//這是建立一個工作簿,其名字位 "Sheet1"

            IRow row;
            ICell cell;
            int rowIndex = 0;
            int cellIndex = 0;

            for (rowIndex = 0; rowIndex < 10; rowIndex++)
            {
                row = isheet.CreateRow(rowIndex);//這個函式是建立該工作簿的第rowIndex行,並不是建立rowIndex行,從第0行開始    
                for (cellIndex = 0; cellIndex < 10; cellIndex++)
                {
                    cell = row.CreateCell(cellIndex);//這個函式是建立該工作簿第cellIndex列(即某個單元格),從第0列開始
                    cell.SetCellValue(1);//這個函式就是向第rowIndex行和第cellIndex列放資料,此處放的是int型的數字1
                }
            }
            //我們excel檔案的資料已經新增完了,然後我們就要把資料寫入excel中
            //這裡我們通過FileStream類來完成(此處是文字操作,而文字操作有多重類,這裡就不介紹)

            //對於文字的操作,需要我們自己手動的釋放資源

            //  FileStream("2.xls", FileMode.OpenOrCreate)中的兩個引數的解釋,FileStream這裡類的建構函式有很多中,不一一介紹,
            //"2.xls":這是指定開啟或建立的excel檔案的路徑和excel的名字,路徑可以是相對路徑,也可以是絕對路徑
            //      這裡我用的是相對路徑,相對於該程式的可執行檔案,即.exe檔案的路徑(我這裡就是在.exe所在的資料夾中的2.xls表格)   
            //      如果用的是XSSFWorkbook建立.xlsx的excel檔案的話,此處就應該是2.xlsx。
            //FileMode.OpenOrCreate:這是指定對2.xls這個excel檔案的操作模式,這裡是如果該路徑下沒有2.xls就建立,有就開啟
            FileStream fs2 = new FileStream("2.xls", FileMode.OpenOrCreate);
            wk.Write(fs2);//向開啟的這個2.xls檔案中寫入上面新增的資料  

            wk.Close();//這就是釋放資源  (詳細知識請參考其它資料,這裡不做解釋)
            fs2.Close();
            fs2.Dispose();


            //同時我們也可以不用自己手動釋放資源,使用using ,其程式碼如下
            //using (FileStream fs = new FileStream ("2.xls",FileMode.OpenOrCreate))
            //{
            //    wk.Write(fs);//向開啟的這個1.xls檔案中寫入並儲存。  
            //}

建立的2.xls檔案和其寫入的資料如下圖:

3.3:讀取excel檔案中的資料

//讀取excel中的資料
            //此處我同樣是用FileStream類來讀取檔案,並是用了using,不用再手動釋放資源
            using (FileStream fs = File.OpenRead("1.xls"))
            {
                IWorkbook workbook = null;
                //這裡需要根據檔名格式判斷一下
                //HSSF只能讀取xls的
                //XSSF只能讀取xlsx格式的
                if (Path.GetExtension(fs.Name) == ".xls")
                {
                    workbook = new HSSFWorkbook(fs);
                }
                else if (Path.GetExtension(fs.Name) == ".xlsx")
                {
                    workbook = new XSSFWorkbook(fs);
                }
                //因為Excel表中可能不止一個工作簿,這裡為了演示,我們遍歷所有工作簿
                //同時要注意excel的工作簿的對應關係,其工作簿也是從0開始
                //工作簿位置為0時,其在excel表的最左邊,參考下面圖一
                for (int h = 0; h < workbook.NumberOfSheets; h++)
                {
                    //得到當前sheet
                    ISheet sheet = workbook.GetSheetAt(h);
                    IRow row;//
                    //也可以通過GetSheet(name)得到
                    //遍歷表中所有的行
                    //注意這裡加1,這裡得到的最後一個單元格的索引預設是從0開始的
                   for (int i = 0; i < sheet.LastRowNum; i++)  //對工作表每一行 
                   {                      
                       row = sheet.GetRow(i);   //row讀入第i行資料 
                       if (row != null) 
                        { 
                            for (int j = 0; j < row.LastCellNum; j++)  //對工作表每一列 
                            {
                                //獲取第i行第j列資料  其資料是通過返回string型別的來獲取
                                string cellValue = row.GetCell(j).ToString(); //cellValue就是第i行第j列這個單元格中的資料
                                richTextBox1.AppendText(cellValue + " ");
                             }
                            richTextBox1.AppendText("\r\n");
                       } 
                    } 
                }
            }//using

//讀取excel中的資料 //此處我同樣是用FileStream類來讀取檔案,並是用了using,不用再手動釋放資源 using (FileStream fs = File.OpenRead("2.xls")) { IWorkbook workbook = null; //這裡需要根據檔名格式判斷一下 //HSSF只能讀取xls的 //XSSF只能讀取xlsx格式的 if (Path.GetExtension(fs.Name) == ".xls") {

workbook = new HSSFWorkbook(fs); } else if (Path.GetExtension(fs.Name) == ".xlsx") { workbook = new XSSFWorkbook(fs); } //因為Excel表中可能不止一個工作簿,這裡為了演示,我們遍歷所有工作簿 //同時要注意excel的工作簿的對應關係,其工作簿也是從0開始 //工作簿位置為0時,其在excel表的最左邊,參考下面圖一 for (int h = 0; h < workbook.NumberOfSheets; h++) { //得到當前sheet ISheet sheet = workbook.GetSheetAt(h); IRow row;// //也可以通過GetSheet(name)得到 //遍歷表中所有的行 //注意這裡加1,這裡得到的最後一個單元格的索引預設是從0開始的 for (int i = 0; i < sheet.LastRowNum; i++) //對工作表每一行 { row = sheet.GetRow(i); //row讀入第i行資料 if (row != null) { for (int j = 0; j < row.LastCellNum; j++) //對工作表每一列 { //獲取第i行第j列資料 其資料是通過返回string型別的來獲取 string cellValue = row.GetCell(j).ToString(); //cellValue就是第i行第j列這個單元格中的資料 richTextBox1.AppendText(cellValue + " "); } richTextBox1.AppendText("\r\n");               


其從2.xls中讀取出來顯示如下:

注:excel中工作簿在excel中的位置

             圖一    

這是我自己用c#操作excel的方法,其實還有很多,也沒去研究。

同時,不知道寫得好不好,主要是自己的整理方便以後看,同時也希望對需要的朋友有所幫助。

上面的程式碼拷貝下來就可以直接用,我是程式中驗證過的。程式碼沒問題,如果你們不能用,可能就是庫沒新增對或其他問題。