Saveas excel在C#中不起作用

本文关键字:不起作用 excel Saveas | 更新日期: 2023-09-27 18:00:41

我正在使用SQL server开发c#windows应用程序。当我在c#中尝试在excel中保存为时,我遇到了如下错误。但在workbook.open语句和workbook.saveas内部,正在将readonly属性更改为false。我只需要用相同的名称保存excel。有人能帮我吗?

无法访问只读文档文件名.xlsx

private static Microsoft.Office.Interop.Excel.Workbook mWorkBook;
    private static Microsoft.Office.Interop.Excel.Sheets mWorkSheets;
    private static Microsoft.Office.Interop.Excel.Worksheet mWSheet1;
    private static Microsoft.Office.Interop.Excel.Application oXL;
    string path = @"D:'Test'test.xlsx";
    oXL = new Microsoft.Office.Interop.Excel.Application();
    oXL.Visible = true;
    oXL.DisplayAlerts = false;
    mWorkBook = oXL.Workbooks.Open(path, 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
    //Get all the sheets in the workbook
    mWorkSheets = mWorkBook.Worksheets;
    //Get the allready exists sheet
    mWSheet1 = Microsoft.Office.Interop.Excel.Worksheet)mWorkSheets.get_Item("Sheet1");
    mWSheet1.Cells[i+2, 5] = DBDaysWorked;
    mWorkBook.SaveAs(path,                                              System.Reflection.Missing.Value,
    System.Reflection.Missing.Value,
    System.Reflection.Missing.Value,
    false,false,                         Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlShared,
    false,
    false,
    System.Reflection.Missing.Value,
    System.Reflection.Missing.Value,
    System.Reflection.Missing.Value);
    mWorkBook.Close(Missing.Value, Missing.Value, Missing.Value);
    mWSheet1 = null;
    mWorkBook = null;
    oXL.Quit();
    GC.WaitForPendingFinalizers();
    GC.Collect();      

Saveas excel在C#中不起作用

问题在于保存文档时标志XlSaveAsAccessMode.xlShared,它抛出错误:

无法共享此工作簿,因为已为此工作簿启用了隐私。若要共享此工作簿,请单击"文件"选项卡,然后单击"Excel选项"。在"Excel选项"对话框中,单击"信任中心",然后单击"信任Center设置"按钮。在"隐私选项"类别中,清除选项"保存时从文件属性中删除个人信息"旁边的复选框。

删除此选项确实可以修复错误。或者,如果您不关心共享工作簿,则将标志设置为XlSaveAsAccessMode.xlNoChange也可以。

我不确定是否可以自动从工作簿中删除此属性以防止出现错误。

为了记录在案,我通过简单地将代码包装在try/catch中并抛出一个错误来找到这一点。。。

垃圾收集

try块之前,您现在应该添加提示提示;-)

将所有内容初始化为null,以便在finally块中可以访问它。

Microsoft.Office.Interop.Excel.Workbook mWorkBook = null;
Microsoft.Office.Interop.Excel.Sheets mWorkSheets = null;
Microsoft.Office.Interop.Excel.Worksheet mWSheet1 = null;
Microsoft.Office.Interop.Excel.Application oXL = null;

您的普通代码很好,可以进入try块。只捕获您可以处理和恢复的错误。然后在最后一块:

if (mWorkBook != null)
{
    mWorkBook.Close(Missing.Value, Missing.Value, Missing.Value);
}
if (oXL != null)
{
    oXL.Quit();
    if (mWSheet1 != null)
    {
        Marshal.FinalReleaseComObject(mWSheet1);
        mWSheet1 = null;
    }
    if (mWorkSheets != null)
    {
        Marshal.FinalReleaseComObject(mWorkSheets);
        mWorkSheets = null;
    }
    if (mWorkBook != null)
    {
        Marshal.FinalReleaseComObject(mWorkBook);
        mWorkBook = null;
    }
    Marshal.FinalReleaseComObject(oXL);
    oXL = null;
}
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();