直接将数据导出到Excel C#

我运行一个我想要在Excel模板上转储的存储过程。

它目前的工作,但只是太长时间了。 在SQL Server Management Studio中,查询运行正常,但是当我写入模板时,它确实很慢。

任何人都可以build议一个更有效的方式来实现相同的结果?

这是我的代码的一部分:

sdate = StartDate.Value.ToString(); edate = EndDate.Value.ToString(); Excel.Application oXL; Excel._Workbook oWB; Excel._Worksheet aSheet; try { //Start Excel and get Application object. oXL = new Excel.Application(); oXL.Visible = true; //open the excel template oWB = oXL.Workbooks.Open("C:\\TEMP\\template.xlsm"); //oWB = (Excel._Workbook)(oXL.Workbooks.Add(Missing.Value)); //Call to service //aSheet = (Excel._Worksheet)oWB.Worksheets.get_Item(1); aSheet = (Excel._Worksheet)oWB.ActiveSheet; //backgroundWorker1.ReportProgress(i++); writedata_from_proc(aSheet, "dbo.CODE_RED_2017"); //backgroundWorker1.ReportProgress(i++); //Make sure Excel is visible and give the user control //of Microsoft Excel's lifetime. //backgroundWorker1.ReportProgress(i++); MessageBox.Show("Data extraction complete"); oXL.Visible = true; oXL.UserControl = true; //SaveExcel(oWB); //clean up the COM objects to remove them from the memory Marshal.FinalReleaseComObject(aSheet); Marshal.FinalReleaseComObject(oWB); Marshal.FinalReleaseComObject(oXL); } catch (Exception theException) { String errorMessage; errorMessage = "Error: "; errorMessage = String.Concat(errorMessage, theException.Message); errorMessage = String.Concat(errorMessage, " Line: "); errorMessage = String.Concat(errorMessage, theException.Source); MessageBox.Show(errorMessage, "Error"); } } 

这是我最初错过的代码:

 public void writedata_from_proc(Excel._Worksheet oWS,string sentproc) { int rowCount = 0; SqlCommand cmd = new SqlCommand(sentproc.ToString()); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@start_date", SqlDbType.DateTime).Value = getsdate(); cmd.Parameters.Add("@end_date",SqlDbType.DateTime).Value=getedate(); cmd.CommandTimeout = 0; DataTable dt = GetData(cmd); oWS.UsedRange.Rows.Count.ToString(); if (sentproc.Contains("CODE_RED")) { rowCount = 1; } else { rowCount = oWS.UsedRange.Rows.Count; } foreach (DataRow dr in dt.Rows) { rowCount += 1; for (int i = 1; i < dt.Columns.Count + 1; i++) { // Add the header the first time through if (rowCount == 2) { oWS.Cells[1, i] = dt.Columns[i - 1].ColumnName; } oWS.Cells[rowCount, i] = dr[i - 1]; } } } 

Excel已经有一个内置的工具来完成这个工作,并且不再需要运行查询和获取结果。 这就是所谓的MS查询。 简而言之,您会:

  1. 转到Excelfunction区上的“数据”选项卡
  2. select“获取外部数据”(function区组) – >“从其他来源” – >“从SQL Server”。 我假设这是SQL Server。 从你的语法来看,它可能是Sybase,在这种情况下,你仍然可以通过ODBC(SQL Server下面的几个选项)
  3. 绕过所有的devise师,你将登陆MS查询窗口。 从这里,你可以直接编辑SQL并input你的SQL – exec dbo.CODE_RED_2017
  4. 当您closuresMS Query时,它会询问您要放置数据的位置。 选一个细胞。

最重要的是,当刷新的时候,你右键点击表格并select“刷新”,它将重新执行你的程序(或查询)。 根据我的经验,Excel实际上比大多数数据库浏览器更快地呈现数据。

这里有一个更详细的微软链接:

https://support.office.com/en-us/article/Use-Microsoft-Query-to-retrieve-external-data-42a2ea18-44d9-40b3-9c38-4c62f252da2e?ui=en-US&rs=en-US&ad=美国和fromAR = 1

所以,你根本不需要C#。 也就是说,如果你通过C#自动化,这也可以这样做。 这里是一个例子:

 string sql = "exec dbo.CODE_RED_2017"; string source = "your connection string here"; Excel.Range r = activeSheet.Range["A1"]; Excel.ListObject lo = sheet.ListObjects.AddEx(Excel.XlListObjectSourceType.xlSrcQuery, source, true, Excel.XlYesNoGuess.xlGuess, r); lo.QueryTable.CommandText = sql; lo.Refresh();