C# Excel.Application 多线程 Static 静态

6lilu9 6lilu9 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
最近想鼓捣一个项目,就是从一堆Excel文件(大概500+)中读取数据;
方法很基础,我已封装成个了类DoInExcel(见文末代码);
过程中发现执行这句代码速度太慢,
Excel.Application xlApp = new Excel.Application()

于是想了两个方法:
第一个方法思路就是只建一个类,循环打开关闭;
第二个方法就是多线程;
这两个方法都很有效;第二个方法速度更快一点;

第三个方法想混合第一个和第二个方法,但却出现了错误,提示“消息筛选器显示应用程序正在使用中。

请高手帮忙看看什么原因。

另外我还有个突发其想,既然运行慢的原因是每次都初始化一下xlApp,那直接把DoInExcel类中的这句代码改为
  static Excel.Application xlApp = new Excel.Application();

可不可行呢?
剧透一下:我测试了一下(当然是注释掉//dE2.Quit();再测试),在方法一中可行的,但在方法二(多线程中)不可行,也不知什么原因。




using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Excel = Microsoft.Office.Interop.Excel;

namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{

Do();
Console.ReadKey();
}

static async void Do()
{
string Path = @"G:\22\2020";



List<FileInfo> OrFileList1 = new DirectoryInfo(Path).GetFiles().ToList();

Stopwatch sw = new Stopwatch();

Console.WriteLine("经典常规操作:也是最费时的操作,10个文件耗时为:");
sw.Start();//结束计时
foreach (var item in OrFileList1)
{
DoInExcel dE0 = new DoInExcel(false);
dE0.Open(item.FullName);
string ss = dE0.GetDate();
dE0.Close();
dE0.Quit();
}
sw.Stop();
Console.WriteLine(sw.Elapsed);

Console.WriteLine("方法一:只建一个类,循环打开关闭");
sw.Reset();
sw.Start();//结束计时
DoInExcel dE = new DoInExcel(false);
foreach (var item in OrFileList1)
{
dE.Open(item.FullName);
string ss = dE.GetDate();
dE.Close();

}
dE.Quit();
sw.Stop();
Console.WriteLine(sw.Elapsed);

Console.WriteLine("--------------------------------------------");
Console.WriteLine("方法二:多线程,同样10个文件耗时为:");
sw.Reset();
sw.Start();
List<Task> TaskList = new List<Task>();
foreach (var item in OrFileList1)
{
TaskList.Add(Task.Run(() =>
{
DoInExcel dE2 = new DoInExcel(false);
dE2.Open(item.FullName);
string ss = dE2.GetDate();
dE2.Close();
dE2.Quit();
}));
}
await Task.WhenAll(TaskList.ToArray());
sw.Stop();
Console.WriteLine(sw.Elapsed);

Console.WriteLine("--------------------------------------------");
Console.WriteLine("方法三:方法一+方法二,Open语句有故障");
sw.Reset();
sw.Start();
List<Task> TaskList3 = new List<Task>();
DoInExcel dE3 = new DoInExcel(false);
foreach (var item in OrFileList1)
{
TaskList3.Add(Task.Run(() =>
{
dE3.Open(item.FullName);
string ss = dE3.GetDate();
dE3.Close();
}));

}
await Task.WhenAll(TaskList3.ToArray());
dE3.Quit();
sw.Stop();
Console.WriteLine(sw.Elapsed);

}

}

public class DoInExcel
{
Excel.Application xlApp = new Excel.Application();//这代码太耽误时间了
Excel.Workbook oWbook;
Excel.Worksheet oWSheet;


public DoInExcel(bool ViseFlag = true)
{
xlApp.Visible = ViseFlag;
}

public void Open(string fileFullName)
{
oWbook = xlApp.Workbooks.Open(fileFullName);
oWSheet = oWbook.Sheets[1];
}

public string GetDate()
{
return oWSheet.get_Range("A1").Value;
}

public void WritDate(string Str)
{
oWSheet.get_Range("A1").Value = Str;
}

public void Close(bool savechange = true)
{
oWSheet = null;

oWbook.Close(savechange);
oWbook = null;
}
public void Quit()
{
xlApp.DisplayAlerts = true;

if (oWbook != null) this.Close();

if (xlApp != null)
{
xlApp.Workbooks.Close();
xlApp.Quit();
xlApp = null;
}
}

}

}


...全文

相关推荐

C#中使用savefiledialog保存为excel文件

C#中使用savefiledialog保存为excel文件

水果杀手呵呵

C#实现Excel转PDF的完整方案与避坑指南

在办公自动化和报表系统中,将Excel转换为PDF是常见的硬性需求,尤其在服务器端无人值守场景下,格式还原度与稳定性至关重要。本文从文档转换的技术原理出发,对比Office COM组件、Aspose.Cells和LibreOffice命令行三条主流技术路线的优劣势,解析渲染过程中的字体映射、图表绘制和页面设置等关键机制。针对企业级应用,重点阐述如何通过Aspose.Cells在.NET环境中实现高保真转换,并分享并发控制、内存管理、隐藏Sheet处理及PDF加密合并等工程实践。文章还提供了可上生产环境的批量

weixin_33795093

C# Winform通用进度条弹窗组件:解决界面卡死与多线程更新

在桌面应用开发中,Winform的单线程UI模型常因耗时操作导致界面假死、白屏,严重影响用户体验。理解消息循环与多线程协作是解决此类问题的核心。通过引入独立的进度条弹窗组件,将耗时任务与界面更新解耦,利用Task.Run、IProgress或BackgroundWorker实现后台执行,并借助Invoke/BeginInvoke安全更新控件,能够在批量导出Excel、上位机数据采集、大文件解析等场景中提供实时反馈与取消能力。本文完整讲解可复用组件的设计思路、核心代码与踩坑实践,帮助开发者快速构建稳定可靠的进

weixin_33805743

C#将Excel转成PDF的方法

今天小编就为大家分享一篇关于C#将Excel转成PDF的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

weixin_38528680

C# 操作Excel大全

C# 操作Excel大全 c//删除行 //删除一列数据 //设置背景色 //设置Format属性 等

simen_ok
评论 17
收藏 已收藏
分享
返回顶部
6lilu9
C# 111,129 成员 642,539 内容