首页 > 编程语言 >c# 数据放入excel导出,卡顿

c# 数据放入excel导出,卡顿

时间:2024-01-26 16:24:06浏览次数:37  
标签:Rows c# worksheet excel Excel ++ hisChartTables ToString 卡顿

前言:导出数据到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;

  

 

标签:Rows,c#,worksheet,excel,Excel,++,hisChartTables,ToString,卡顿
From: https://www.cnblogs.com/webttt/p/17989634

相关文章

  • 【链交理论】CF1336F Journey
    瞻仰遗迹,沐浴圣光。Description给出一颗\(n\)个节点的树,以及\(m\)条链,求有多少对链满足其交的边数\(\geqk\)。这个题其实有一个Hint是CF1486F,比这个简单了很多倍。Solution我们考虑用\((s,t,lca)\)来表示一条\(s\tot(dfn_s<dfn_t)\)的链,其中\(lca\)表......
  • C语言---Day7
    16、指针---windows电脑在数据存储是采用小端对齐---指针就是内存地址,指针变量是用来存放内存地址的变量;每一个变量都有一个内存位置,每一个内存位置都定义了可使用 & 运算符访问的地址,它表示了在内存中的一个地址---在32位操作系统下,所有指针类型都是4个字节大小;  在64位......
  • cloudreve
    前期准备:(文件在网站下留言我发你)一台虚拟机:教程开始:使用scp命令把包传上去[root@localhost~]#mkdir/cloudreve_data[root@localhost~]#mvcloudreve_3.8.3_linux_amd64.tar.gz/cloudreve_data/[root@localhost~]#cd/cloudreve_data/[root@localhostcloudreve......
  • 有关以太网V2的MAC帧与PPP帧的封装成帧原理
    一、什么是封装成帧封装成帧是指数据链路层给上层交付的协议数据单元添加帧头和帧尾使之成为帧二、帧头和帧尾帧头:包含重要的控制信息帧尾:用于记录冗余码-------------->帧头和帧尾的作用之一是帧定界。这里的控制信息与冗余码在后面会详细解说。三、常见的帧类型:以......
  • THUWC2024 游记
    已经是老年选手了。Day0从成都坐车到重庆。到酒店就四点多了,打了个车去巴蜀,车上学弟问师傅有什么火锅店推荐,然后司机直接给我们送过去了(?)火速签到,火速试机,然后监考下班了(?)后来又说加班半个小时,登了下OJ写了个A+B就run了。见到了清华学长cxy哥哥!!!晚上把路上口胡的题写......
  • C转C++速成浅入浅出系列——STL之queue
    本系列为应付考研复试用,知识浅入浅出,很多地方不深究细节原理;如有谬误,欢迎大家指出。queue【queue:队伍,队列】(学过数据结构的熟的不能再熟了吧)理解为队列。特点是①先入先出②只能对队伍的队首进行出队操作,对队伍的队尾进行入队操作。需提供头文件#include<queue>由于队列的......
  • Python中为何使用新语法而不是装饰器来实现async/await异步功能
    Python是一种多范式编程语言,通过引入新的语法和特性,不断提升其功能和灵活性。在异步编程领域,Python引入了async/await关键字来实现协程和异步操作,而不是使用已有的装饰器语法。本文将探讨为何Python选择引入新语法来实现async/await异步功能,以及与装饰器的区别和优势。一、理解异步......
  • Easysearch:语义搜索、知识图和向量数据库概述
    什么是语义搜索?语义搜索是一种使用自然语言处理算法来理解单词和短语的含义和上下文以提供更准确的搜索结果的搜索技术。旨在更好地理解用户的意图和查询内容,而不仅仅是根据关键词匹配,还通过分析查询的语义和上下文来提供更准确和相关的搜索结果。传统的关键词搜索主要依赖于对关键......
  • itop-RK3588开发板机器视觉开发OpenCV-Python的安装
    由于 iTOP-RK3588 编译安卓和 Linux 源码使用的 ubuntu 版本为 ubuntu20.04,为了方便和统一,本手册的实验环境也为 Ubuntu20.04,如果使用的是其他版本的 ubuntu。可能会存在一些细微的区别,建议大家所使用的 ubuntu 版本和我们保持一致。使用以下命令安装 OpenCV-Python,安......
  • 华为云CCE Turbo:基于eBPF的用户自定义多粒度网络监控能力
    本文分享自华为云社区《华为云CCETurbo:基于eBPF的用户自定义多粒度网络监控能力》,作者:云容器大未来。基于eBPF的容器监控的兴起容器具有极致弹性、标准运行时、易于部署等优点,越来越多的客户选择使用容器来部署自己的服务,随着容器规模越来越大,容器间网络交互也越来越复杂。我们需......