Pytanie Utwórz plik Excel (.XLS i .XLSX) z C #


Jak utworzyć arkusz kalkulacyjny programu Excel z C # bez konieczności instalowania programu Excel na komputerze, na którym działa kod?


1571


pochodzenie


Nie jestem pewien, czy to jest właściwe miejsce, ale spójrz na ClosedXML. Wprowadza limit> 2003 na twoim kodzie, ale do tej pory użyliśmy go z wielkim sukcesem. - Carl
Można to zrobić za pomocą .NET Framework, jak to opisano tutajlub o wiele łatwiej w niektórych bibliotekach GemBox.Spreadsheet. - NixonUposseen


Odpowiedzi:


Możesz użyć biblioteki o nazwie ExcelLibrary. Jest to bezpłatna biblioteka typu open source opublikowana w Google Code:

ExcelLibrary

Wygląda to na port PHP ExcelWriter, o którym wspomniałeś powyżej. Nie napisze jeszcze do nowego formatu .xlsx, ale pracuje nad dodaniem tej funkcji.

Jest bardzo prosty, mały i łatwy w użyciu. Dodatkowo ma DataSetHelper, który pozwala używać DataSet i DataTables do łatwej pracy z danymi Excela.

Wydaje się, że ExcelLibrary nadal działa tylko dla starszego formatu Excela (pliki .xls), ale może dodawać wsparcie w przyszłości dla nowszych formatów 2007/2010.

Możesz także użyć EPPlus, który działa tylko dla plików w formacie Excel 2007/2010 (pliki .xlsx).

Istnieje kilka znanych błędów w każdej bibliotece, jak zaznaczono w komentarzach. Podsumowując, EPPlus wydaje się być najlepszym wyborem w miarę upływu czasu. Wydaje się, że jest również aktywniej aktualizowana i dokumentowana.

Ponadto, jak odnotowano w @ АртёмЦарионов poniżej, EPPlus obsługuje tabele przestawne, a ExcelLibrary może mieć pewne wsparcie (Problem z tabelą przestawną w ExcelLibrary)

Oto kilka linków do szybkiego odniesienia:
ExcelLibrary - GNU Lesser GPL
EPPlus - GNU Lesser General Public License (LGPL)

Oto przykładowy kod ExcelLibrary:

Oto przykład pobierania danych z bazy danych i tworzenia z niej skoroszytu. Zauważ, że kod ExcelLibrary jest pojedynczą linią na dole:

//Create the data set and table
DataSet ds = new DataSet("New_DataSet");
DataTable dt = new DataTable("New_DataTable");

//Set the locale for each
ds.Locale = System.Threading.Thread.CurrentThread.CurrentCulture;
dt.Locale = System.Threading.Thread.CurrentThread.CurrentCulture;

//Open a DB connection (in this example with OleDB)
OleDbConnection con = new OleDbConnection(dbConnectionString);
con.Open();

//Create a query and fill the data table with the data from the DB
string sql = "SELECT Whatever FROM MyDBTable;";
OleDbCommand cmd = new OleDbCommand(sql, con);
OleDbDataAdapter adptr = new OleDbDataAdapter();

adptr.SelectCommand = cmd;
adptr.Fill(dt);
con.Close();

//Add the table to the data set
ds.Tables.Add(dt);

//Here's the easy part. Create the Excel worksheet from the data set
ExcelLibrary.DataSetHelper.CreateWorkbook("MyExcelFile.xls", ds);

Tworzenie pliku Excel jest tak proste. Możesz także ręcznie tworzyć pliki Excel, ale powyższa funkcja naprawdę mnie zachwyciła.


877



