我有一个C#应用程序,我在数据库中从数据创建大量Excel文件。这部分工作正常。但是,我的用户询问是否可以修改工作表选项卡以反映数据库中的字段。这听起来很简单,但是,当我尝试重置名称时,它告诉我它是只读的,无法设置。我尝试过以下内容并没有奏效:
xlApp.Sheets[0].Range["A1"].Value = "NewTabName";
还试过:
xlApp.Name = "NewTabName";
我进行了谷歌搜索,看到了其他一些对我不起作用的方法。一些回复表明它是只读的,无法完成。
这似乎应该很简单。我怎么能这样做。
答案 0 :(得分:22)
您需要访问实际工作表。尝试类似:
Microsoft.Office.Interop.Excel.Worksheet worksheet = (Worksheet)xlApp.Worksheets["Sheet1"];
worksheet.Name = “NewTabName”;
答案 1 :(得分:0)
这是我从现有代码复制的一个相当完整的示例。
使用 Office 365 中的 Excel 在 Windows 10 上完美运行
确保您添加对-的引用 Microsoft.Office.Interop.Excel
我的这个 DLL 的路径(可能因办公版本而异)- C:\WINDOWS\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll
// Add this at top of C# file -
using Excel = Microsoft.Office.Interop.Excel;
// In your class or function -
private static Excel.Application XlApp = null;
private static Excel.Workbook XlWorkbook = null;
// In your function -
XlApp = new Excel.ApplicationClass();
// Load workbook
XlWorkbook = XlApp.Workbooks.Open(@"Filename.xls",
0, false, Type.Missing, "", "", true, Excel.XlPlatform.xlWindows,
Type.Missing, Type.Missing, Type.Missing,
Type.Missing, true, Type.Missing,
Type.Missing);
// Get reference to sheet
XlWorksheet = (Excel.Worksheet)XlWorkbook.Worksheets["Sheet1"];
int numsheets = XlWorkbook.Sheets.Count;
// iterates through all sheets (1-n inclusive, not zero based)
for(int i=1;i<=numsheets;i++)
{
Excel.Worksheet sht = (Excel.Worksheet)XlWorkbook.Worksheets[i];
// Show sheet name
Console.WriteLine(i+" "+sht.Name);
}
// To save with a same or different filename
XlWorkbook.SaveAs(@"Filename.xls",
Excel.XlFileFormat.xlWorkbookNormal, "",
"", false, false,
Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing,
true, Type.Missing, Type.Missing, Type.Missing);
// Close Excel
XlWorkbook.Close(true, Type.Missing, Type.Missing);
XlApp.Quit();
// Ensure you release resources
releaseObject(XlApp);
releaseObject(XlWorkbook);
releaseObject(XlWorksheet);
从上面调用的单独函数
private static void releaseObject(object obj)
{
// try .. catch
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
}