C#-如何以编程方式添加Excel工作表-Office XP/2003
本文关键字:工作 -Office XP 2003 Excel 添加 编程 方式 C#- | 更新日期: 2023-09-27 17:48:53
我刚刚开始通过C#摆弄Excel,以便能够自动创建和添加到Excel文件中。
我可以打开文件并更新其数据,然后浏览现有的工作表。我的问题是如何添加新工作表?
我试过了:
Excel.Worksheet newWorksheet;
newWorksheet = (Excel.Worksheet)excelApp.ThisWorkbook.Worksheets.Add(
Type.Missing, Type.Missing, Type.Missing, Type.Missing);
但我得到了COM异常,我的谷歌搜索没有给我任何答案。
HRESULT:0x800A03EC的异常源为:"Interop.Excel"
我希望有人能让我摆脱痛苦。
您需要在项目中将COM引用添加到"Microsoft Excel 11.0 Object Library
"或任何合适的版本。
这个代码对我有效:
private void AddWorksheetToExcelWorkbook(string fullFilename,string worksheetName)
{
Microsoft.Office.Interop.Excel.Application xlApp = null;
Workbook xlWorkbook = null;
Sheets xlSheets = null;
Worksheet xlNewSheet = null;
try {
xlApp = new Microsoft.Office.Interop.Excel.Application();
if (xlApp == null)
return;
// Uncomment the line below if you want to see what's happening in Excel
// xlApp.Visible = true;
xlWorkbook = xlApp.Workbooks.Open(fullFilename, 0, false, 5, "", "",
false, XlPlatform.xlWindows, "",
true, false, 0, true, false, false);
xlSheets = xlWorkbook.Sheets as Sheets;
// The first argument below inserts the new worksheet as the first one
xlNewSheet = (Worksheet)xlSheets.Add(xlSheets[1], Type.Missing, Type.Missing, Type.Missing);
xlNewSheet.Name = worksheetName;
xlWorkbook.Save();
xlWorkbook.Close(Type.Missing,Type.Missing,Type.Missing);
xlApp.Quit();
}
finally {
Marshal.ReleaseComObject(xlNewSheet);
Marshal.ReleaseComObject(xlSheets);
Marshal.ReleaseComObject(xlWorkbook);
Marshal.ReleaseComObject(xlApp);
xlApp = null;
}
}
请注意,在正确清理和释放COM对象引用时需要非常小心。StackOverflow问题中包含一条有用的经验法则:"永远不要对COM对象使用2个点"。在您的代码中;你会遇到真正的麻烦的我上面的演示代码没有正确清理Excel应用程序,但这只是一个开始
我发现在研究这个问题时有用的其他一些链接:
- 用C语言打开和导航Excel#
- 如何:使用COM Interop创建Excel电子表格(C#编程指南)
- 如何:将新工作表添加到工作簿
根据MSDN
若要使用COM互操作,必须具有管理员或高级用户安全权限。
希望能有所帮助。
非常感谢您的回复@AR,你是个明星,而且效果很好。我昨晚注意到Excel.exe
没有关门;所以我做了一些研究,发现了如何释放COM对象。这是我的最终代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.IO;
using Excel;
namespace testExcelconsoleApp
{
class Program
{
private String fileLoc = @"C:'temp'test.xls";
static void Main(string[] args)
{
Program p = new Program();
p.createExcel();
}
private void createExcel()
{
Excel.Application excelApp = null;
Excel.Workbook workbook = null;
Excel.Sheets sheets = null;
Excel.Worksheet newSheet = null;
try
{
FileInfo file = new FileInfo(fileLoc);
if (file.Exists)
{
excelApp = new Excel.Application();
workbook = excelApp.Workbooks.Open(fileLoc, 0, false, 5, "", "",
false, XlPlatform.xlWindows, "",
true, false, 0, true, false, false);
sheets = workbook.Sheets;
//check columns exist
foreach (Excel.Worksheet sheet in sheets)
{
Console.WriteLine(sheet.Name);
sheet.Select(Type.Missing);
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
}
newSheet = (Worksheet)sheets.Add(sheets[1], Type.Missing, Type.Missing, Type.Missing);
newSheet.Name = "My New Sheet";
newSheet.Cells[1, 1] = "BOO!";
workbook.Save();
workbook.Close(null, null, null);
excelApp.Quit();
}
}
finally
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(newSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheets);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
newSheet = null;
sheets = null;
workbook = null;
excelApp = null;
GC.Collect();
}
}
}
}
谢谢你的帮助。
AR的另一个"向上滴答"…,但如果您不必使用interop,我会完全避免它。这个产品实际上很有趣:http://www.clearoffice.com/它提供了一个非常直观、完全管理的api来操作excel文件,而且似乎是免费的。(至少暂时如此)SpreadSheetGear也很出色,但价格昂贵。
我的2美分。
不要忘记包括参考到
Microsoft Excel 12.0/11.0 object Library
using Excel = Microsoft.Office.Interop.Excel;
// Include this Namespace
Microsoft.Office.Interop.Excel.Application xlApp = null;
Excel.Workbook xlWorkbook = null;
Excel.Sheets xlSheets = null;
Excel.Worksheet xlNewSheet = null;
string worksheetName ="Sheet_Name";
object readOnly1 = false;
object isVisible = true;
object missing = System.Reflection.Missing.Value;
try
{
xlApp = new Microsoft.Office.Interop.Excel.Application();
if (xlApp == null)
return;
// Uncomment the line below if you want to see what's happening in Excel
// xlApp.Visible = true;
xlWorkbook = xlApp.Workbooks.Open(@"C:'Book1.xls", missing, readOnly1, missing, missing, missing, missing, missing, missing, missing, missing, isVisible, missing, missing, missing);
xlSheets = (Excel.Sheets)xlWorkbook.Sheets;
// The first argument below inserts the new worksheet as the first one
xlNewSheet = (Excel.Worksheet)xlSheets.Add(xlSheets[1], Type.Missing, Type.Missing, Type.Missing);
xlNewSheet.Name = worksheetName;
xlWorkbook.Save();
xlWorkbook.Close(Type.Missing, Type.Missing, Type.Missing);
xlApp.Quit();
}
finally
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlNewSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
//xlApp = null;
}
您可以使用OLEDB创建和操作Excel文件。有关链接和示例,请参阅此问题。
以下是我发现的几件事:
-
不能同时打开同一对象的多个实例。例如,如果您安装了一个名为
xlsheet1
的新excel工作表对象,则必须在创建另一个excel工作表(例如xlsheet2
)对象之前释放它。看起来COM失去了对对象的跟踪,并在服务器上留下了一个僵尸进程。 -
如果有多个用户访问同一个文件,那么使用与
excel.workbooks
关联的打开方法也会变得很难关闭。使用Add方法,它在不锁定文件的情况下也同样有效。例如xlBook = xlBooks.Add("C:'location'XlTemplate.xls")
-
在释放COM对象后,将垃圾收集放在单独的块或方法中。
COM绝对不是一个好办法。更具体地说,如果你正在处理网络环境,这是不可能的。。。
我成功地使用了以下开源项目:
-
适用于OOXML格式的ExcelPackage(Office2007)
-
.XLS格式的NPOI(Office 2003)
看看这些博客文章:
在C#中创建Excel电子表格.XLS和.XLSX
NPOI与Excel表格和动态图表
这是我用来添加附加工作表的内容
Workbook workbook = null;
Worksheet worksheet = null;
workbook = app.Workbooks.Add(1);
workbook.Sheets.Add();
Worksheet additionalWorksheet = workbook.ActiveSheet;
我在VSTO中遇到了类似的应用程序级外接程序问题,添加新工作表时出现异常HRESULT:0x800A03EC。
错误代码0x800A03EC(或-2146827284)表示NAME_NOT_FOUND;在里面换句话说,你要求了一些东西,但Excel找不到。
Dominic Zukiewicz@Excel错误HRESULT:0x800A03EC,试图用单元格';获取范围;s名称
然后我终于意识到ThisWorkbook触发了异常ActiveWorkbook运行正常。
Excel.Worksheet newSheetException = Globals.ThisAddIn.Application.ThisWorkbook.Worksheets.Add(Type.Missing, sheet, Type.Missing, Type.Missing);
Excel.Worksheet newSheetNoException = Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets.Add(Type.Missing, sheet, Type.Missing, Type.Missing);