ExcelLibrary został zastąpiony wyjątkowym programem EPPlus - epplus.codeplex.com. Jan regularnie go aktualizuje. Używałem go i jest to jeden z najlepszych projektów open source, z którymi współpracowaliśmy. - Mark A
Nie. Użyj EppPlus - epplus.codeplex.com. Jest najnowszym największym. Obsługuje formatowanie. Używam tego. - Bill Paetzke
Wydaje się, że ExcelLibrary obsługuje tylko .xls i EPPlus tylko .xlsx, więc uzupełniają się nawzajem. - jmster
-1 Jeśli chcesz opublikować przykładowy kod, równie dobrze możesz się upewnić, że jest poprawny. Użyj metody Dispose tego interfejsu, aby jawnie uwolnić zasoby niezarządzane w połączeniu z garbage collectorem. Konsument obiektu może wywołać tę metodę, gdy obiekt nie jest już potrzebny. - ta.speot.is
Przerwij przedkładanie EPPlus jako alternatywy dla ExcelLibrary, dopóki nie będzie w stanie uzyskać tej samej funkcjonalności (jeden obsługuje XLS, drugi XLSX). Tak jak lubię EPPlus, to po prostu nie jest odpowiedzią na potrzeby PO (XLS). - Chris Rogers


Jeśli jesteś zadowolony z formatu xlsx, spróbuj codeplex Projekt GitHub. EPPlus. Uruchomiono go ze źródłem z pakietu ExcelPackage, ale dziś jest to całkowita przeróbka. Obsługuje zakresy, stylizację komórek, wykresy, kształty, obrazy, nazwy, autofiltr i wiele innych rzeczy.


491



Moja całkowicie bezpłatna biblioteka umożliwia również eksportowanie dowolnych DataSet, DataTable lub List <> bezpośrednio do pliku .xlsx programu Excel 2007 za pomocą Open XML. Pełny kod źródłowy i wersja demo dostępne tutaj: mikesknowledgebase.com/pages/CSharp/ExportToExcel.htm - Mike Gledhill
Licencją jest teraz LGPL, wydawanie notatek tutaj: epplus.codeplex.com/releases/view/79802 - Simon D
Przykłady były pomocne. Udało mi się zmienić kod z biblioteki Microsoft Interop (strasznie wolno) do tej biblioteki (wersja 4.x) za kilka godzin. Mój test porównawczy zapisuje plik z dwiema kartami i około 750 000 komórek. Korzystanie z interakcji z MS trwało 13 minut. Korzystanie z EPPlus trwało 10 sekund, około 80x przyspieszenie. Bardzo szczęśliwy! - Paul Chernoch
@ JanKällman Powinieneś zaktualizować swoją stronę CodePlex, aby pokazać, że masz dostępne następujące metody: LoadFromCollection<T>, LoadFromDataTable itp. (znalezione przez tutaj) - PeterX
Dla jasności w tym wątku, LGPL pozwala na łączenie się z oprogramowaniem bez udziału zakaźnej części GPL. Wystarczy tylko otworzyć zmiany kodu źródłowego wprowadzone w ClosedXml lub jeśli bezpośrednio umieścisz kod źródłowy (w przeciwieństwie do odwoływania się do złożeń ClosedXML) wewnątrz aplikacji, musisz otworzyć aplikację źródłową. - Chris Marisic


Z powodzeniem stosuję następujące projekty open source:

  • Pakiet ExcelPackage dla formatów OOXML (Office 2007)

  • NPOI dla formatu .XLS (Office 2003). NPOI 2.0 (Alpha) obsługuje również XLSX.

Zobacz moje posty na blogu:

Tworzenie arkuszy Excela .XLS i .XLSX w języku C #

NPOI z tabelą Excel i dynamicznym wykresem


147



