110,539
社区成员
发帖
与我相关
我的任务
分享
Excel.Application xlApp = new Excel.Application()
static Excel.Application xlApp = new Excel.Application();
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;
}
}
}
}
uiControl.Invoke(delegate{ ......} )
的方式保证阻塞到 UI 主线程中才去访问 Excel。