我的项目中有一个excel文件,列为资源。
现在,我尝试像这样单击按钮来打开它:
private void Button_Click_Blist(object sender, RoutedEventArgs e)
{
Excel.Application xl = new Excel.Application();
Excel.Workbook wb = xl.Workbooks.Open("Blist.xlsx");
}
我的问题是它说找不到文件并抛出此异常:
System.Runtime.InteropServices.COMException
我们找不到'Blist.xlsx'。对象是否被移动,重命名, 或删除?
答案 0 :(得分:2)
此代码使用OLE Automation启动Excel,并告诉它打开相对路径Blist.xlsx
中的文件。在这种情况下,可执行文件是Excel
,而不是您自己的应用程序。相对路径将使用Excel的工作目录来解析。
为避免此问题,请将绝对文件路径传递给Excel:
var fullPath=Path.GetFullPath("Blist.xlsx");
Excel.Workbook wb = xl.Workbooks.Open(fullPath);
另一种可能无法控制(或依赖)Excel的可能性是,仅使用Process.Start
“启动”文件,例如:
Process.Start("Blist.xlsx");
或
var fullPath=Path.GetFullPath("Blist.xlsx");
Process.Start(fullPath);
Windows Shell将找到可以根据其扩展名打开该文档并启动它的应用程序,并将文件路径作为参数传递。这可以启动Excel,Libre Calc或任何其他打开该特定文件扩展名注册的应用程序。
答案 1 :(得分:0)
因此,我尝试了这种方法,显然.Open()
方法相对路径的复杂性更高(请参阅@PanagiotisKanavos评论)。您可以通过获取当前目录路径并对其进行前置处理(给出文件的绝对路径)来解决:
string filename = "Blist.xlsx";
string currentPath = Directory.GetCurrentDirectory();
var xl = new Microsoft.Office.Interop.Excel.Application();
var wb = xl.Workbooks.Open(currentPath + "\\" + filename);
xl.Visible = true;
但是,您(几乎)应该永远不要在代码中使用硬编码的文件名。因此,上述解决方案仅是示例,不能复制到生产代码中。