最近想鼓搗一個專案,就是從一堆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;
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/232263.html
標籤:C#