Uwaga dotycząca NPOI - odwołania do wierszy i kolumn są oparte na zera. Działa dobrze w zapełnianiu istniejącego szablonu. - John M
NPOI 2 jest teraz w wersji Beta i użyłem go w moich projektach do prostego eksportu bez problemów. - Travis
To działa. Ma również kilka najokropniejszych nazw klas i nazw, jakie kiedykolwiek wymyślono - naśladując niszczące format bazowych danych, zamiast kpić z niego. - Roman Starkov
To pytanie i jego odpowiedzi są naprawdę stare. NPOI jest teraz drogą do zrobienia i chciałbym, aby ta odpowiedź była na szczycie, zanim zmarnowałem swój czas z EPPlus i ExcelLibrary próbując uzyskać rozwiązanie, które działało zarówno dla .xls, jak i .xlsx. Pobierz C # do pobrania z npoi.codeplex.com. I najlepsza dokumentacja, którą znalazłem, mimo że jest to wersja Java poi.apache.org - SurfingSanta
NPOI przeniosła się z Codeplex do Github. - jerhewet


A co z wykorzystaniem Open XML SDK 2.0 dla Microsoft Office?

Kilka korzyści:

  • Nie wymaga instalacji pakietu Office
  • Wykonane przez Microsoft = przyzwoita dokumentacja MSDN
  • Tylko jedna. NET dll do wykorzystania w projekcie
  • SDK zawiera wiele narzędzi, takich jak diff, validator, itp

Spinki do mankietów:


141



Ważne, aby pamiętać, że biblioteka DLL ma nieco ponad 5 MB i jest ograniczona do formatów Office 2007. Ale na pewno najłatwiejsze i najszybsze rozwiązanie, które działa dla mnie. - Josh Brown
Tylko heads-up, że v2.5 jest obecnie dostępny i można go pobrać tutaj. - Snuffleupagus
SDK modeluje XML na klasy, tak aby każdy znacznik XML był odwzorowany na znacznik, a następnie trzeba zbudować hierarchię klas (każda instancja ma kolekcję potomnych instancji / znaczników). Oznacza to, że musisz znać strukturę XML pliku Excel, co jest bardzo skomplikowane. O wiele łatwiej jest użyć takiego opakowania, jak wspomniana wyżej EPPlus, co upraszcza różne rzeczy. - Tsahi Asher
Doskonałą próbkę Microsoft Open XML SDK - Open XML Writer można znaleźć na stronie polymathprogrammer.com/2012/08/06/...  Lub zobacz rozwiązanie do przepełnienia stosu stackoverflow.com/questions/11370672/... - Greg
Uważam, że Open XML Writer w Microsoft Open XML SDK jest świetny. Korzystając z powyższych rozwiązań, (w szczególności próbki Vincenta Toma (Poly Math)), można łatwo zbudować pisarz, który przesyła duże zbiory danych, i zapisuje rekordy w podobny sposób i niezbyt bardziej skomplikowany niż to, co można zrobić dla CSV; ale zamiast tego piszesz xml. Open XML to sposób myślenia, który Microsoft uważa za nowy format Office. Zawsze możesz zmienić nazwę pliku z .xslx na .zip, jeśli masz ochotę szturchać swoją zawartość XML. - Greg


Możesz używać OLEDB do tworzenia i manipulowania plikami Excel. Sprawdź to: Czytanie i pisanie Excela za pomocą OLEDB.

Typowy przykład:

using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\temp\\test.xls;Extended Properties='Excel 8.0;HDR=Yes'"))
{
  conn.Open();
  OleDbCommand cmd = new OleDbCommand("CREATE TABLE [Sheet1] ([Column1] string, [Column2] string)", conn);
  cmd.ExecuteNonQuery();
}

EDYCJA - Niektóre dodatkowe linki:


95



