2012-07-12 11 views
58

Piszę aplikację, która działa z plikami Excel. Potrzebuję funkcji do usunięcia arkusza. Muszę użyć zestawu Microsoft.Office.Interop.Excel.dll.Jak korzystać z Microsoft.Office.Interop.Excel na komputerze bez zainstalowanego pakietu MS Office?

To działa dobrze na komputerze deweloperskim, ale gdy próbuję wdrożyć go na serwerze Dostaję błąd:

Could not load file or assembly 'office, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' or one of its dependencies

Rozumiem ten problem występuje, gdy MS Office nie jest zainstalowany na komputerze. Klient nie chce instalować i kupować pakietu MS Office na serwerze za żadną cenę.

Instaluję "Redystrybucyjne podstawowe zespoły interopów" na komputerze programisty, jak zalecono tutaj: http://forums.asp.net/t/1530230.aspx/1 i ponownie skompiluj mój projekt.

przykładowy kod:

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

Wyjątek

Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

występuje na linii

app = new Excel.Application(); 

Czy ktoś może doradzić, w jaki sposób, aby ta funkcja działa skutecznie?

Odpowiedz

52

Nie można używać Microsoft.Office.Interop.Excel bez zainstalowanego pakietu MS Office.

Wystarczy wyszukać w google dla niektórych bibliotek, które umożliwia modyfikowanie xls lub xlsx:

+9

Tak - zestawy międzyoperacyjne tylko powiedzieć .NET jak zadzwonić biblioteki Excel COM. Nie mają żadnej funkcjonalności.Kolejny popularny plik do odczytu/zapisu .xlsx: http://closedxml.codeplex.com/ – Govert

+0

Dzięki. Spróbuję tych bibliotek. –

+2

Tak się składa, że ​​nie można nawet _BUILD_ wykonać projektu, który zawiera odwołania do ** Microsoft.Office.Core ** bez instalowania pakietu Office. Pozostałe odwołania do zespołu Interop na poziomie dokumentu wydają się kompilować, ale nie działać. Moja praca polegała na usunięciu wyraźnych ** Microsoft.Office.Core ** referencji i zastąpieniu ich ** dynamicznymi ** i ** var ** słowami kluczowymi, które umożliwiają późniejsze referencje PO intellisense wykonał swoją pracę na dewelopera maszyna. – CZahrobsky

1

Jeśli „Klient nie chce instaluj i kupuj MS Office na serwerze, nie za żadną cenę ", wtedy nie możesz używać Excela ... Ale nie dam rady: chodzi o jedną podstawową licencję biurową, która kosztuje około 150 USD ... I myślę, że wydatki czas znalezienie alternatywy będzie kosztował b o wiele więcej niż ta kwota!

+19

Korzystanie z programu Excel na serwerze to ćwiczenie praktyczne. Po pierwsze: jest to bezwartościowa słabość. Po drugie jest strasznie powolny, pisanie i czytanie dokumentów trwa wieki - świetnie, jeśli masz więcej niż jednego użytkownika ... Po trzecie: Office nie jest przeznaczony do całkowicie zautomatyzowanego użytkowania. Są high-upy, które tworzą skrzynki wiadomości itp. To jest "nie tak dobre" na serwerach ... –

+0

"po drugie jest strasznie powolne, pisanie i czytanie dokumentów trwa wieki" - Nie z mojego doświadczenia. Również, jeśli klienci chcą używać programu Excel, MS Office w całości lub w ogóle jakiegokolwiek innego oprogramowania za pośrednictwem cienkiego klienta? W tym scenariuszu * będzie * przechodzić na serwer. –

+17

Jako konsultant bardzo trudno byłoby mi powiedzieć klientowi, że będzie musiał zainstalować MS Office na swoich serwerach CI. Nie chodzi tu o pieniądze, ale o kłopot i czynnik WTF. I nie może to być tylko jeden serwer, może mają 5,10,20 wirtualnych serwerów CI. Wtedy mówimy o więcej pieniędzy i kosztach administracyjnych niż 150 USD. –

2

można utworzyć usługę i wygenerować Excel na serwerze, a następnie umożliwić klientom pobieranie Excel. cos zakupu licencji excel dla 1000 osób, lepiej mieć jedną licencję na serwer.

nadzieję, że pomaga.

+1

, ponieważ nie zaleca się rozwijania automatyzacji biura w architekturze serwera klienta. – kaushalparik27

0

Wyszukaj GSpread.NET. Możesz pracować z Arkuszami kalkulacyjnymi Google za pomocą interfejsu API z programu Microsoft Excel. Nie musisz przepisywać starego kodu na nowe użycie Google API. Wystarczy dodać kilka wierszy:

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

app.MailLogon(Name, ClientIdAndSecret, ScriptId); 

Jest to projekt OpenSource i nie wymaga instalacji pakietu Office.

Dokumentacja dostępna tutaj http://scand.com/products/gspread/index.html

+0

Jak widzę opublikowany kod, musisz jakoś zalogować się do "Google Systems". Alternatywą instalacji Licencji Office jest rejestracja w Google. Wiem, że to za darmo, ale ... Nie podoba mi się pomysł, aby mój log aplikacji był w usługach Google. – EAmez