Jak utworzyć Excel (.XLS i.XLSX) plik w C # bez instalacji pakietu Microsoft Office?

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

Author: mistrmark, 2008-09-29

30 answers

Możesz użyć biblioteki o nazwie ExcelLibrary. Jest to darmowa biblioteka open source zamieszczona w Google Code:

ExcelLibrary

To wygląda na port Excelwritera PHP, o którym wspomniałeś powyżej. Nie napisze do nowego .format xlsx jeszcze, ale pracują nad dodaniem tej funkcjonalności w.

Jest bardzo prosty, mały i łatwy w użyciu. Ponadto posiada magazyn danych, który pozwala używać zestawów danych i tabel danych do łatwej pracy z programem Excel data.

ExcelLibrary wydaje się nadal działać tylko dla starszego formatu Excel (.pliki xls), ale może być dodanie wsparcia w przyszłości dla nowszych formatów 2007/2010.

Można również użyć EPPlus , który działa tylko dla plików formatu Excel 2007/2010 (.pliki xlsx). Istnieje również NPOI , które działa z obydwoma.

Istnieje kilka znanych błędów w każdej bibliotece, jak zauważono w komentarzach. W sumie EPPlus wydaje się być najlepszym wyborem w miarę upływu czasu. Wydaje się być bardziej aktywnie aktualizowane i udokumentowane, jak również.

Również, jak zauważył @АртёмЦарионов poniżej, EPPlus ma wsparcie dla tabel przestawnych, 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 (LGPL) - nie jest już utrzymywany
EPPlus 5 - Poliform Noncommercial-od maja 2020
NPOI - Apache License

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

Utworzenie pliku Excel jest tak proste. Możesz również ręcznie tworzyć pliki Excela, ale powyższa funkcjonalność jest tym, co naprawdę zrobiło na mnie wrażenie.

 1097
Author: Mike Webb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-18 17:33:22

Jeśli jesteś zadowolony z formatu xlsx, wypróbuj mój projekt GitHub, EPPlus . Zaczęło się od źródła z ExcelPackage, ale dziś jest to całkowite przepisanie. Obsługuje zakresy, stylizację komórek, wykresy, kształty, obrazy, zakresy nazwane, AutoFilter i wiele innych rzeczy.

 605
Author: Jan Källman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-23 20:24:37

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

Kilka korzyści:

  • nie wymaga instalacji pakietu Office
  • Made by Microsoft = przyzwoita dokumentacja MSDN
  • tylko jeden. Net dll do wykorzystania w projekcie
  • SDK zawiera wiele narzędzi, takich jak diff, validator, itp

Linki:

 187
Author: Sogger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-25 17:05:37

Z powodzeniem korzystałem z następujących projektów open source:

  • ExcelPackage dla formatów OOXML (Office 2007)

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

Zerknij na moje wpisy na blogu:

Tworzenie arkuszy kalkulacyjnych Excel .XLS i .XLSX w C #

NPOI z tabelą Excel i wykresem dynamicznym

 170
Author: Leniel Maccaferri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-07 14:13:08

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

EDIT - jeszcze kilka linków:

 112
Author: Panos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 05:58:33

Rozwiązanie komercyjne, SpreadsheetGear dla. Net zrobi to.

