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"

我希望有人能让我摆脱痛苦。

C#-如何以编程方式添加Excel工作表-Office XP/2003

您需要在项目中将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文件。有关链接和示例,请参阅此问题。

以下是我发现的几件事:

  1. 不能同时打开同一对象的多个实例。例如,如果您安装了一个名为xlsheet1的新excel工作表对象,则必须在创建另一个excel工作表(例如xlsheet2)对象之前释放它。看起来COM失去了对对象的跟踪,并在服务器上留下了一个僵尸进程。

  2. 如果有多个用户访问同一个文件,那么使用与excel.workbooks关联的打开方法也会变得很难关闭。使用Add方法,它在不锁定文件的情况下也同样有效。例如xlBook = xlBooks.Add("C:'location'XlTemplate.xls")

  3. 在释放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);