我想打开一个excel文件,等待用户编辑并保存

时间:2014-05-26 08:17:37

标签: c# .net excel process

我想打开一个excel文件并等待用户编辑并保存,然后我使用这些数据。

我正在使用此代码:

        string tempFileName = "test.xlsx";
        MemoryStream ms = DocumentFormat.OpenXml.Extensions.SpreadsheetReader.Create();
        DocumentFormat.OpenXml.Extensions.SpreadsheetWriter.StreamToFile(tempFileName, ms);

        var psi = new ProcessStartInfo(tempFileName);
        var p = new Process();
        p.StartInfo = psi;
        p.Start();

        p.WaitForExit();
        p.Close();
        // use the data

一切都很好。 但问题是,如果在运行此块之前有一个打开的excel文件,我将在p.WaitForExit(); “无效操作例外”行。

我认为原因是:如果已经有一个名为“excel.exe”的进程,我的代码将不会创建另一个等待它退出的进程,并将合并进程或类似的东西。 我可以强制用户关闭所有打开的Excel文档然后运行此代码,或者我自我杀死excel.exe进程并从我的代码再次启动它。我不想使用这些解决方案。

请帮我找到出路! 非常感谢

2 个答案:

答案 0 :(得分:3)

当Excel打开电子表格时,Excel会在与电子表格相同的文件夹中维护一个文件,只要用户打开Excel电子表格,该文件就会存在。文件名(Excel 2007)与您的电子表格文件名相同,但前缀为“〜$”,只需轮询该文件现有或使用电子表格文件夹中的FileSystemWatcher查找它消失 - 这表示用户已停止使用电子表格并关闭它。

答案 1 :(得分:0)

显然这次太晚了,无法帮助OP,但希望这将有助于将来的某些人。在我的情况下,如果功能正常,使用接受的答案(文件名中带有“〜$”)似乎有点问题。作为替代方案,您只需将ProcessStartInfo.FileName设置为“EXCEL.EXE”并将其作为参数提供给文件路径。

var psi = new ProcessStartInfo()
psi.FileName = "EXCEL.EXE";
psi.Arguments = tempFileName;

var p = new Process();
    p.StartInfo = psi;
    p.Start();

    p.WaitForExit();
    p.Close();

当Excel的实例已经打开等时,对我来说很好(至少使用Excel 2013)。您的体验可能会有所不同,具体取决于您的Excel版本。