将SQL数据导出到Excel非常慢

 johnylulu2502904467 发布于 2023-01-10 11:16

我正在将SQL数据导出到Excel.我目前使用的代码是:

    DataTable dt = new DataTable();
            // Create sql connection string
            string conString = "Data Source=DELL\\SQLSERVER1;Trusted_Connection=True;DATABASE=Zelen;CONNECTION RESET=FALSE";

            SqlConnection sqlCon = new SqlConnection(conString);
            sqlCon.Open();


            SqlDataAdapter da = new SqlDataAdapter("select LocalSKU,ItemName, QOH,Price,Discontinued,CAST(Barcode As varchar(25)) As Barcode,Integer2,Integer3,ISNULL(SalePrice,0.0000)AS SalePrice,SaleOn,ISNULL(Price2,0.0000)AS Price2 from dbo.Inventory", sqlCon);

            System.Data.DataTable dtMainSQLData = new System.Data.DataTable();

            da.Fill(dtMainSQLData);
            DataColumnCollection dcCollection = dtMainSQLData.Columns;

            // Export Data into EXCEL Sheet
            Microsoft.Office.Interop.Excel.ApplicationClass ExcelApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
            ExcelApp.Application.Workbooks.Add(Type.Missing);



            int i = 1;
            int j = 1;
            int s = 1;
            //header row
            foreach (DataColumn col in dtMainSQLData.Columns)
            {
                ExcelApp.Cells[i, j] = col.ColumnName;
                j++;

                ExcelApp.Rows.AutoFit();
                ExcelApp.Columns.AutoFit();
            }

            i++;

            //data rows
            foreach (DataRow row in dtMainSQLData.Rows)
            {
                for (int k = 1; k < dtMainSQLData.Columns.Count + 1; k++)
                {
                    ExcelApp.Cells[i, k] = "'" + row[k - 1].ToString();
                }

                i++;
                s++;
                Console.Write(s);
                Console.Write("\n\r");

                ExcelApp.Columns.AutoFit();
                ExcelApp.Rows.AutoFit();
            }

            var b = Environment.CurrentDirectory + @"\Sheet1.xlsx";
            ExcelApp.ActiveWorkbook.SaveCopyAs(b);

            ExcelApp.ActiveWorkbook.Saved = true;
            ExcelApp.Quit();

            Console.WriteLine(".xlsx file Exported succssessfully.");

在我的sql数据库中需要70000行.我在控制台应用程序中运行此脚本.将它导出到excel文件需要一个多小时.

我怎样才能用它来更快地导出它?

例子将不胜感激.

1 个回答
  • 选项1:

    看到这个答案.使用名为ClosedXML的库将数据写入Excel.

    选项2:

    获取足够大的范围以容纳所有数据,并将值设置为等于2维范围.这非常快,没有另一个引用另一个库.我尝试了70000条记录.

    // Get an excel instance
    Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
    
    // Get a workbook
    Workbook wb = excel.Workbooks.Add();
    
    // Get a worksheet
    Worksheet ws = wb.Worksheets.Add();
    ws.Name = "Test Export";
    
    // Add column names to the first row
    int col = 1;
    foreach (DataColumn c in table.Columns) {
        ws.Cells[1, col] = c.ColumnName;
        col++;
    }
    
    // Create a 2D array with the data from the table
    int i = 0;
    string[,] data = new string[table.Rows.Count, table.Columns.Count];
    foreach (DataRow row in table.Rows) {                
        int j = 0;
        foreach (DataColumn c in table.Columns) {
            data[i,j] = row[c].ToString();
            j++;
        }
        i++;            
    }                   
    
    // Set the range value to the 2D array
    ws.Range[ws.Cells[2, 1], ws.Cells[table.Rows.Count + 1, table.Columns.Count]].value = data;
    
    // Auto fit columns and rows, show excel, save.. etc
    excel.Columns.AutoFit();
    excel.Rows.AutoFit();
    excel.Visible = true;
    

    编辑:此版本在我的机器上导出了一百万条记录,大约需要一分钟.此示例使用Excel互操作并将行分成100,000个块.

    // Start a stopwatch to time the process
    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
    sw.Start();
    
    // Check if there are rows to process
    if (table != null && table.Rows.Count > 0) {
    
        // Determine the number of chunks
        int chunkSize = 100000;
        double chunkCountD = (double)table.Rows.Count / (double)chunkSize;
        int chunkCount = table.Rows.Count / chunkSize;
        chunkCount = chunkCountD > chunkCount ? chunkCount + 1 : chunkCount;
    
        // Instantiate excel
        Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
    
        // Get a workbook
        Workbook wb = excel.Workbooks.Add();
    
        // Get a worksheet
        Worksheet ws = wb.Worksheets.Add();
        ws.Name = "Test Export";
    
        // Add column names to excel
        int col = 1;                
        foreach (DataColumn c in table.Columns) {
            ws.Cells[1, col] = c.ColumnName;
            col++;
        }
    
        // Build 2D array
        int i = 0;
        string[,] data = new string[table.Rows.Count, table.Columns.Count];
        foreach (DataRow row in table.Rows) {
            int j = 0;
            foreach (DataColumn c in table.Columns) {
                data[i, j] = row[c].ToString();
                j++;
            }
            i++;
        }
    
        int processed = 0;
        int data2DLength = data.GetLength(1);
        for (int chunk = 1; chunk <= chunkCount; chunk++) {
            if (table.Rows.Count - processed < chunkSize) chunkSize = table.Rows.Count - processed;            
            string[,] chunkData = new string[chunkSize, data2DLength];
            int l = 0;
            for (int k = processed; k < chunkSize + processed; k++) {
                for (int m = 0; m < data2DLength; m++) {
                    chunkData[l,m] = table.Rows[k][m].ToString();
                }
                l++;
            }
            // Set the range value to the chunk 2d array
            ws.Range[ws.Cells[2 + processed, 1], ws.Cells[processed + chunkSize + 1, data2DLength]].value = chunkData;
            processed += chunkSize;
        }
    
        // Auto fit columns and rows, show excel, save.. etc
        excel.Columns.AutoFit();
        excel.Rows.AutoFit();
        excel.Visible = true;                
    }
    
    // Stop the stopwatch and display the seconds elapsed
    sw.Stop();
    MessageBox.Show(sw.Elapsed.TotalSeconds.ToString());
    

    2023-01-10 11:19 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有