【发布时间】:2014-05-17 21:28:38
【问题描述】:
我开发了一个小型 C# 实用程序,可以打开多个工作簿并将工作表和特定单元格区域复制到合并的工作簿中。该应用程序完美运行,直到我设置 Excel.Aplication.Visible = false。然后,它会在打开工作簿时引发 COM 错误 800A03EC。这是在 Visible = true 时打开的同一个位置、同一个工作簿。
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"];
然后我遍历工作簿列表,一次打开一个,并根据该工作簿中的数据打开其他工作簿(因此打开脊医 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 时,一切都很好。
感谢所有建议, 斯科特
【问题讨论】:
-
Excel(和 Word)在运行不可见时是出了名的善变 :( 如果错误所在的行是自行运行而不是在循环内运行,它是否有效?例如:XL = new Excel.Application(); XL.Visible = false; sourceWorkbook = (Excel._Workbook)(XL.Workbooks.Open("C:\MyFile.xlsx"));