You can see live ASP.NET (C # i VB) próbki tutaj i pobrać wersję testową tutaj .

Zastrzeżenie: posiadam SpreadsheetGear LLC

 81
Author: Joe Erickson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 06:00:01

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

Jeśli XLSX jest koniecznością: ExcelPackage to dobry początek, ale zmarł, gdy programista przestał nad nim pracować. ExML podniósł się stamtąd i dodał kilka funkcji. ExML nie jest złym rozwiązaniem, nadal używam go w kilku stronach produkcyjnych.

Do wszystkich moich nowych projektów używam NPOI, portu.NET Apache POI. NPOI 2.0 (Alpha) obsługuje również XLSX.

 66
Author: Nate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 06:03:39

Niezwykle lekką opcją może być użycie tabel HTML. Po prostu utwórz znaczniki head, body I table w pliku i zapisz go jako plik za pomocą an .rozszerzenie xls. Istnieją specyficzne atrybuty firmy Microsoft, których można użyć do stylizacji danych wyjściowych, w tym formuł.

Zdaję sobie sprawę, że możesz nie kodować tego w aplikacji internetowej, ale oto Przykład składu pliku Excel za pomocą tabeli HTML. Ta technika może być używana, jeśli kodujesz aplikację konsolową, pulpit aplikacja lub usługa.

 65
Author: Forgotten Semicolon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-13 17:26:47

Jeśli tworzysz pliki Excel 2007/2010 wypróbuj ten projekt open source: https://github.com/closedxml/closedxml

Zapewnia obiektowy sposób manipulowania plikami (podobny do VBA) bez radzenia sobie z kłopotami związanymi z dokumentami XML. Może być stosowany przez dowolny język. NET jak C# i Visual Basic (VB).

ClosedXML pozwala na tworzenie plików Excel 2007/2010 bez Excela podanie. Typowym przykładem jest tworzenie raportów Excel w sieci Serwer:

var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Sample Sheet");
worksheet.Cell("A1").Value = "Hello World!";
workbook.SaveAs("HelloWorld.xlsx");
 53
Author: Armfoot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 06:08:15

Możesz użyć ExcelXmlWriter .

Działa dobrze.

 49
Author: 2 revs, 2 users 55%Petr Snobelt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 06:04:43

Możesz chcieć sprawdzić klasy interop dostępne w C# (np. Microsoft.Office.Interop.Excel. Mówisz nie OLE (co nie jest), ale klasy interop są bardzo łatwe w użyciu. Zapoznaj się z dokumentacją c# tutaj (Interop for Excel zaczyna się na stronie 1072 C# PDF).

Możesz być pod wrażeniem, jeśli ich nie wypróbowałeś.

Uwaga na stanowisko Microsoftu w tej sprawie:

Microsoft obecnie nie zaleca i nie obsługuje, Automatyzacja aplikacji Microsoft Office z dowolnego nienadzorowanego, nieinteraktywna aplikacja lub komponent klienta (w tym ASP, ASP.NET, DCOM i NT Services), ponieważ Office może wykazywać niestabilność zachowanie i / lub impas podczas uruchamiania pakietu Office w tym środowisku.

 49
Author: GEOCHET,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-19 14:32:12

Oto całkowicie darmowa biblioteka C#, która umożliwia eksport z DataSet, DataTable lub List<> do prawdziwego Excela 2007 .plik xlsx, używając bibliotek OpenXML:

Http://mikesknowledgebase.com/pages/CSharp/ExportToExcel.htm

Pełny kod źródłowy jest dostarczany-bezpłatnie - wraz z instrukcjami i aplikacją demonstracyjną.

Po dodaniu tej klasy do aplikacji, możesz wyeksportować swój zestaw danych do Excela w jednym wierszu kodu:

CreateExcelFile.CreateExcelDocument(myDataSet, "C:\\Sample.xlsx");

It nic prostszego...

I nawet nie wymaga obecności Excela na twoim serwerze.

 35
Author: Mike Gledhill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-09 17:21:54

Możesz rozważyć utworzenie plików przy użyciu formatu arkusz kalkulacyjny XML 2003 . Jest to prosty format XML wykorzystujący dobrze udokumentowany Schemat .

 26
Author: Sam Warwick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 06:09:25

Możesz rzucić okiem na GemBox.Arkusz kalkulacyjny .

Mają bezpłatną wersję ze wszystkimi funkcjami, ale ograniczoną do 150 wierszy na arkusz i 5 arkuszy na skoroszyt, jeśli mieści się to w Twoich potrzebach.

Nie miałem jeszcze potrzeby jej używać, ale wygląda ciekawie.

 23
Author: ManiacZX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 06:13:22

Syncfusion Essential XlsIO może to zrobić. Nie jest zależny od pakietu Microsoft office, a także ma specjalne Wsparcie dla różnych platform.

Próbka kodu:

//Creates a new instance for ExcelEngine.
ExcelEngine excelEngine = new ExcelEngine();
//Loads or open an existing workbook through Open method of IWorkbooks
IWorkbook workbook = excelEngine.Excel.Workbooks.Open(fileName);
//To-Do some manipulation|
//To-Do some manipulation
//Set the version of the workbook.
workbook.Version = ExcelVersion.Excel2013;
//Save the workbook in file system as xlsx format
workbook.SaveAs(outputFileName);

Cały pakiet kontrolek jest dostępny za darmo za pośrednictwem licencji community program, jeśli kwalifikujesz się (mniej niż 1 milion USD przychodów). Uwaga: pracuję dla Syncfusion.

 21
Author: Davis Jebaraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 06:12:40

Cóż,

Możesz również użyć biblioteki innej firmy, takiej jak Aspose .

Ta Biblioteka ma tę zaletę, że nie wymaga zainstalowania programu Excel na komputerze, co byłoby idealne w Twoim przypadku.

 18
Author: Dimi Toulakis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-26 04:26:57

OpenXML jest również dobrą alternatywą, która pomaga uniknąć instalowania MS Excel na serwerze.Open XML SDK 2.0 dostarczany przez Microsoft upraszcza zadanie manipulowania pakietami Open XML i podstawowymi elementami schematu Open XML w pakiecie. Open XML Application Programming Interface (API) zawiera wiele typowych zadań, które programiści wykonują na otwartych pakietach XML.

Sprawdź to OpenXML: alternatywa, która pomaga uniknąć instalacji MS Excel na serwerze

 17
Author: Sachin Dhir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-02 13:30:28

Różne biblioteki XML Office 2003 dostępne działają całkiem dobrze dla mniejszych plików excel. Jednak uważam, że sama wielkość dużego skoroszytu zapisanego w formacie XML jest problemem. Na przykład skoroszyt, z którym pracuję, to 40MB w nowym (i co prawda bardziej szczelnie zapakowanym) formacie XLSX staje się plikiem XML 360MB.

Jeśli chodzi o moje badania, istnieją dwa komercyjne pakiety, które umożliwiają wyjście do starszych formatów plików binarnych. Oni są:

Ani nie są tanie (500USD i 800usd odpowiednio, myślę). ale oba działają niezależnie od samego Excela.

Ciekawi mnie moduł Excel output dla takich OpenOffice.org. ciekawe czy można je przenieść z Javy do. Net.

 17
Author: biozinc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 06:14:03

Zgadzam się co do generowania arkuszy kalkulacyjnych XML, oto przykład jak to zrobić w C # 3 (wszyscy tylko blogują o tym w VB 9 :P) http://www.aaron-powell.com/linq-to-xml-to-excel

 15
Author: Slace,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-26 02:47:22

Ostatnio używałem FlexCel.NET i okazało się, że jest to doskonała biblioteka! Nie mówię tego o zbyt wielu produktach oprogramowania. Nie ma sensu dawać całego skoku sprzedaży tutaj, można przeczytać wszystkie funkcje na ich stronie internetowej.

Jest to produkt komercyjny, ale otrzymasz pełne źródło, jeśli go kupisz. Więc przypuszczam, że możesz skompilować to do swojego zespołu, jeśli naprawdę chcesz. W przeciwnym razie jest to tylko jeden dodatkowy montaż do xcopy - bez konfiguracji, instalacji lub cokolwiek w tym stylu.

Myślę, że nie znajdziesz sposobu, aby to zrobić bez bibliotek innych firm, ponieważ. NET framework, oczywiście, nie ma wbudowanego wsparcia dla niego i OLE Automation to po prostu cały świat bólu.

 15
Author: EMP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 06:15:37

Napisałem prosty kod do eksportu zestawu danych do Excela bez użycia obiektu excel przy użyciu System. IO. StreamWriter.

Poniżej znajduje się kod, który odczyta wszystkie tabele ze zbioru danych i zapisuje je do arkuszy jeden po drugim. Skorzystałem z pomocy tego artykułu .

public static void exportToExcel(DataSet source, string fileName)
{
        const string endExcelXML = "</Workbook>";
        const string startExcelXML = "<xml version>\r\n<Workbook " +
                 "xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"\r\n" +
                 " xmlns:o=\"urn:schemas-microsoft-com:office:office\"\r\n " +
                 "xmlns:x=\"urn:schemas-    microsoft-com:office:" +
                 "excel\"\r\n xmlns:ss=\"urn:schemas-microsoft-com:" +
                 "office:spreadsheet\">\r\n <Styles>\r\n " +
                 "<Style ss:ID=\"Default\" ss:Name=\"Normal\">\r\n " +
                 "<Alignment ss:Vertical=\"Bottom\"/>\r\n <Borders/>" +
                 "\r\n <Font/>\r\n <Interior/>\r\n <NumberFormat/>" +
                 "\r\n <Protection/>\r\n </Style>\r\n " +
                 "<Style ss:ID=\"BoldColumn\">\r\n <Font " +
                 "x:Family=\"Swiss\" ss:Bold=\"1\"/>\r\n </Style>\r\n " +
                 "<Style     ss:ID=\"StringLiteral\">\r\n <NumberFormat" +
                 " ss:Format=\"@\"/>\r\n </Style>\r\n <Style " +
                 "ss:ID=\"Decimal\">\r\n <NumberFormat " +
                 "ss:Format=\"0.0000\"/>\r\n </Style>\r\n " +
                 "<Style ss:ID=\"Integer\">\r\n <NumberFormat " +
                 "ss:Format=\"0\"/>\r\n </Style>\r\n <Style " +
                 "ss:ID=\"DateLiteral\">\r\n <NumberFormat " +
                 "ss:Format=\"mm/dd/yyyy;@\"/>\r\n </Style>\r\n " +
                 "</Styles>\r\n ";
        System.IO.StreamWriter excelDoc = null;
        excelDoc = new System.IO.StreamWriter(fileName);

        int sheetCount = 1;
        excelDoc.Write(startExcelXML);
        foreach (DataTable table in source.Tables)
        {
            int rowCount = 0;
            excelDoc.Write("<Worksheet ss:Name=\"" + table.TableName + "\">");
            excelDoc.Write("<Table>");
            excelDoc.Write("<Row>");
            for (int x = 0; x < table.Columns.Count; x++)
            {
                excelDoc.Write("<Cell ss:StyleID=\"BoldColumn\"><Data ss:Type=\"String\">");
                excelDoc.Write(table.Columns[x].ColumnName);
                excelDoc.Write("</Data></Cell>");
            }
            excelDoc.Write("</Row>");
            foreach (DataRow x in table.Rows)
            {
                rowCount++;
                //if the number of rows is > 64000 create a new page to continue output
                if (rowCount == 64000)
                {
                    rowCount = 0;
                    sheetCount++;
                    excelDoc.Write("</Table>");
                    excelDoc.Write(" </Worksheet>");
                    excelDoc.Write("<Worksheet ss:Name=\"" + table.TableName + "\">");
                    excelDoc.Write("<Table>");
                }
                excelDoc.Write("<Row>"); //ID=" + rowCount + "
                for (int y = 0; y < table.Columns.Count; y++)
                {
                    System.Type rowType;
                    rowType = x[y].GetType();
                    switch (rowType.ToString())
                    {
                        case "System.String":
                            string XMLstring = x[y].ToString();
                            XMLstring = XMLstring.Trim();
                            XMLstring = XMLstring.Replace("&", "&");
                            XMLstring = XMLstring.Replace(">", ">");
                            XMLstring = XMLstring.Replace("<", "<");
                            excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
                                           "<Data ss:Type=\"String\">");
                            excelDoc.Write(XMLstring);
                            excelDoc.Write("</Data></Cell>");
                            break;
                        case "System.DateTime":
                            //Excel has a specific Date Format of YYYY-MM-DD followed by  
                            //the letter 'T' then hh:mm:sss.lll Example 2005-01-31T24:01:21.000
                            //The Following Code puts the date stored in XMLDate 
                            //to the format above
                            DateTime XMLDate = (DateTime)x[y];
                            string XMLDatetoString = ""; //Excel Converted Date
                            XMLDatetoString = XMLDate.Year.ToString() +
                                 "-" +
                                 (XMLDate.Month < 10 ? "0" +
                                 XMLDate.Month.ToString() : XMLDate.Month.ToString()) +
                                 "-" +
                                 (XMLDate.Day < 10 ? "0" +
                                 XMLDate.Day.ToString() : XMLDate.Day.ToString()) +
                                 "T" +
                                 (XMLDate.Hour < 10 ? "0" +
                                 XMLDate.Hour.ToString() : XMLDate.Hour.ToString()) +
                                 ":" +
                                 (XMLDate.Minute < 10 ? "0" +
                                 XMLDate.Minute.ToString() : XMLDate.Minute.ToString()) +
                                 ":" +
                                 (XMLDate.Second < 10 ? "0" +
                                 XMLDate.Second.ToString() : XMLDate.Second.ToString()) +
                                 ".000";
                            excelDoc.Write("<Cell ss:StyleID=\"DateLiteral\">" +
                                         "<Data ss:Type=\"DateTime\">");
                            excelDoc.Write(XMLDatetoString);
                            excelDoc.Write("</Data></Cell>");
                            break;
                        case "System.Boolean":
                            excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
                                        "<Data ss:Type=\"String\">");
                            excelDoc.Write(x[y].ToString());
                            excelDoc.Write("</Data></Cell>");
                            break;
                        case "System.Int16":
                        case "System.Int32":
                        case "System.Int64":
                        case "System.Byte":
                            excelDoc.Write("<Cell ss:StyleID=\"Integer\">" +
                                    "<Data ss:Type=\"Number\">");
                            excelDoc.Write(x[y].ToString());
                            excelDoc.Write("</Data></Cell>");
                            break;
                        case "System.Decimal":
                        case "System.Double":
                            excelDoc.Write("<Cell ss:StyleID=\"Decimal\">" +
                                  "<Data ss:Type=\"Number\">");
                            excelDoc.Write(x[y].ToString());
                            excelDoc.Write("</Data></Cell>");
                            break;
                        case "System.DBNull":
                            excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
                                  "<Data ss:Type=\"String\">");
                            excelDoc.Write("");
                            excelDoc.Write("</Data></Cell>");
                            break;
                        default:
                            throw (new Exception(rowType.ToString() + " not handled."));
                    }
                }
                excelDoc.Write("</Row>");
            }
            excelDoc.Write("</Table>");
            excelDoc.Write(" </Worksheet>");
            sheetCount++;
        }


        excelDoc.Write(endExcelXML);
        excelDoc.Close();
    }
 15
