C#自动化Excel只有在Excel可见时才能正常工作。

3
我开发了一个小型的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"];

然后我循环遍历工作簿列表,逐个打开工作簿,并根据在该工作簿中找到的数据打开其他工作簿(例如,为“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


Excel(和Word)在运行不可见时非常棘手 :( 如果出错的那一行单独运行而不是在循环内部运行,它是否有效?例如:XL = new Excel.Application(); XL.Visible = false; sourceWorkbook = (Excel._Workbook)(XL.Workbooks.Open("C:\MyFile.xlsx")); - TechyGypo
1个回答

0

你试过将sourceWorkbookName设置为没有空格的基本文件名,放在没有任何权限问题的目录中吗?我知道这很冒险,但对我来说,这是开始的地方,我曾经遇到过一些关于Excel 2007的奇怪行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接