我开发了一个小型的C#实用程序,它可以打开多个工作簿并将工作表和特定单元格范围复制到合并的工作簿中。该应用程序完美运行,直到我设置Excel.Aplication.Visible = false。然后,它在打开工作簿时抛出COM错误800A03EC。这是当Visible = true时打开的同一位置、同一工作簿。
Excel处理发生在BackgroundWorker线程中。
首先,我启动Excel并打开几个“全局”工作簿,这些工作簿将用作所有合并工作簿的来源。
我省略了循环的其余部分 - 我通过相同的方式打开另外两个工作簿,将工作表复制到目标工作簿中,保存目标工作簿,并关闭这组工作簿以便下一次迭代使用。
错误发生在:
Excel处理发生在BackgroundWorker线程中。
首先,我启动Excel并打开几个“全局”工作簿,这些工作簿将用作所有合并工作簿的来源。
//Start Excel and get Application object.
XL = new Excel.Application();
XL.Visible = true;
//Open workbooks that are used for all providers
sourceTemplate = (Excel._Workbook)(XL.Workbooks.Open(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Provider Summary Template.xlsx")));
currentTemplateSheet = sourceTemplate.Worksheets["Summary"];
sourceAuditPlan = (Excel._Workbook)(XL.Workbooks.Open(Path.Combine(DataSetFolder.Text, "Audit Plan.xlsx")));
currentAuditPlanSheet = sourceAuditPlan.Worksheets["Audit Plan"];
sourceRiskSummary = (Excel._Workbook)(XL.Workbooks.Open(Path.Combine(DataSetFolder.Text, "Provider Risk Summary.xlsx")));
currentRiskSummarySheet = sourceRiskSummary.Worksheets["Visible Risk"];
然后我循环遍历工作簿列表,逐个打开工作簿,并根据在该工作簿中找到的数据打开其他工作簿(例如,为“Dr. One”这位脊椎按摩师打开他的利用率工作簿等)。就是在第一个利用率工作簿上出现了错误。
foreach (string workbook in workbooksList)
{
try
{
//Determine provider ID - in target filename as Dr_[Provider ID]_RVU.xlsx
string providerId = workbook.Substring(workbook.IndexOf("_") + 1, workbook.LastIndexOf("_") - (workbook.IndexOf("_") + 1));
//Open target workbook (Dr_xx_RVU.xlsx)
targetWorkbook = (Excel._Workbook)(XL.Workbooks.Open(workbook));
Excel.Sheets targetWorksheets = targetWorkbook.Worksheets;
currentTargetSheet = (Excel._Worksheet)targetWorksheets.get_Item(1);
//Determine specialty - in cell A1 of first worksheet as [Data Set Name]: [Provider Name], [Specialty]
Excel.Range providerRange = currentTargetSheet.get_Range("A1");
string providerInfo = providerRange.Cells.Value;
string specialty = providerInfo.Substring(providerInfo.LastIndexOf(",") + 2);
string providerName = providerInfo.Substring(providerInfo.LastIndexOf(":") + 2, providerInfo.LastIndexOf(",") - (providerInfo.LastIndexOf(":") + 2));
//Open appropriate Modifier Util workbook, select and copy this provider's worksheet
string sourceWorkbookName = Path.Combine(DataSetFolder.Text, "Modifier Utilization - " + specialty + ".xlsx");
Debug.WriteLine(sourceWorkbookName);
sourceWorkbook = (Excel._Workbook)(XL.Workbooks.Open(sourceWorkbookName));
if (sourceWorkbook == null)
{
Debug.WriteLine("Unable to open worksheet " + sourceWorkbookName);
}
Excel.Sheets sourceWorksheets = sourceWorkbook.Worksheets;
currentSourceSheet = (Excel._Worksheet)sourceWorksheets[providerId];
if (currentSourceSheet == null)
{
Debug.WriteLine("Unable to find " + providerId + " worksheet in " + sourceWorkbookName);
}
currentSourceSheet.Copy(Before: currentTargetSheet); //insert as first worksheet
currentTargetSheet = (Excel._Worksheet)targetWorksheets.get_Item(1);
currentTargetSheet.Name = "Modifier Util";
我省略了循环的其余部分 - 我通过相同的方式打开另外两个工作簿,将工作表复制到目标工作簿中,保存目标工作簿,并关闭这组工作簿以便下一次迭代使用。
错误发生在:
sourceWorkbook = (Excel._Workbook)(XL.Workbooks.Open(sourceWorkbookName));
我看到了sourceWorkbookName的DebugWriteLine,但没有更多信息。Excel打开一个对话框显示错误号800A03EC(我已经进行了研究)。如果我允许应用程序继续处理,在下一次迭代中,它会打开一个对话框,宣布工作簿已经打开,我想重新打开并且失去更改还是继续。根据第一个错误和没有从该工作簿复制任何工作表的事实,这对我来说毫无意义。
同样,当Excel.visible = true时一切正常。
感谢所有建议, Scott