Author: Harsha.Vaswani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 06:17:05

Po prostu chcę dodać kolejne odniesienie do rozwiązania strony trzeciej, które bezpośrednio rozwiązuje twój problem: http://www.officewriter.com

[[0]}(Zastrzeżenie: pracuję dla SoftArtisans, firmy, która produkuje OfficeWriter)
 14
Author: Eisbaer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-23 16:52:27

IKVM + POI

LUB, możesz użyć Interop ...

 13
Author: MagicKat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 22:39:50

Oto sposób, aby to zrobić z LINQ do XML, wraz z przykładowym kodem:

Szybkie importowanie i eksportowanie danych Excel za pomocą LINQ do XML

Jest to trochę skomplikowane, ponieważ musisz importować przestrzenie nazw itd., ale pozwala to uniknąć zewnętrznych zależności.

(również, oczywiście, jest to VB. NET, Nie C#, ale zawsze możesz wyizolować rzeczy VB. NET we własnym projekcie, aby używać liter XML, a Wszystko inne robić w C#.)

 12
Author: Kyralessa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-22 15:30:48

Niektórzy zewnętrzni dostawcy komponentów, tacy jak Infragistics lub Syncfusion, zapewniają bardzo dobre możliwości eksportu programu Excel, które nie wymagają zainstalowania programu Microsoft Excel.

Ponieważ dostawcy ci dostarczają również zaawansowane komponenty siatki interfejsu użytkownika, komponenty te są szczególnie przydatne, jeśli chcesz, aby styl i układ eksportu programu excel naśladował bieżący stan siatki w interfejsie użytkownika aplikacji.

Jeśli twój eksport ma być wykonywany po stronie serwera z naciskiem na dane do wyeksportowania i bez linku do UI, wtedy wybrałbym jedną z darmowych opcji open source (np. ExcelLibrary).

Byłem wcześniej zaangażowany w projekty, które próbowały wykorzystać automatyzację po stronie serwera w pakiecie Microsoft Office. Opierając się na tym doświadczeniu zdecydowanie polecam takie podejście.

 12
Author: Simen S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-16 11:47:30
public class GridViewExportUtil
{
    public static void Export(string fileName, GridView gv)
    {
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.AddHeader(
            "content-disposition", string.Format("attachment; filename={0}", fileName));
        HttpContext.Current.Response.ContentType = "application/ms-excel";

        using (StringWriter sw = new StringWriter())
        {
            using (HtmlTextWriter htw = new HtmlTextWriter(sw))
            {
                //  Create a form to contain the grid
                Table table = new Table();

                //  add the header row to the table
                if (gv.HeaderRow != null)
                {
                    GridViewExportUtil.PrepareControlForExport(gv.HeaderRow);
                    table.Rows.Add(gv.HeaderRow);
                }

                //  add each of the data rows to the table
                foreach (GridViewRow row in gv.Rows)
                {
                    GridViewExportUtil.PrepareControlForExport(row);
                    table.Rows.Add(row);
                }

                //  add the footer row to the table
                if (gv.FooterRow != null)
                {
                    GridViewExportUtil.PrepareControlForExport(gv.FooterRow);
                    table.Rows.Add(gv.FooterRow);
                }

                //  render the table into the htmlwriter
                table.RenderControl(htw);

                //  render the htmlwriter into the response
                HttpContext.Current.Response.Write(sw.ToString());
                HttpContext.Current.Response.End();
            }
        }
    }

    /// <summary>
    /// Replace any of the contained controls with literals
    /// </summary>
    /// <param name="control"></param>
    private static void PrepareControlForExport(Control control)
    {
        for (int i = 0; i < control.Controls.Count; i++)
        {
            Control current = control.Controls[i];
            if (current is LinkButton)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text));
            }
            else if (current is ImageButton)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText));
            }
            else if (current is HyperLink)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text));
            }
            else if (current is DropDownList)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text));
            }
            else if (current is CheckBox)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False"));
            }

            if (current.HasControls())
            {
                GridViewExportUtil.PrepareControlForExport(current);
            }
        }
    }
}

