轉自:http://www.cnblogs.com/JacobHuang/p/5663926.html
.Net平臺上對Excel進行操作主要有兩種方式。第一種,把Excel文件看成一個數據庫,通過OleDb的方式進行讀取與操作;第二種,調用Excel的COM組件。兩種方式各有特點。
注意一些簡單的問題1.excel文件只能存儲65535行數據,如果你的數據大於65535行,那麼就需要將excel分割存放了。2.關於亂碼,這主要是字符設置問題。
一、OleDb方式
- 讀取Excel文件
1 //加載Excel 2 public static DataSet LoadDataFromExcel(string filePath) 3 { 4 try 5 { 6 string strConn; 7 strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=False;IMEX=1'"; 8 OleDbConnection OleConn = new OleDbConnection(strConn); 9 OleConn.Open(); 10 String sql = "SELECT * FROM [Sheet1$]";//可是更改Sheet名稱,比如sheet2,等等 11 12 OleDbDataAdapter OleDaExcel = new OleDbDataAdapter(sql, OleConn); 13 DataSet OleDsExcle = new DataSet(); 14 OleDaExcel.Fill(OleDsExcle, "Sheet1"); 15 OleConn.Close(); 16 return OleDsExcle; 17 } 18 catch (Exception err) 19 { 20 MessageBox.Show("數據綁定Excel失敗!失敗原因:" + err.Message, "提示信息", 21 MessageBoxButtons.OK, MessageBoxIcon.Information); 22 return null; 23 } 24 }
訪問.xls的文件使用的是“Microsoft.Jet.OLEDB.4.0”,訪問.xlsx的文件使用的是“Microsoft.Ace.OleDb.12.0”
- 寫入excel文件
1 /// <summary> 2 /// 寫入Excel文檔 3 /// </summary> 4 public bool SaveFP2toExcel(string filePathath) 5 { 6 try 7 { 8 string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+ filePathath +";Extended Properties=Excel 8.0;"; 9 OleDbConnection conn = new OleDbConnection(strConn); 10 conn.Open(); 11 System.Data.OleDb.OleDbCommand cmd=new OleDbCommand (); 12 cmd.Connection =conn; 13 14 for(int i=0;i<fp2.Sheets [0].RowCount -1;i++) 15 { 16 if(fp2.Sheets [0].Cells[i,0].Text!="") 17 { 18 cmd.CommandText ="INSERT INTO [sheet1$] (工號,姓名,部門,職務,日期,時間) VALUES('"+fp2.Sheets [0].Cells[i,0].Text+ "','"+ 19 fp2.Sheets [0].Cells[i,1].Text+"','"+fp2.Sheets [0].Cells[i,2].Text+"','"+fp2.Sheets [0].Cells[i,3].Text+ 20 "','"+fp2.Sheets [0].Cells[i,4].Text+"','"+fp2.Sheets [0].Cells[i,5].Text+"')"; 21 cmd.ExecuteNonQuery (); 22 } 23 } 24 25 conn.Close (); 26 return true; 27 } 28 catch(System.Data.OleDb.OleDbException ex) 29 { 30 Console.WriteLine ("寫入Excel發生錯誤:"+ex.Message ); 31 return false; 32 } 33 }
二、Excel COM組件
一個.NET組件事實上是一個.NET下的DLL,它包含的不僅是運行程序本身,更重要的是包含這個DLL的描述信息(Meta Data,即元數據),而一個COM組件是用其類庫(TLB)儲存其描述信息。這些COM組件都是非受管代碼,要在Visual C#中使用這些非受管代碼的COM組件,就必須把他們轉換成受管代碼的.NET組件。所以在用Visual C#調用Excel表格之前,必須完成從COM組件的非受管代碼到受管代碼的類庫的轉換。
添加COM組件
Create an Automation Client for Microsoft Excel
-
- Start Microsoft Visual Studio .NET.
- On the File menu, click New, and then click Project. Select Windows Application from the Visual C# Project types. Form1 is created by default.
- Add a reference to the Microsoft Excel Object Library. To do this, follow these steps:
- On the Project menu, click Add Reference.
- On the COM tab, locate Microsoft Excel Object Library, and click Select.
- Click OK in the Add References dialog box to accept your selections. If you are prompted to generate wrappers for the libraries that you selected, click Yes.
- using Excel = Microsoft.Office.Interop.Excel;
- 讀取Excel文件
1 private void button1_Click(object sender, EventArgs e) 2 { 3 Excel.Application xlApp ; 4 Excel.Workbook xlWorkBook ; 5 Excel.Worksheet xlWorkSheet ; 6 Excel.Range range ; 7 8 string str; 9 int rCnt = 0; 10 int cCnt = 0; 11 12 xlApp = new Excel.Application(); 13 xlWorkBook = xlApp.Workbooks.Open("csharp.net-informations.xls"); 14 xlWorkSheet = xlWorkBook.Sheets["Sheet1"]; 15 16 range = xlWorkSheet.UsedRange; 17 18 for (rCnt = 1; rCnt <= range.Rows.Count; rCnt++) 19 { 20 for (cCnt = 1; cCnt <= range.Columns.Count; cCnt++) 21 { 22 str = (string)(range.Cells[rCnt, cCnt] as Excel.Range).Value2 ; 23 MessageBox.Show(str); 24 } 25 } 26 27 xlWorkBook.Close(true, null, null); 28 xlApp.Quit(); 29 }
- 寫入Excel文件
1 private void button1_Click(object sender, EventArgs e) 2 { 3 Excel.Application xlApp ; 4 Excel.Workbook xlWorkBook ; 5 Excel.Worksheet xlWorkSheet ; 6 object misValue = System.Reflection.Missing.Value; 7 8 xlApp = new Excel.Application(); 9 xlWorkBook = xlApp.Workbooks.Add(misValue); 10 xlWorkSheet = xlWorkBook.Sheets["Sheet1"]; 11 12 //add some text 13 xlWorkSheet.Cells[1, 1] = "http://csharp.net-informations.com"; 14 xlWorkSheet.Cells[2, 1] = "Adding picture in Excel File"; 15 16 xlWorkBook.SaveAs("csharp.net-informations.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); 17 xlWorkBook.Close(true, misValue, misValue); 18 xlApp.Quit(); 19 20 MessageBox.Show ("File created !"); 21 }
主要參考:http://csharp.net-informations.com/excel/files/download/csharp-open-excel_download.htm
三、第三方插件-NPOI
摘要: NPOI,顧名思義,就是POI的.NET版本。那POI又是什麼呢?POI是一套用Java寫成的庫,能夠幫助開發者在沒有安裝微軟Office的情況下讀寫Office 97-2003的文件,支持的文件格式包括xls, doc, ppt等。在本文發佈時,NPOI的最新版本是2.2.1。
NPOI網址 http://npoi.codeplex.com/
C#連接Excel的連接字符串
在c#項目中導入Excel數據的時候,需要連接Excel的各個版本已滿足需求,不得不做Excel各個版本的處理。
string fileExt = Path.GetExtension(excelPath);
string conn = "";
if (fileExt == ".xls")
{
conn = "Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + excelPath + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
}
else
{
conn = "Provider = Microsoft.ACE.OLEDB.12.0 ; Data Source =" + excelPath + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1'";
}
03和07及以上版本的引擎不同,03是Microsoft.Jet.OLEDB.4.0 ,07及以上是Microsoft.ACE.OLEDB.12.0 。
還發現一個小差別就是Microsoft.Jet.OLEDB.4.0引擎的Excel文檔行索引從1開始,而Microsoft.ACE.OLEDB.12.0 的行索引從0開始。