我想打开一个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进程并从我的代码再次启动它。我不想使用这些解决方案。
请帮我找到出路! 非常感谢
答案 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版本。