這兩天做東西,用到了Excel。需要將Excel中的數據讀取到內存中,經過處理後,保存到數據庫中。在網上找了好多方法,但都有錯誤。現總結下:
1.引用Microsoft.Office.Interop.Excel
2.代碼:
- /// <summary>
- /// 導入Excel文件,並顯示在列表
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void btnImport_Click(object sender, EventArgs e)
- {
- string worksheetname = string.Empty;
- importtpye = cmbTicketType.Text;
- supplier = cmbSupplier.SelectedValue.ToString();
- #region 導入本地Excel文件
- //導入本地文件
- OpenFileDialog file = new OpenFileDialog();
- file.Filter = "文檔(*.xls)|*.xls";
- if (file.ShowDialog() == DialogResult.OK)
- btnImport.Tag = file.FileName;
- //判斷有沒有文件導入
- if (file.FileName.Length == 0)
- {
- MessageBox.Show("請選擇要導入的文件", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
- return;
- }
- #endregion
- #region 獲取Excel的工作表名稱
- //創建Excel實例,獲取worksheet Name
- Microsoft.Office.Interop.Excel.Application oExcel = new Microsoft.Office.Interop.Excel.Application();
- object objMissing = System.Reflection.Missing.Value;
- Microsoft.Office.Interop.Excel.Workbook myBook = (Microsoft.Office.Interop.Excel.Workbook)oExcel.Workbooks.Open(file.FileName, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing);
- Microsoft.Office.Interop.Excel.Sheets sheets = myBook.Worksheets;
- Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)sheets.get_Item(1);
- worksheetname = worksheet.Name;//獲取worksheet Name
- oExcel.Quit();
- #endregion
- dataTable.Rows.Clear();
- //將Excel表中的數據導入到Datatable中
- DataTable table = LoadExcelToDataTable(file.FileName, worksheetname);
- }
3.代碼:
- /// <summary>
- /// 加載Excel表到DataTable,跟原始Excel表形式一樣,需要篩選自己有用的數據
- /// </summary>
- /// <param name="filename">需要讀取的Excel文件路徑</param>
- /// <param name="sheetname">工作表名稱</param>
- /// <returns>DataTable</returns>
- public static DataTable LoadExcelToDataTable(string filename, string worksheetname)
- {
- DataTable table;
- //連接字符串
- String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filename + ";" + "Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"";
- OleDbConnection myConn = new OleDbConnection(sConnectionString);
- string strCom = " SELECT * FROM [" + worksheetname + "$]";
- myConn.Open();
- OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
- table = new DataTable();
- myCommand.Fill(table);
- myConn.Close();
- return table;
- }
4.注意:有的人的連接字符串寫成這樣:
- //連接字符串
- String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" +
- filename + ";" + "Extended Properties=Excel 8.0;";
這樣也可以讀取到數據,但是,如果Excel表裏的某一列中既有文本類型的值,又有數字類型的值,即混合類型的列,那麼就會只讀取到一種類型的值,另一種類型的就會爲NULL。
- //連接字符串
- String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filename + ";" + "Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"";
這樣,後邊加上"HDR=Yse;IMEX=1",並且這句必須用引號引住,這樣就會把混合類型的數據同一當作文本讀取,不會出現丟數據的現象。