C# Excel.Application 多线程 Static 静态
方法很基础,我已封装成个了类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加密合并等工程实践。文章还提供了可上生产环境的批量
C# Winform通用进度条弹窗组件:解决界面卡死与多线程更新
在桌面应用开发中,Winform的单线程UI模型常因耗时操作导致界面假死、白屏,严重影响用户体验。理解消息循环与多线程协作是解决此类问题的核心。通过引入独立的进度条弹窗组件,将耗时任务与界面更新解耦,利用Task.Run、IProgress或BackgroundWorker实现后台执行,并借助Invoke/BeginInvoke安全更新控件,能够在批量导出Excel、上位机数据采集、大文件解析等场景中提供实时反馈与取消能力。本文完整讲解可复用组件的设计思路、核心代码与踩坑实践,帮助开发者快速构建稳定可靠的进
C#将Excel转成PDF的方法
今天小编就为大家分享一篇关于C#将Excel转成PDF的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
C# 操作Excel大全
C# 操作Excel大全 c//删除行 //删除一列数据 //设置背景色 //设置Format属性 等


