创建CSV文件时偶尔发生IOException'进程无法访问该文件...'

时间:2017-06-06 13:38:16

标签: c# excel office-interop ioexception

我正在使用Office.Interop.Excell库创建CSV(使用&#39 ;;'作为分隔符)文件。

以下代码在我的计算机上正常工作,但我的一个客户端有时会获得IO.Exception:'进程无法访问该文件,因为它正由另一个进程使用'。

奇怪的是,这个错误并不总是突然冒出来,有时它会起作用,有时它不会...

这可能是我客户偶尔发生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);
    }

为什么这对我来说总是有用,但是在我客户的PC上它只有5次中有1次起作用......

1 个答案:

答案 0 :(得分:2)

  

但我的一个客户有时会得到IO.Exception:'进程无法访问该文件,因为它正由另一个进程使用'。

我应该打赌多少基本问题是客户端在尝试运行代码时是否在Excel中保持文件打开状态? ;)