C# - Как добавить Excel Worksheet программно - Office XP / 2003

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

23
задан shA.t 22 August 2017 в 13:47
поделиться

7 ответов

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

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

42
ответ дан shA.t 29 November 2019 в 01:36
поделиться

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

Спасибо за всю Вашу справку.

5
ответ дан shA.t 29 November 2019 в 01:36
поделиться

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

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

2
ответ дан sbeskur 29 November 2019 в 01:36
поделиться

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

0
ответ дан Community 29 November 2019 в 01:36
поделиться

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

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

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

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

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

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

НКОИ с таблицей Excel и динамической диаграммой

0
ответ дан Leniel Maccaferri 29 November 2019 в 01:36
поделиться

У меня была похожая проблема надстройки уровня приложения в 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
ответ дан Community 29 November 2019 в 01:36
поделиться

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

  1. Вы не можете открыть более одного экземпляра одного и того же объекта одновременно. Например, если вы указываете новый объект листа Excel Cized XLshet1 , вы должны отпустить его перед созданием другого объекта листа Excel Ex XLsheet2 . Кажется, что COM ослабляет отслеживание объекта и оставляет процесс зомби на сервере.

  2. Использование метода открытия, связанного с Excel.Workbooks Также становится сложно закрыть, если у вас есть несколько пользователей, доступа к одному и тому же файлу. Вместо этого используйте способ добавления, он работает так же хорошо, не блокируя файл. например. xlbook = xlbooks.add («C: \ location \ xltemplate.xls»)

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

0
ответ дан 29 November 2019 в 01:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: