Подтвердить что ты не робот

С# - Как добавить рабочий лист Excel программно - Office XP/2003

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

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

Я пробовал:

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

Но я становлюсь ниже COM Exception, и мой поисковик не дал мне ответа.

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

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

4b9b3361

Ответ 1

Вам нужно добавить ссылку на 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 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-взаимодействие, вы должны иметь администратора или Power User разрешения.

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

Ответ 2

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

Благодарим вас за вашу помощь.

Ответ 3

Еще один "Up Tick" для AR..., но если вам не нужно использовать interop, я бы вообще этого не избежал. Этот продукт действительно интересен: http://www.clearoffice.com/ и предоставляет очень интуитивно понятный, полностью управляемый api для обработки файлов excel и, кажется, свободен. (по крайней мере, на данный момент) SpreadSheetGear также отлично, но дорого.

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

Ответ 4

Не забудьте включить ссылку 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 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;
}

Ответ 5

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

Ответ 6

Вот несколько вещей, которые я выяснил:

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

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

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

Ответ 7

COM, безусловно, не очень хороший способ. Более конкретно, это не выход, если вы имеете дело с веб-средой...

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

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

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

Взгляните на эти сообщения в блоге:

Создание таблиц Excel.XLS и .XLSX на С#

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

Ответ 8

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

Workbook workbook = null;
Worksheet worksheet = null;

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

Worksheet additionalWorksheet = workbook.ActiveSheet;

Ответ 9

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

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

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

Затем я, наконец, понял, что ThisWorkbook вызвало исключение. Активная книга прошла нормально.

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);