程式匯入Excel的三種方式
阿新 • • 發佈:2018-12-30
第一種OLEDB方式(若sheet名關聯檔名,則開啟會失敗)
public static DataSet ImportExcel(string v_FilePath) { try { string strCon; strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + v_FilePath + "; Extended Properties='Excel 8.0; HDR=No; IMEX=1'"; OleDbConnection olecon = new OleDbConnection(strCon); olecon.Open(); System.Data.DataTable dtSheetName = olecon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); olecon.Close(); string sheetName = "SELECT * FROM [" + dtSheetName.Rows[0]["TABLE_NAME"].ToString() + "]"; OleDbDataAdapter myda = new OleDbDataAdapter(sheetName, strCon); DataSet myds = new DataSet(); myda.Fill(myds); return myds; } catch (Exception ) { return null; } }
第二種COM元件方式(速度慢)
public static System.Data.DataTable ImportExcelToDataTable(string v_FilePath,ref string v_strErr) { try { //建立EXCEL物件 Microsoft.Office.Interop.Excel.Application objExcel = new Microsoft.Office.Interop.Excel.Application(); //開啟一個工作薄 Workbook objBook = objExcel.Workbooks.Open(v_FilePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); //開啟一個工作表 Worksheet objSheet = (Worksheet)objBook.Worksheets.get_Item(1); System.Data.DataTable dt = new System.Data.DataTable(); Range range; for (int i = 0; i < objSheet.UsedRange.Columns.Count; i++) { dt.Columns.Add(); } for (int i = 1; i <= objSheet.UsedRange.Rows.Count; i++) { try { DataRow dr = dt.NewRow(); for (int j = 1; j <= objSheet.UsedRange.Columns.Count; j++) { try { range = (Range)objSheet.Cells[i, j]; dr[j - 1] = (range.Value2 == null) ? "" : range.Text.ToString(); } catch (Exception err) { v_strErr = err.ToString(); } } dt.Rows.Add(dr); } catch (Exception err) { v_strErr = err.ToString(); } } objExcel.Workbooks.Close(); return dt; } catch (Exception err) { v_strErr += err.ToString(); return null; } }
第三種NPOI方式(速度快,分為xls和xlsx格式)
public static System.Data.DataTable ImportExcelToDataTableByNPOI(string v_FilePath, ref string v_strErr) { IWorkbook wk = null; string extension = System.IO.Path.GetExtension(v_FilePath); try { FileStream fs = File.OpenRead(v_FilePath); if (extension.Equals(".xls")) { //把xls檔案中的資料寫入wk中 wk = new HSSFWorkbook(fs); } else { //把xlsx檔案中的資料寫入wk中 wk = new XSSFWorkbook(fs); } fs.Close(); //讀取當前表資料 ISheet sheet = wk.GetSheetAt(0); System.Data.DataTable dtResultTable = new System.Data.DataTable(); IRow TitleRow = sheet.GetRow(0); for (int i = 0; i < TitleRow.LastCellNum; i++) { dtResultTable.Columns.Add(TitleRow.GetCell(i).ToString()); } IRow row = sheet.GetRow(0); //讀取當前行資料 //LastRowNum 是當前表的總行數-1(注意) for (int i = 0; i <= sheet.LastRowNum; i++) { row = sheet.GetRow(i); //讀取當前行資料 if (row != null) { DataRow newRow = dtResultTable.NewRow(); //LastCellNum 是當前行的總列數! for (int j = 0; j < row.LastCellNum; j++) { //讀取該行的第j列資料 if (row.GetCell(j) != null) { string value = row.GetCell(j).ToString(); newRow[j] = value; } } dtResultTable.Rows.Add(newRow); } } return dtResultTable; } catch (Exception err) { v_strErr += err.ToString(); return null; } }