c# 数据放入excel导出,卡顿
前言:导出数据到Excel,导出的时候特别卡顿
原代码:
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IPC.Helper
{
    class ExcelExportUtil
    {
        public static string expotExcel(List<DataTable> hisChartTables,string[] typeNames,string saveFileName)
        {
            try
            {
                Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
                if (xlApp == null)
                {
                    return "无法创建Excel对象,您的电脑可能未安装Excel";
                }
                Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;
                Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
                Microsoft.Office.Interop.Excel.Worksheet worksheet3 = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1 
                Microsoft.Office.Interop.Excel.Worksheet worksheet2 = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.Add(Type.Missing,Type.Missing,Type.Missing,Type.Missing);
                worksheet.Name = typeNames[0];
                //写入标题 
                int titleCount = 1;
                worksheet.Cells[1, titleCount++] = "时间1";
                worksheet.Cells[1, titleCount++] = "参数值";
                worksheet.Cells[1, titleCount++] = "最大值";
                worksheet.Cells[1, titleCount++] = "最小值";
                // 获取当前时间  
                DateTime now = DateTime.Now;
                string formattedTime = now.ToString("yyyy-MM-dd HH:mm:ss");
                Console.WriteLine(formattedTime);
				
                //写入数值
                for (int r = 0; r < hisChartTables[0].Rows.Count; r++)
                {
                    int rowCount = 1;
                    worksheet.Cells[r + 2, rowCount++] = " " + hisChartTables[0].Rows[r]["data_time"].ToString() + "\t";
                    worksheet.Cells[r + 2, rowCount++] = hisChartTables[0].Rows[r]["conc"].ToString();
                    worksheet.Cells[r + 2, rowCount++] = hisChartTables[0].Rows[r]["max"].ToString();
                    worksheet.Cells[r + 2, rowCount++] = hisChartTables[0].Rows[r]["min"].ToString();
                    System.Windows.Forms.Application.DoEvents();
                }
				
				// 获取当前时间  
                DateTime now1 = DateTime.Now;
                string formattedTime1 = now1.ToString("yyyy-MM-dd HH:mm:ss");
                Console.WriteLine(formattedTime1);
				
                worksheet.Columns.EntireColumn.AutoFit();//列宽自适应
                workbook.Saved = true;
                workbook.SaveCopyAs(saveFileName);  //fileSaved = true;
                xlApp.Quit();
                GC.Collect();//强行销毁
                return "导出成功";
            }
            catch(Exception e)
            {
                return e.Message;
            }
             
        }
    }
}
代码中增加了时间记录,发现循环写入这里,近3000条数据要耗时35s左右。于是进行优化,最终优化到仅1s。
优化思路:1、for循环中,遍历时count单独写在外面,否则每次.size()会耗时;
2、写入Excel时,不要单个单元格写入,使用range范围写入;
写入数据部分,修改后代码:
                object[,] datasHead = worksheet.Range["A1", "D1"].Value2;
                datasHead[1, 1] = "时间";
                datasHead[1, 2] = "参数值";
                datasHead[1, 3] = "最大值";
                datasHead[1, 4] = "最小值";
                worksheet.Range["A1", "D1"].Value2 = datasHead;
                //写入数值
                int rowCounts = hisChartTables[0].Rows.Count;
                string lastRange = "D" + rowCounts + 1;
                object[,] datas = worksheet.Range["A2", lastRange].Value2;      
                
                for (int r = 0; r < rowCounts; r++)
                {
                    datas[r+1, 1] = " " + hisChartTables[0].Rows[r]["data_time"].ToString() + "\t";
                    datas[r+1, 2] = hisChartTables[0].Rows[r]["conc"].ToString();
                    datas[r + 1, 3] = hisChartTables[0].Rows[r]["max"].ToString();
                    datas[r + 1, 4] = hisChartTables[0].Rows[r]["min"].ToString();
                    System.Windows.Forms.Application.DoEvents();
                }
                worksheet.Range["A2", lastRange].Value2 = datas;
                    
                
                
            
        
浙公网安备 33010602011771号