1. 程式人生 > >程式匯入Excel的三種方式

程式匯入Excel的三種方式

第一種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;
            }
        }