Saveas excel不在C#中工作

时间:2015-07-01 11:57:04

标签: c# windows excel

我正在使用SQL服务器处理c#windows应用程序。     当我尝试在c#中的excel中执行Save-as时,我收到如下错误。但是在workbook.open语句和workbook.saveas中我将readonly属性更改为false。我只需要保存同名的excel。任何人都可以帮助我。

  

无法访问只读文档filename.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();      

1 个答案:

答案 0 :(得分:1)

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

  

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

删除此选项确实可以解决错误。或者,如果您不想分享工作簿,则将标志设置为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块。只捕获您可以处理和恢复的错误。然后在finally块中:

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();