从C#打开Excel文件

时间:2012-07-25 11:38:20

标签: c# excel excel-interop

使用Microsoft.Office.Interop.Excel对象从C#使用Excel时遇到问题。

问题出现在我尝试打开要写入的文件时,我已经在Excel中打开了。这最终会出现错误,然后在后台运行Excel实例。

如何在打开文件之前判断文件是否已打开?

使用Excel对象处理并因此终止Excel进程的惯例是什么?

3 个答案:

答案 0 :(得分:2)

以下文章提供了检查文件是否已打开的好方法:

Is there a way to check if a file is in use?

本文讨论了杀死excel进程:

Kill Process Excel C#

希望这些有用

答案 1 :(得分:0)

您好,您必须在处理结束时处置您的excel对象(工作簿,applicationClass,usedRange,工作表)

        workbook.Close(false, workbookPath, null);
        applicationClass.Quit();

        while (Marshal.ReleaseComObject(usedRange) > 0)
        { }
        while (Marshal.ReleaseComObject(worksheet) > 0)
        { }
        while (Marshal.ReleaseComObject(workbook) > 0)
        { }
        while (Marshal.ReleaseComObject(applicationClass) > 0)
        { }

答案 2 :(得分:0)

用于打开已经打开的 - 更简单的类型Workbooks.Open在MSDN上。 这是保存示例,您只需覆盖(仍然打开)而不查询:o), xlShared xlLocalSessionChanges 是关键字。

            _xlsWorkbook.SaveAs(
                 targetFileName                                                     /* Filename */
                ,Excel_ForMissing.XlFileFormat.xlExcel8                             /* FileFormat */
                ,Missing.Value                                                      /* Password */
                ,Missing.Value                                                      /* WriteResPassword */
                ,Missing.Value                                                      /* ReadOnlyRecommended */
                ,Missing.Value                                                      /* CreateBackup */
                ,Excel_ForMissing.XlSaveAsAccessMode.xlShared                       /* AccessMode */
                ,Excel_ForMissing.XlSaveConflictResolution.xlLocalSessionChanges    /* ConflictResolution */
                ,false                                                       /* AddToMru */
                ,Missing.Value                                                       /* TextCodepage */
                ,Missing.Value                                                       /* TextVisualLayout */
                ,true                                                       /* Local */
            );