Как создать экземпляр Excel, если Excel не установлен

В моем приложении С# с помощью Excel Interop dll (в качестве ссылки) я читаю/пишу файлы excel. Если я переведу эту программу в систему, где офис /excel не установлен (подумайте о чистой машине), я попадаю с ошибкой ниже.

System.Runtime.InteropServices.COMException(0x80040154): Извлечение COM-класса factory для компонента с CLSID {00024500-0000-0000-C000-000000000046} не удалось из-за следующей ошибки: 80040154 Класс не зарегистрирован (Исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

Ошибка выше, потому что на целевой машине нет excel.
Мой вопрос в том, есть ли другой способ использовать мою программу, кроме регистрации DLL Interop на целевой машине?

Ответы

Ответ 1

Мой вопрос в том, есть ли другой способ использовать мою программу отдельно от регистрировать Interop dll на целевой машине?

Вы спрашиваете, есть ли способ использовать вашу программу, которая использует взаимодействие Excel, когда Excel не установлен на компьютере, на котором запущена ваша программа. Короткий ответ: нет. Более длинный ответ - да, если вы готовы реорганизовать свою программу, чтобы не использовать interop.

Вы можете использовать OOXml SDK, предоставленный Microsoft, если версия Excel, на которую настроена таргетинг, - 2007 и выше. Вы также можете использовать стороннюю библиотеку, такую ​​как Aspose, если вы готовы потратить немного денег.

Пример использования OOXml SDK для вставки электронной таблицы в файл excel можно найти в msdn.

// Given a document name, inserts a new worksheet.
public static void InsertWorksheet(string docName)
{
    // Open the document for editing.
    using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docName, true))
    {
        // Add a blank WorksheetPart.
        WorksheetPart newWorksheetPart = spreadSheet.WorkbookPart.AddNewPart<WorksheetPart>();
        newWorksheetPart.Worksheet = new Worksheet(new SheetData());

        Sheets sheets = spreadSheet.WorkbookPart.Workbook.GetFirstChild<Sheets>();
        string relationshipId = spreadSheet.WorkbookPart.GetIdOfPart(newWorksheetPart);

        // Get a unique ID for the new worksheet.
        uint sheetId = 1;
        if (sheets.Elements<Sheet>().Count() > 0)
        {
            sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
        }

        // Give the new worksheet a name.
        string sheetName = "Sheet" + sheetId;

        // Append the new worksheet and associate it with the workbook.
        Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetName };
        sheets.Append(sheet);
    }
}

Ответ 2

Даже Microsoft не рекомендует использовать библиотеки Interop на сервере. Поэтому лучше всего найти альтернативную структуру Excel для вас. Я успешно использовал Npoi в прошлом для этой цели.

Я знаю, что это не ответ на ваше исключение. Но, честно говоря, Interop - это путь к бесконечным неприятностям и загадочным сообщениям об исключениях.

Обновление 2017. Я не использовал NPOI какое-то время и переместил все мои проекты в EPPlus insted - библиотека на основе OpenXML, которая создает вам современные xlsx файлы.

Ответ 3

Вы можете зарегистрировать свой COM с помощью RegSrv32

Ссылка: http://msdn.microsoft.com/en-us/library/ms859484.aspx

Вы обязаны зарегистрировать свой COM перед использованием

Ответ 4

Из всего исследования, которое я сделал некоторое время назад, когда мне нужно было взаимодействовать с файлом Excel на сервере, вам нужно установить Office.