VSTO SaveAs 文件被锁定

Posted

技术标签:

【中文标题】VSTO SaveAs 文件被锁定【英文标题】:VSTO SaveAs file locked 【发布时间】:2016-01-21 23:24:08 【问题描述】:

我正在尝试使用 C# VSTO 将工作表 SaveAs() 保存为 csv 文件,并在将该 csv 文件加载到字符串后立即进行操作。问题是除非我关闭()工作簿,否则我无法访问新创建的 csv 文件。该错误与“文件锁定”问题有关。如果我关闭工作簿或将其复制到空白工作簿,那么我总是能够访问该文件,但是这些不是理想的解决方案。关于如何避免文件锁定的任何想法?

   Excel.Worksheet sheet = workbook.Sheets[sheetName];
   sheet.Activate();
   sheet.Unprotect();
   sheet.SaveAs(fileName, Excel.XlFileFormat.xlCSV, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing);

   workbook.Close();  <-- Don't want that happen

  // Get the Input CSV.
   string contents = File.ReadAllText(InputCsvFileName);

【问题讨论】:

您要读取被另一个进程锁定的文件。试试这个解决方案。 ***.com/questions/3560651/… 我看不出这个问题与 VBA 有什么关系?为什么是 VBA 标签?如果不涉及 VBA,请编辑问题并删除标签... @CindyMeister 因为同样的事情也发生在 VBA 上。 【参考方案1】:

@Jim 的原因是,使用 SaveAs 方法,您不再位于“旧”-source- Worksheet 中,而是位于 SaveAs 中的目标文件中。请记住,打开“源”工作簿后所做的更改不会保留在“源”中,而是保留在“目标”(SaveAs)工作簿中。

因此,如果您开始在 WorkbookA.xlsm 中工作,激活 SheetA,将 SheetA 保存为 SheetA.csv,那么您现在在 SheetA 中。csv 在 Excel 中。

(注意:如果您手动执行此操作或通过手动运行 VBA,这会产生一个奇怪的副作用,即如果您的源包含两个工作表,.csv 似乎也有两个工作表,但在重新打开 .csv 后,只有保存的工作表被持久化了)

由此您可以说,如果您打算继续在 -source- 中工作,元步骤是:

开源 进行更改 保存源(可选 - 仅当您想要更改源时) 另存为 .csv(您现在在 .csv 中) 关闭 .csv 重新开源 继续在 Source 上工作 打开 .csv 文件以执行您计划执行的任何操作

【讨论】:

感谢您的解释。所以基本上我遵循的过程是正确的:将工作表复制到空白工作簿,然后保存并关闭它,然后我可以访问该文件。

以上是关于VSTO SaveAs 文件被锁定的主要内容,如果未能解决你的问题,请参考以下文章

SaveAs 命令不起作用,但 SaveCopyAs 可以

SaveAs 方法被配置为需要有根路径,而路径 <blah> 是没有根的

vb.NET SaveAs 不保存所有 Excel 数据

VSTO证书不受信任,Office Addin无法安装问题的解决

删除被进程访问而锁定的文件

201207:SVN提示文件被锁定不能更新-啥是k8s