Czy ktoś może potwierdzić, czy to działa, gdy działa na x64? Jestem prawie pewien, że Jet działa tylko wtedy, gdy twoja aplikacja jest skompilowana lub działa w trybie 32-bitowym. - Lamar
Właśnie przetestowałem to połączenie i nie udało się na Windows Server 2008 R2 x64 RC, wydaje się, że trzeba zainstalować sterownik Office System Driver 2007: Data Connectivity Components [microsoft.com/downloads/... - Chris Richner
Bądź z tym bardzo ostrożny - jest to wielki brzydki cludge (na przykład czasami odgaduje typ kolumny i odrzuca wszystkie dane, które nie pasują). - dbkk
Należy być bardzo ostrożnym przy stosowaniu tej metody. Stwierdziłem, że jest to bardzo niestabilne w przypadku danych, które nie są w idealnym formacie. - Kenny Mann
Jako osoba, która musiała używać OleDb w dużym projekcie, mówię "STAY AWAY FROM IT"! Czasem nie jest w stanie pobrać wartości komórki tylko dlatego, że nie może zrozumieć formatu. Nie ma operacji usuwania. Działa zupełnie inaczej i nieprzewidywalnie, nawet przy najmniejszej zmianie dostawcy. Powiedziałbym, idź na sprawdzone rozwiązanie komercyjne. - Caner Öncü


Rozwiązanie komercyjne, SpreadsheetGear dla .NET zrobię to.

Możesz zobaczyć na żywo próbki ASP.NET (C # i VB) tutaj i pobierz wersję próbną tutaj.

Zastrzeżenie: posiadam SpreadsheetGear LLC


73



Masz świetny produkt, ale myślę, że wielu ludzi oczekuje tutaj darmowych rozwiązań. To może tłumaczyć głosowanie w dół. - md1337


Kilka opcji, których użyłem:

Jeśli XLSX jest koniecznością: Pakiet ExcelPackage to dobry początek, ale umarł, gdy programista przestał nad nim pracować. ExML wyłapał stamtąd i dodał kilka funkcji. ExML nie jest złą opcją, nadal używam go w kilku witrynach produkcyjnych.

Jednak w przypadku wszystkich moich nowych projektów używam NPOI, port .NET of .NET Apache POI. NPOI 2.0 (alfa) obsługuje również XLSX.


56



Zachowaj ostrożność w pakiecie ExcelPackage, jeśli potrzebujesz obsługi XLS. Miałem z tym problem i ostatecznie przełączyłem się do ExcelLibrary. - Jeremy
Zdecydowanie prawdziwe. Pakiet ExcelPackage / ExML to dobra opcja, jeśli potrzebujesz obsługi XLSX. - Nate
Zwróć uwagę, że pakiet ExcelPackage ma następcę: EPPlus (epplus.codeplex.com), który obsługuje XLSX. Moim jedynym zmartwieniem, na przykład w porównaniu z NPOI, jest wydajność, np. kiedy jest dużo kolumn. - Pragmateek


Bardzo lekką opcją może być używanie tabel HTML. Wystarczy utworzyć znaczniki head, body i table w pliku i zapisać je jako plik z rozszerzeniem .xls. Istnieją specyficzne dla firmy Microsoft atrybuty, których można użyć do stylu danych wyjściowych, w tym formuł.

Zdaję sobie sprawę, że możesz nie kodować tego w aplikacji internetowej, ale tutaj jest przykład składu pliku Excel za pomocą tabeli HTML. Techniki tej można użyć, jeśli koduje się aplikację konsolową, aplikację komputerową lub usługę.


54



Jest tak ad hoc, ale działa (nie wspominając o programie Excel, który wydaje ostrzeżenie o otwarciu) i jest tak prosty, że zasługuje na miejsce jako rozwiązanie. Choćby po to, żeby pokazać, że możesz wyeksportować plik Excela :)) - Luka Ramishvili
To rozwiązanie sprawdziło się dobrze, po prostu zauważ, że nie możesz używać rozszerzenia .xlsx - Jill
Niektóre osoby w mojej organizacji nie mogą otwierać plików Excel utworzonych w ten sposób w pakiecie Office 2010 i nowszych wersjach. Nie wiem, na czym polega problem, ale musiałem wdrożyć własną implementację OpenXML. (patrz odpowiedź Soggera) - Kristen Hammack