C # - Как добавить Excel Excel программно - Office XP / 2003 - PullRequest
23 голосов
/ 11 октября 2008

Я только начинаю возиться с Excel через C #, чтобы иметь возможность автоматизировать создание и добавление в файл Excel.

Я могу открыть файл и обновить его данные и перемещаться по существующим рабочим листам. Моя проблема в том, как я могу добавить новые листы?

Я пытался:

Excel.Worksheet newWorksheet;
newWorksheet = (Excel.Worksheet)excelApp.ThisWorkbook.Worksheets.Add(
                Type.Missing, Type.Missing, Type.Missing, Type.Missing);

Но я получаю ниже COM-исключение , и мой поиск в Google не дал мне никакого ответа.

Исключение из HRESULT: 0x800A03EC Источник: "Interop.Excel"

Я надеюсь, что кто-то, возможно, сможет избавить меня от моих страданий.

Ответы [ 9 ]

42 голосов
/ 11 октября 2008

Вам необходимо добавить ссылку 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 включено полезное правило: «Никогда не используйте 2 точки с COM-объектами» . В вашем коде; у вас будут настоящие проблемы с этим. Мой демонстрационный код выше НЕ очищает приложение Excel должным образом, но это только начало!

Некоторые другие ссылки, которые я нашел полезными при рассмотрении этого вопроса:

Согласно MSDN

Для использования COM-взаимодействия необходимо иметь безопасность администратора или опытного пользователя разрешения.

Надеюсь, это поможет.

5 голосов
/ 11 октября 2008

Хочу поблагодарить вас за отличные ответы. @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();
            }
        }
    }
}

Спасибо за вашу помощь.

2 голосов
/ 11 октября 2008

Еще один «тик вверх» для AR ..., но если вам не нужно использовать взаимодействие, я бы вообще его избежал. Этот продукт на самом деле довольно интересный: http://www.clearoffice.com/, и он предоставляет очень интуитивно понятный, полностью управляемый API для работы с файлами Excel и, кажется, бесплатный (по крайней мере, пока) SpreadSheetGear тоже отлично, но дорого.

мои два цента.

1 голос
/ 01 апреля 2012

Не забудьте включить Ссылка на 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;
}
0 голосов
/ 03 октября 2014

У меня была похожая проблема надстройки уровня приложения в VSTO, исключение HRESULT: 0x800A03EC при добавлении нового листа.

Код ошибки 0x800A03EC (или -2146827284) означает NAME_NOT_FOUND; в другими словами, вы что-то просили, а Excel не может его найти.

Доминик Цукевич @ Ошибка Excel HRESULT: 0x800A03EC при попытке получить диапазон с именем ячейки

Тогда я наконец понял, 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);
0 голосов
/ 10 декабря 2013

Это то, что я использовал для добавления дополнительного листа

Workbook workbook = null;
Worksheet worksheet = null;

workbook = app.Workbooks.Add(1);
workbook.Sheets.Add();

Worksheet additionalWorksheet = workbook.ActiveSheet;
0 голосов
/ 16 февраля 2012

COM определенно не очень хороший путь. Точнее говоря, если вы имеете дело с веб-средой, не стоит ...

Я успешно использовал следующие проекты с открытым исходным кодом:

  • ExcelPackage для форматов OOXML (Office 2007)

  • NPOI для формата .XLS (Office 2003)

Посмотрите на эти записи в блоге:

Создание электронных таблиц Excel .XLS и .XLSX в C #

NPOI с таблицей Excel и динамической диаграммой

0 голосов
/ 21 января 2010

Вот пара вещей, которые я понял:

  1. Вы не можете открыть более одного экземпляра одного и того же объекта одновременно. Например, если вы создаете новый объект листа Excel с именем xlsheet1, вы должны освободить его перед созданием другого объекта листа Excel, например xlsheet2. Похоже, что COM теряет отслеживание объекта и оставляет процесс зомби на сервере.

  2. Использование метода open, связанного с excel.workbooks, также затрудняет закрытие, если несколько пользователей имеют доступ к одному и тому же файлу. Вместо этого используйте метод Add, он работает так же хорошо, не блокируя файл. например. xlBook = xlBooks.Add("C:\location\XlTemplate.xls")

  3. Поместите сборку мусора в отдельный блок или метод после освобождения COM-объектов.

0 голосов
/ 11 октября 2008

Вы можете использовать OLEDB для создания и управления файлами Excel. См. этот вопрос для ссылок и примеров.

...