需要更快捷的方式来select数据并将其粘贴到Excel表格中

我花了一段时间才find一种方法从我的数据库中select数据,然后将其粘贴到Excel电子表格中。 现在,我发现它,它运行速度慢。 就像我以前说过的,我已经看了许多不同的方法来完成这个任务,但是除此之外,还没有能够正确地实现它们。 我没有结婚这个select,但它是我唯一能够工作的人。 有人可以通过build议一个更快的方法来完成这个简单的任务吗? 请参阅下面的代码。

Record850 rec850 = new Record850(); List<Record850> lst850records = new List<Record850>(); //SqlConnection connStr = new SqlConnection("Server = 172.18.211.76; Database = Processstage; User Id = brendon.davies; Password = mypassword;"); SqlConnection conn = new SqlConnection("Server = 172.18.211.76; Database = Processstage; User Id = brendon.davies; Password = mypassword;"); //SqlConnection sqlConnection1 = new SqlConnection(conn); SqlCommand cmd = new SqlCommand(); SqlDataReader reader; cmd.CommandText = Select_850; cmd.CommandType = CommandType.Text; cmd.Connection = conn; conn.Open(); Record850 reco850 = new Record850(); string strComplete = ""; reader = cmd.ExecuteReader(); while (reader.Read()) { try { reco850.OrgName = reader.GetString(0); reco850.WholeSalerAccountDivisionCode = reader.GetString(1); reco850.File_Process_Name = reader.GetString(2); reco850.Pur_Ord_Num_BEG03 = reader.GetString(3); reco850.File_Process_ID = reader.GetInt64(4); reco850.CECode = reader.GetString(5); reco850.CEName = reader.GetString(6); reco850.Modified_Date = reader.GetDateTime(7); lst850records.Add(reco850); reco850 = new Record850(); } catch(Exception e) { Console.WriteLine(e.ToString()); } } conn.Close(); eWorkSheet = (Excel.Worksheet)oSheets.get_Item("850_Template"); eWorkSheet.Activate(); int int850counter = 0; int int850RowCounter = 3; foreach (Record850 r850 in lst850records) { strComplete = lst850records[int850counter].OrgName + "\t" + lst850records[int850counter].WholeSalerAccountDivisionCode + "\t" + lst850records[int850counter].File_Process_Name + "\t" + lst850records[int850counter].Pur_Ord_Num_BEG03 + "\t" + lst850records[int850counter].File_Process_ID + "\t" + lst850records[int850counter].CECode + "\t" + lst850records[int850counter].CEName+ "\t" + lst850records[int850counter].Modified_Date; CR = (Excel.Range)eWorkSheet.Cells[int850RowCounter,3]; Clipboard.SetText(strComplete); CR.Select(); eWorkSheet.Paste(CR, false); Clipboard.Clear(); int850RowCounter++; int850counter++; strComplete = "" } 

这是一个快速运行的答案,就像使用上面的EPPlus一样。 不要尝试逐个细胞的方法(下面注释),因为通过比较,它确实以蜗牛的速度运行。

  [STAThread] static void Main(string[] args) { Excel.Application xl = null; try { xl = new Excel.Application(); xl.ScreenUpdating = false; xl.Visible = false; xl.UserControl = false; var wb = xl.Workbooks.Open(SOURCE_PATH); var ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Sheets.Item["850_Template"]; StringBuilder sb = new StringBuilder(); //int row = 3; // var a1 = ws.Range["A1", Missing.Value]; using (SqlConnection cn = new SqlConnection(CN_STR)) { cn.Open(); using (SqlCommand cmd = new SqlCommand(SQL, cn)) { cmd.CommandType = CommandType.Text; using (SqlDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { sb.AppendFormat("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}\r\n", (string)dr["OrgName"], (string)dr["WholeSalerAccountDivisionCode"], (string)dr["File_Process_Name"], (string)dr["Pur_Ord_Num_BEG03"], (long)dr["File_Process_ID"], (string)dr["CECode"], (string)dr["CEName"], (DateTime)dr["Modified_Date"] ); //a1.Offset[row, 0].Value = (string)dr["OrgName"]; //a1.Offset[row, 1].Value = (string)dr["WholeSalerAccountDivisionCode"]; //a1.Offset[row, 2].Value = (string)dr["File_Process_Name"]; //a1.Offset[row, 3].Value = (string)dr["Pur_Ord_Num_BEG03"]; //a1.Offset[row, 4].Value = (long)dr["File_Process_ID"]; //a1.Offset[row, 5].Value = (string)dr["CECode"]; //a1.Offset[row, 6].Value = (string)dr["CEName"]; //a1.Offset[row, 7].Value = (DateTime)dr["Modified_Date"]; //row++; } } } cn.Close(); } Clipboard.SetText(sb.ToString(), TextDataFormat.Text); var rng = ws.Range["A3", Missing.Value]; rng.Select(); ws.Paste(rng, Missing.Value); Clipboard.Clear(); wb.Save(); wb.Close(); xl.Quit(); } catch (Exception ex) { Console.WriteLine(ex.Message); if (xl != null) { xl.ScreenUpdating = true; xl.Visible = true; xl.UserControl = true; } } } 

这是一个使用EPPlus方法的替代方法,速度更快。

  try { var app = new ExcelPackage(new FileInfo(SOURCE_PATH)); var ws = app.Workbook.Worksheets["850_Template"]; int row = 3; using (SqlConnection cn = new SqlConnection(CN_STR)) { cn.Open(); using (SqlCommand cmd = new SqlCommand(SQL, cn)) { cmd.CommandType = CommandType.Text; using (SqlDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { ws.SetValue(row, 1, (string) dr["OrgName"]); ws.SetValue(row, 2, (string) dr["WholeSalerAccountDivisionCode"]); ws.SetValue(row, 3, (string) dr["File_Process_Name"]); ws.SetValue(row, 4, (string) dr["Pur_Ord_Num_BEG03"]); ws.SetValue(row, 5, (long) dr["File_Process_ID"]); ws.SetValue(row, 6, (string) dr["CECode"]); ws.SetValue(row, 7, (string) dr["CEName"]); ws.SetValue(row, 8, (DateTime) dr["Modified_Date"]); row++; } } } cn.Close(); } app.Save(); } catch (Exception ex) { Console.WriteLine(ex.Message); }