我正在使用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();
答案 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();