Witam To rozwiązanie polega na wyeksportowaniu widoku siatki do pliku excel to może Ci pomóc

 12
Author: Gaurav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-28 11:44:22

Możesz tworzyć ładnie sformatowane pliki Excel za pomocą tej biblioteki: http://officehelper.codeplex.com/documentation
Patrz poniżej przykład:

using (ExcelHelper helper = new ExcelHelper(TEMPLATE_FILE_NAME, GENERATED_FILE_NAME))
{
    helper.Direction = ExcelHelper.DirectionType.TOP_TO_DOWN;
    helper.CurrentSheetName = "Sheet1";
    helper.CurrentPosition = new CellRef("C3");

    //the template xlsx should contains the named range "header"; use the command "insert"/"name".
    helper.InsertRange("header");

    //the template xlsx should contains the named range "sample1";
    //inside this range you should have cells with these values:
    //<name> , <value> and <comment>, which will be replaced by the values from the getSample()
    CellRangeTemplate sample1 = helper.CreateCellRangeTemplate("sample1", new List<string> {"name", "value", "comment"}); 
    helper.InsertRange(sample1, getSample());

    //you could use here other named ranges to insert new cells and call InsertRange as many times you want, 
    //it will be copied one after another;
    //even you can change direction or the current cell/sheet before you insert

    //typically you put all your "template ranges" (the names) on the same sheet and then you just delete it
    helper.DeleteSheet("Sheet3");
}        

