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();
问题在于保存文档时标志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();