Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#关闭错误中打开Excel文件_C#_.net_Excel_Automation - Fatal编程技术网

在C#关闭错误中打开Excel文件

在C#关闭错误中打开Excel文件,c#,.net,excel,automation,C#,.net,Excel,Automation,我正在.NET4.0(C#)中打开一个Excel文件。我正在使用interop的12.0版本。Excel文件是xls(旧的)。我可以很好地打开它,但workbook.close()会导致COM异常,但没有任何实际细节 oExcel = new Application(); oExcel.Visible = true; oExcel.DisplayAlerts = false; oBooks = oExcel.Workbooks; oBook = null; oBook = oBooks.Ope

我正在.NET4.0(C#)中打开一个Excel文件。我正在使用interop的12.0版本。Excel文件是xls(旧的)。我可以很好地打开它,但workbook.close()会导致COM异常,但没有任何实际细节

oExcel = new Application();
oExcel.Visible = true;
oExcel.DisplayAlerts = false;

oBooks = oExcel.Workbooks;
oBook = null;
oBook = oBooks.Open(finalFilename);

oBook.Close();   // this gives COM Exception
知道我做错了什么吗


这是有趣的事情。我不必保存这个。在它完成了它需要做的事情之后,我把我需要的数据取出并存储起来,我刚刚复制的工作簿就可以离开了

根据我的经验,打开和关闭文件时出现的错误很可能表明文件存在问题。Exceldesktop非常宽容,可以优雅地处理文件中的任何问题。该文件在Excel中的外观和工作状态可能良好,但不会显示出任何错误


您可以尝试在Excel中重新保存该文件。如果仍然不起作用,请尝试创建新的电子表格并从旧文件复制内容。

Workbook.Close似乎不包含不带参数的方法Close

方法签名: 无效关闭( 对象保存更改, 对象文件名, 对象路由工作簿 )

你的代码

            objWorkbook.Save();         
            objWorkbook.Close(true, @"C:\Documents and Settings\Administrator\b.xls", true);
            objExcel.Quit();

因此,我保存了一个空白工作簿,它可以正常工作。但是,这不是一个选项,因为我必须使用这些生成的工作簿,其中包含大量vba/dll代码。此工作簿具有数字签名的加载项,因此不确定这是否会导致问题?我不在乎签名,但我怎样才能找出是什么导致了这一悬而未决的问题?恐怕我没有更好的答案。如果工作簿是由第三方软件预生成的,那么许多事情都可能出错。我的直觉是,你必须重新创建工作簿,省去很多麻烦,即使这需要一些复制和粘贴。谢谢ytran。这基本上是他们制作的应用程序,而不是你的普通工作簿,所以这是不可能的。不过我越来越近了。我从C#向VBA项目中注入了一个函数,该函数从VBA关闭工作簿。这是可行的,但是当它返回到C#时会抛出一个错误,但我只是捕获它并忽略它。除了EXCEL.exe进程保持运行外,其他一切都正常工作。只需要知道我做了什么错误。尝试将参数铸造为对象,所以当我调用SaveE()时,它会提示我关于Add in XLA项目。“此位置存在名为'addin name here'的文件。你想更换它吗。这对我来说真的没有意义,为什么它认为它在我打开文件的同一个位置,因为我在那里没有看到它。就好像它试图在XLA安装的地方保存它一样。不知道为什么它会这么做。我想SAVER()只会查看工作簿本身而不是XLA。如果我从桌面excel保存,它将不会提示我。excel不会退出,因为你的应用程序仍保留对COM对象的引用。我猜你至少调用了COM对象的一个成员,但没有将其分配给变量。永远不要对COM对象使用2个点…我现在没有。如果我省略Save()和Close(),我会得到一个提示,询问我是否保存。如果手动选择“保存”,则所有操作都将正确结束,EXCEL过程将完成。因此,通过使用SaveE()函数,我得到了这个XLA提示,说要覆盖原来的XLA文件,如果我可以删除那个提示,我认为这会起作用。删除并保存,看看这个,也许有帮助:
        Excel.Application objExcel = new Excel.Application();
        Excel.Workbook objWorkbook = (Excel.Workbook)(objExcel.Workbooks._Open(@"D:\a.xls", true,
        false, Missing.Value, Missing.Value, Missing.Value,
        Missing.Value, Missing.Value, Missing.Value,
        Missing.Value, Missing.Value, Missing.Value,
        Missing.Value));
            objWorkbook.Save();         
            objWorkbook.Close(true, @"C:\Documents and Settings\Administrator\b.xls", true);
            objExcel.Quit();