Gdzie próbka wygląda tak:

private IEnumerable<List<object>> getSample()
{
    var random = new Random();

    for (int loop = 0; loop < 3000; loop++)
    {
        yield return new List<object> {"test", DateTime.Now.AddDays(random.NextDouble()*100 - 50), loop};
    }
}
 12
Author: 3 revs, 2 users 58%unknown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-11 13:51:04

Najprostszym i najszybszym sposobem utworzenia pliku Excel z C# jest użycie narzędzia Open XML Productivity. Narzędzie Open XML Productivity jest dostarczane wraz z instalacją Open XML SDK. Narzędzie odwraca dowolny plik Excela do kodu C#. Kod C# może być następnie użyty do ponownego wygenerowania tego pliku.

Przegląd procesu jest następujący:

  1. zainstaluj zestaw SDK Open XML za pomocą tego narzędzia.
  2. Utwórz plik Excel przy użyciu najnowszego klienta programu Excel z pożądanym wyglądem. Nazwij to DesiredLook.xlsx.
  3. przy pomocy narzędzia otwórz {[0] } i kliknij przycisk Reflect Code w pobliżu góry. Tutaj wpisz opis obrazka
  4. kod C# dla Twojego pliku zostanie wygenerowany w prawym okienku narzędzia. Dodaj to do swojego rozwiązania C# i wygeneruj pliki o pożądanym wyglądzie.

Jako bonus, ta metoda działa dla dowolnych plików Word i PowerPoint. Jako programista C#, będziesz następnie wprowadzać zmiany w kodzie, aby dopasować je do swoich potrzeb.

Opracowałem prostą aplikację WPF na GitHubie który w tym celu będzie działał w systemie Windows. Istnieje klasa zastępcza o nazwie GeneratedClass, w której możesz wkleić wygenerowany kod. Jeśli wrócisz do jednej wersji pliku, wygeneruje on plik excel w następujący sposób:

Tutaj wpisz opis obrazka

 12
Author: Taterhead,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-25 03:57:55

Kilka przydatnych automatyzacji Excela w C#, u można znaleźć z poniższego linku.

Http://csharp.net-informations.com/excel/csharp-excel-tutorial.htm

Bolton.

 8
Author: user35711,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-10 05:02:18

Spójrz na przykładach jak tworzyć pliki Excel.

Istnieją przykłady w C # i VB.NET

Zarządza plikami xsl XSLX i CSV Excel.

Http://www.devtriogroup.com/ExcelJetcell/Samples

 8
Author: Bonnie Cornell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-12 07:04:36