Як використовувати Microsoft.Office.Interop.Excel на машині без встановленого MS Office?


74

Я пишу програму, яка працює з файлами Excel. Мені потрібна функція для видалення аркуша. Я повинен використовувати збірку Microsoft.Office.Interop.Excel.dll.

Він працює нормально на машині розробника, але при спробі розгорнути його на сервері з'являється повідомлення про помилку:

Не вдалося завантажити файл або збірку 'office, Версія = 14.0.0.0, Культура = нейтральна, PublicKeyToken = 71e9bce111e9429c' або одна із залежностей

Я розумію, що проблема виникає, коли MS Office не встановлено на машині. Клієнт не хоче встановлювати та купувати MS Office на сервері не за будь-яку ціну.

Я встановлюю "Розподілявані первинні взаємозв'язки" на машині розробника, як зазначено тут: http://forums.asp.net/t/1530230.aspx/1 і знову компілюю свій проект.

Зразок коду:

public bool DeleteSheet(string tableName)
{
    Excel.Application app = null;
    Excel.Workbooks wbks = null;
    Excel._Workbook _wbk = null;
    Excel.Sheets shs = null;

    bool found = false;

    try
    {
        app = new Excel.Application();
        app.Visible = false;
        app.DisplayAlerts = false;
        app.AlertBeforeOverwriting = false;

        wbks = app.Workbooks;
        _wbk = wbks.Add(xlsfile);
        shs = _wbk.Sheets;
        int nSheets = shs.Count;

        for (int i = 1; i <= nSheets; i++)
        {
            Excel._Worksheet _iSheet = (Excel._Worksheet)shs.get_Item(i);
            if (_iSheet.Name == tableName)
            {
                _iSheet.Delete();
                found = true;

                Marshal.ReleaseComObject(_iSheet);
                break;
            }
            Marshal.ReleaseComObject(_iSheet);
        }

        if (!found)
            throw new Exception(string.Format("Table \"{0}\" was't found", tableName));

        _wbk.SaveAs(connect, _wbk.FileFormat, Missing.Value, Missing.Value, Missing.Value,
        Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
        Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
    }
    finally
    {
        _wbk.Close(null, null, null);
        wbks.Close();
        app.Quit();

        Marshal.ReleaseComObject(shs);
        Marshal.ReleaseComObject(_wbk);
        Marshal.ReleaseComObject(wbks);
        Marshal.ReleaseComObject(app);
    }
    return true;
}

Виняток

Отримати фабрику класу COM для компонента з CLSID {00024500-0000-0000-C000-000000000046} не вдалося через таку помилку: 80040154 Клас не зареєстрований (Виняток з HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

відбувається на лінії

app = new Excel.Application();

Хтось може порадити, як змусити цю функцію успішно працювати?


Ну, я бачу, що це старіший пост - тож, можливо, занадто пізно, але мені це доводилося робити раніше, і я використовував відкриті формати XML: support.office.com/en-us/article/…
Джон Вот

Відповіді:


66

Ви не можете використовувати Microsoft.Office.Interop.Excel, не встановивши MS Office.

Просто знайдіть у google деякі бібліотеки, які дозволяють змінювати xls або xlsx:


12
Так - збірки взаємодії просто підказують .NET, як викликати бібліотеки Excel COM. Вони не мають жодної функціональності. Ще один популярний для читання / запису .xlsx файлів: closedxml.codeplex.com
Говерт

Дякую. Я спробую ці libs.
Джон Уельс,

3
Як це відбувається, ви не можете навіть BUILD проект , який містить посилання на Microsoft.Office.Core не встановлювати Office. Інші посилання на збірку Interop на рівні документа, здається, компілюються, але не запускаються. Моїм завданням було видалити явні посилання на Microsoft.Office.Core і замінити їх на динамічні та var- ключові слова, що дозволяють пізні посилання ПІСЛЯ intellisense зробив свою роботу на машині розробника.
CZahrobsky

У мене встановлений офіс, і я отримую те саме питання. Чи можете ви допомогти?
ехх


2

Якщо "Клієнт не хоче встановлювати та купувати MS Office на сервері не за будь-яку ціну", тоді ви не можете використовувати Excel ... Але я не можу зрозуміти фокус: це все про одну базову ліцензію Office, яка коштує приблизно 150 USD ... І я думаю, що витрачати час на пошук альтернативи буде коштувати набагато дорожче цієї суми!


21
Використання Excel на сервері - це практична робота. По-перше: це необхідна вразливість. По-друге, це надзвичайно повільно, писання та читання документів триває вік - чудово, якщо у вас більше одного користувача ... По-третє: Office не призначений для повністю автоматизованого використання. Є чарки, які створюють скриньки повідомлень і т. Д. Це "не дуже добре" на серверах ...
Крістіан Зауер,

"по-друге, це жахливо повільно, писання та читання документів вимагає століть" - Не з мого досвіду. А що, якщо клієнти хочуть використовувати Excel, MS Office повністю або будь-яке інше програмне забезпечення через тонкий клієнт? У такому випадку йому доведеться перейти на сервер.
Alan B

20
Як консультанту, мені було б дуже незручно сказати клієнту, що їм доведеться встановлювати MS Office на своїх серверах CI. Справа не стільки в грошах, скільки в клопотах та факторі WTF. І це може бути не лише один сервер, можливо, у них є 5,10,20 віртуальних серверів CI. Тоді ми говоримо про більше грошей та адміністративні витрати, ніж 150 доларів.
Jonas Söderström

2
Я погоджуюсь з @ JonasSöderström, що мова не йде про розгляд єдиної ліцензії Office
strike_noir

2

Ви можете створити службу та створити Excel на сервері, а потім дозволити клієнтам завантажувати Excel. Тому що, купуючи ліцензію Excel за 1000 осіб, краще мати одну ліцензію на сервер.

сподівання, що допомагає.


2
розробляти автоматизацію офісу в архітектурі клієнтського сервера не рекомендується.
kaushalparik27

0

Шукайте GSpread.NET. Ви можете працювати з електронними таблицями Google, використовуючи API від Microsoft Excel. Вам не потрібно переписувати старий код із новим використанням Google API. Просто додайте кілька рядків:

Set objExcel = CreateObject("GSpreadCOM.Application");

app.MailLogon(Name, ClientIdAndSecret, ScriptId);

Це проект OpenSource, і він не вимагає інсталяції Office.

Документація доступна тут http://scand.com/products/gspread/index.html


Як я бачу для коду, який ви опублікували, ви повинні якось увійти в "Google Systems". Тож альтернативою встановленню ліцензії Office є реєстрація в Google. Я знаю, що це безкоштовно, і це, але ... Мені не подобається ідея реєструвати мою програму в Службах Google.
EAmez
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.