1. 程式人生 > >C#讀取Excel資料兩種方式效能對比

C#讀取Excel資料兩種方式效能對比

方式一:程式讀取Excel資料,程式碼如下:

  1.             Excel.Application m_ExcelFile = new Excel.Application();
  2.             Excel._Workbook m_Workbook;
  3.             Excel._Worksheet m_Worksheet;
  4. object missing = System.Reflection.Missing.Value;
  5.             Console.WriteLine("excelFilePath:" + excelFilePath);
  6.             m_ExcelFile.Workbooks.Open(excelFilePath, missing, missing, missing, missing, missing, missing, missing, missing, missing
  7.                 , missing, missing, missing, missing, missing);
  8.             m_ExcelFile.Visible = false;
  9.             m_Workbook = m_ExcelFile.Workbooks[1];
  10.             m_Worksheet = (Excel.Worksheet)m_Workbook.ActiveSheet;
  11. int clomn_Count = m_Worksheet.UsedRange.Columns.Count;
  12. int row_Count = m_Worksheet.UsedRange.Rows.Count;
  13. for (int i = 2; i < row_Count + 1; i++)//
  14.             {
  15. string lv_strSql;
  16. string lv_strSqlOne = "insert into user (";
  17. string lv_strSqlTwo = " value(";
  18. for (int j = 1; j < clomn_Count + 1; j++)
  19.                 {
  20. if (((Excel.Range)m_Worksheet.UsedRange.Cells[1, j]).Text.ToString() == "會員姓名" && ((Excel.Range)m_Worksheet.UsedRange.Cells[i, j]).Text.ToString().Trim() != 
    "")
  21.                     {
  22.                         lv_strSqlOne += "name,";
  23.                         lv_strSqlTwo += "'" + ((Excel.Range)m_Worksheet.UsedRange.Cells[i, j]).Text.ToString() + "',";
  24.                     }
  25.                     .........//表格可能有好多列
  26. elseif (((Excel.Range)m_Worksheet.UsedRange.Cells[1, j]).Text.ToString() == "累計積分" && ((Excel.Range)m_Worksheet.UsedRange.Cells[i, j]).Text.ToString().Trim() != "")
  27.                     {
  28.                         lv_strSqlOne += "score,";
  29.                         lv_strSqlTwo += "'" + ((Excel.Range)m_Worksheet.UsedRange.Cells[i, j]).Text.ToString() + "',";
  30.                     }
  31.                 }
  32.                 lv_strSqlOne += "create_date,sync_flag)";
  33.                 lv_strSqlTwo += "'" + DateTime.Now + "',0)";
  34.                 lv_strSql = lv_strSqlOne + lv_strSqlTwo;
  35.                 Console.WriteLine("lv_strSql:" + lv_strSql);
  36. try
  37.                 {
  38. int lv_ret = m_db.RunNoQuery(lv_strSql);//執行資料庫插入操作。
  39.                 }
  40. catch (Exception ex)
  41.                 {
  42.                     Console.WriteLine(ex.Message);
  43.                 }
  44. //關閉Excel相關物件
  45.             m_Worksheet = null;
  46.             m_Workbook = null;
  47.             m_ExcelFile.Quit();
  48.             m_ExcelFile = null;

第二種方式:直接把Excel當作資料庫,查詢Excel的資料,程式碼如下:

  1.             String source = null;
  2.             OdbcConnection conn = null;
  3. string sql = "select * from [Sheet1$]";
  4. try
  5.             {
  6.                 source = "Driver={Microsoft Excel Driver (*.xls)};DBQ=" + tbExcelFilePath.Text;
  7.                 conn = new OdbcConnection(source);
  8.                 conn.Open();
  9.             }
  10. catch (OdbcException e)
  11.             {
  12. try
  13.                 {
  14.                     source = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" + tbExcelFilePath.Text;
  15.                     conn = new OdbcConnection(source);
  16.                     conn.Open();
  17.                 }
  18. catch (OdbcException e1)
  19.                 {
  20.                     MessageBox.Show("請確認此檔案沒有被其它程式開啟!");
  21.                 }
  22.             }
  23. try
  24.             {
  25.                 OdbcCommand cmd = new OdbcCommand(sql, conn);
  26.                 OdbcCommand cmd1 = new OdbcCommand("select count(*) from [Sheet1$]", conn);
  27.                 OdbcDataReader read = cmd.ExecuteReader();
  28. int count = int.Parse(cmd1.ExecuteScalar().ToString());
  29. int rn = 1;
  30. while (read.Read())
  31.                 {
  32. try
  33.                     {
  34. if (m_stop) break;
  35.                         rn++;
  36. string lv_strSql;
  37. string lv_strSqlOne = "insert into user (";
  38. string lv_strSqlTwo = " value(";
  39.                         String[] row = new String[read.FieldCount];
  40. for (int i = 0; i < read.FieldCount; i++)
  41.                         {
  42.                             row[i] = read.GetValue(i).ToString();
  43. if (read.GetName(i) == "會員姓名" && read.GetValue(i).ToString().Trim() != "")
  44.                             {
  45.                                 lv_strSqlOne += "name,";
  46.                                 lv_strSqlTwo += "'" + read.GetValue(i).ToString() + "',";
  47.                             }
  48.                             ............//Excel可能有多列
  49. elseif (read.GetName(i) == "累計積分" && read.GetValue(i).ToString().Trim() != "")
  50.                             {
  51.                                 lv_strSqlOne += "score,";
  52.                                 lv_strSqlTwo += "'" + read.GetValue(i).ToString() + "',";
  53.                             }
  54.                         }
  55.                         lv_strSqlOne += "create_date,sync_flag)";
  56.                         lv_strSqlTwo += "'" + DateTime.Now + "',0)";
  57.                         lv_strSql = lv_strSqlOne + lv_strSqlTwo;
  58.                         Console.WriteLine("lv_strSql:" + lv_strSql);
  59. int lv_ret = m_db.RunNoQuery(lv_strSql);
  60.                     }
  61. catch (Exception ex)
  62.                     {
  63.                         Console.WriteLine(ex.Message);
  64.                     }                
  65.                 }
  66.                 read.Close();
  67.                 conn.Close();
  68.             }
  69. catch (Exception e)
  70.             {
  71.                 MessageBox.Show(e.Message);
  72.             }  

                在效率上第一種方式比第二種慢很多,推薦使用第二種。