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的方法,其實還有很多,也沒去研究。
同時,不知道寫得好不好,主要是自己的整理方便以後看,同時也希望對需要的朋友有所幫助。
上面的程式碼拷貝下來就可以直接用,我是程式中驗證過的。程式碼沒問題,如果你們不能用,可能就是庫沒新增對或其他問題。