我使用Office.Interop.Excell库创建一个CSV(带有';'作为分隔符)文件。创建CSV文件时出现偶然IOException'进程无法访问文件...'
以下代码在我的电脑上正常工作,但我的一个客户端有时会得到IO.Exception:'进程无法访问文件,因为它正在被另一个进程使用'。
奇怪的是,这个错误并不八方通雨后春笋般冒出来,有时它的工作原理,有时它does not ...
有什么能为我的客户这个偶然IO.Exception的原因。这是我的代码:
public static void GenerateCsvFile(DataSet ds, string paramFileFullPath, Dictionary<string, string[]> tableHeaders)
{
object missing = System.Reflection.Missing.Value;
var excel = new Application { DisplayAlerts = false };
Workbook workbook = null;
try
{
workbook = excel.Application.Workbooks.Add(true);
foreach (System.Data.DataTable dt in ds.Tables)
AddTableSheet(ref workbook, ref excel, dt, true, tableHeaders[dt.TableName], false);
workbook.SaveAs(paramFileFullPath, XlFileFormat.xlTextMSDOS, missing, missing, false, false,
XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing);
}
finally
{
CleanupExcel(excel, workbook);
}
File.WriteAllText(paramFileFullPath, File.ReadAllText(paramFileFullPath).Replace("\t", ";"));
}
我猜的错误有时来自行:
File.WriteAllText(paramFileFullPath, File.ReadAllText(paramFileFullPath).Replace("\t", ";"));
有可能是什么问题我正在清洗/关闭Excel中的方法是什么?
private static void CleanupExcel(Application excel, Workbook workbook)
{
if (excel == null)
return;
excel.DisplayAlerts = false;
excel.Quit();
if (workbook != null)
Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(excel);
}
又是如何得出这个永诺对我的作品,但我的客户的电脑上它只能像1出5次......
工作簿关闭并处置 –
您还没有ReleaseComObject所有COM对象(例如excel.Application.Workbooks)。请参阅https://ausdotnet.wordpress.com/2008/05/26/com-interop-principle-2-fear-the-period/。 – mjwills
作为一个快速和肮脏的,添加GC.Collect(); GC.WaitForPendingFinalizers();在CleanupExcel方法的末尾。 – mjwills