【发布时间】:2019-04-08 21:29:06
【问题描述】:
我正在尝试异步读取给定工作簿的所有 Excel 工作表,但不知何故并没有发生。这个想法是将每个 Excel 工作表中的前 123 个单元格相加并在最后打印出来。该代码编译并运行没有错误,但它不会读取所有工作表,它只是跳过该部分,因为async。
namespace SyncAndAsync
{
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Excel = Microsoft.Office.Interop.Excel;
class Startup
{
static void Main()
{
string filePath = @"C:\Users\Desktop\Sample.xlsx";
Excel.Application excel = new Excel.Application();
excel.Visible = true;
excel.EnableAnimations = false;
Excel.Workbook wkb = Open(excel, filePath);
var calculation = CalculateAllWorksheetsAsync(wkb);
//foreach (var item in calculation)
//{
// Console.WriteLine(item);
//}
excel.EnableAnimations = true;
wkb.Close(true);
excel.Quit();
}
static async Task<List<Information>> CalculateAllWorksheetsAsync(Excel.Workbook wkb)
{
List<Task<Information>> tasks = new List<Task<Information>>();
foreach (Excel.Worksheet wks in wkb.Worksheets)
{
Task.Run(() => CalculateSingleWorksheetAsync(wks));
}
var results = await Task.WhenAll(tasks);
return new List<Information>(results);
}
static async Task<Information> CalculateSingleWorksheetAsync(Excel.Worksheet wks)
{
Information output = new Information();
int result = 0;
await Task.Run(() =>
{
for (int i = 1; i <= 123; i++)
{
result += (int)(wks.Cells[i, 1].Value);
}
});
output.WorksheetName = wks.Name;
output.WorksheetSum = result;
Console.WriteLine($"{wks.Name} - {result}");
return output;
}
static Excel.Workbook Open(Excel.Application excelInstance,
string fileName, bool readOnly = false,
bool editable = true, bool updateLinks = true)
{
Excel.Workbook book = excelInstance.Workbooks.Open(
fileName, updateLinks, readOnly,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, editable, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing);
return book;
}
}
}
添加Information类使用Task,可能可以跳过:
namespace SyncAndAsync
{
class Information
{
public string WorksheetName { get; set; } = "";
public int WorksheetSum { get; set; } = 0;
}
}
依赖关系:
- 应添加引用
Microsoft.Office.Interop.Excel; - 将
string filePath = @"C:\Users\Desktop\Sample.xlsx";更改为相关内容,并确保在 Excel 文件中每张工作表的第一列中有一些数字,以获得结果;
问题 - 如何使异步运行并显示所有工作表的总和?
【问题讨论】:
-
你不需要等待 var 计算 = CalculateAllWorksheetsAsync(wkb); ?
-
@AJ_ - 一般而言 - 是的,但为此我必须使
Main()异步,并且我正在避免这种情况(出于未知原因)。
标签: c# excel office-interop com-interop excel-interop