wake-up-neo.com

Wie erstellt man eine Excel-Datei (.XLS und .XLSX) in C #, ohne Ms Office zu installieren?

Wie kann ich eine Excel-Kalkulationstabelle mit C # erstellen, ohne dass Excel auf dem Computer installiert werden muss, auf dem der Code ausgeführt wird?

1679
mistrmark

Sie können eine Bibliothek mit dem Namen ExcelLibrary verwenden. Es ist eine kostenlose, in Google Code veröffentlichte Open Source-Bibliothek:

ExcelLibrary

Dies scheint ein Port des PHP ExcelWriter zu sein, den Sie oben erwähnt haben. Es wird noch nicht in das neue .xlsx-Format geschrieben, aber sie arbeiten daran, diese Funktionalität hinzuzufügen.

Es ist sehr einfach, klein und einfach zu bedienen. Außerdem gibt es einen DataSetHelper, mit dem Sie DataSets und DataTables verwenden können, um problemlos mit Excel-Daten zu arbeiten.

ExcelLibrary scheint immer noch nur für das ältere Excel-Format (XLS-Dateien) zu funktionieren, fügt jedoch möglicherweise Unterstützung für neuere 2007/2010-Formate hinzu. 

Sie können auch EPPlus verwenden. Dies funktioniert nur für Dateien im Excel 2007/2010-Format (XLSX-Dateien). Es gibt auch NPOI , das mit beiden zusammenarbeitet.

Es gibt einige bekannte Fehler mit jeder Bibliothek, wie in den Kommentaren angegeben. Insgesamt scheint EPPlus im Laufe der Zeit die beste Wahl zu sein. Es scheint auch aktiver zu aktualisieren und zu dokumentieren.

Wie von @ АртёмЦарионов unten erwähnt, unterstützt EPPlus außerdem Pivot-Tabellen, und ExcelLibrary kann Unterstützung bieten ( Pivot-Tabellenproblem in ExcelLibrary )

Hier sind ein paar Links zum schnellen Nachschlagen:
ExcelLibrary - GNU Weniger GPL
EPPlus - GNU Lesser General Public License (LGPL)
NPOI - Apache-Lizenz

Hier ein Beispielcode für ExcelLibrary:

Hier ein Beispiel, das Daten aus einer Datenbank entnimmt und daraus eine Arbeitsmappe erstellt. Beachten Sie, dass der ExcelLibrary-Code unten eine einzelne Zeile ist:

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

Das Erstellen der Excel-Datei ist so einfach. Sie können Excel-Dateien auch manuell erstellen, aber die oben genannte Funktionalität hat mich wirklich beeindruckt.

937
Mike Webb

Wenn Sie mit dem XLSX-Format zufrieden sind, probieren Sie mein codeplex GitHub-Projekt. EPPlus . Ich habe es mit der Quelle von ExcelPackage angefangen, aber heute ist es eine komplette Neufassung Unterstützt Bereiche, Zellstyling, Diagramme, Formen, Bilder, Namensbereiche, Autofilter und vieles mehr.

528
Jan Källman

Ich habe mit Erfolg folgende Open Source-Projekte verwendet:

  • ExcelPackage für OOXML-Formate (Office 2007)

  • NPOI für das .XLS-Format (Office 2003). NPOI 2.0 (Beta) unterstützt auch XLSX.

Sehen Sie sich meine Blogbeiträge an:

Erstellen von Excel-Tabellenkalkulationen .XLS und .XLSX in C #

NPOI mit Excel-Tabelle und dynamischem Diagramm

158

Und wie sieht es mit der Verwendung von Open XML SDK 2.0 für Microsoft Office aus?

Einige Vorteile:

  • Office muss nicht installiert sein
  • Hergestellt von Microsoft = anständige MSDN-Dokumentation
  • Nur eine .Net-DLL für das Projekt
  • SDK enthält viele Tools wie diff, validator usw

Links:

154
Pellared

Sie können OLEDB zum Erstellen und Bearbeiten von Excel-Dateien verwenden. Überprüfen Sie Folgendes: Lesen und Schreiben von Excel mit OLEDB

Typisches Beispiel:

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

BEARBEITEN - Einige weitere Links:

100
Panos

Die kommerzielle Lösung SpreadsheetGear für .NET wird dies tun.

Sie können live ASP.NET (C # und VB) -Beispiele hier sehen und eine Evaluierungsversion hier herunterladen.

Haftungsausschluss: Ich besitze SpreadsheetGear LLC

75
Joe Erickson

Einige Optionen, die ich verwendet habe:

Wenn XLSX ein Muss ist: ExcelPackage ist ein guter Anfang, der jedoch nach dem Ende des Entwicklers abgebrochen wurde. ExML wurde von dort abgeholt und um einige Funktionen erweitert. ExML ist keine schlechte Option, ich verwende es immer noch in einigen Produktionswebseiten.

Für alle meine neuen Projekte verwende ich jedoch NPOI , den .NET-Port von Apache POI . NPOI 2.0 (Alpha) unterstützt auch XLSX.

61
Nate

Eine extrem einfache Option kann die Verwendung von HTML-Tabellen sein. Erstellen Sie einfach head-, body- und table-Tags in einer Datei und speichern Sie sie als Datei mit der Erweiterung .xls. Es gibt Microsoft-spezifische Attribute, die Sie zur Formatierung der Ausgabe verwenden können, einschließlich Formeln.

Ich stelle fest, dass Sie dies möglicherweise nicht in einer Webanwendung codieren, aber hier ist ein Beispiel der Zusammensetzung einer Excel-Datei über eine HTML-Tabelle. Diese Technik kann verwendet werden, wenn Sie eine Konsolenanwendung, Desktopanwendung oder einen Dienst programmieren.

58

Sie können ExcelXmlWriter verwenden.

Es funktioniert gut.

44
Petr Snobelt

Vielleicht möchten Sie die Interop-Klassen überprüfen. Sie sagen nein OLE (was das nicht ist), aber die Interop-Klassen sind sehr einfach zu verwenden.

Sie könnten beeindruckt sein, wenn Sie sie nicht ausprobiert haben.

Bitte seien Sie in diesem Zusammenhang vor Microsofts Haltung gewarnt:

Microsoft empfiehlt derzeit nicht Automatisierung von Microsoft Office-Anwendungen von beliebigen unbeaufsichtigten nicht interaktive Clientanwendung oder -komponente (einschließlich ASP, ASP.NET, DCOM und NT-Dienste), da Office möglicherweise instabil ist Verhalten und/oder Deadlock, wenn Office in dieser Umgebung ausgeführt wird.

42
GEOCHET

Wenn Sie Excel 2007/2010-Dateien erstellen, versuchen Sie es mit diesem Open Source-Projekt: https://github.com/closedxml/closedxml

Es bietet eine objektorientierte Methode zum Bearbeiten der Dateien (ähnlich wie VBA), ohne sich mit den Problemen von XML-Dokumenten befassen zu müssen. Es kann benutzt werden von einer beliebigen .NET-Sprache wie C # und Visual Basic (VB).

Mit ClosedXML können Sie Excel 2007/2010-Dateien ohne Excel .__ erstellen. Anwendung. Ein typisches Beispiel ist das Erstellen von Excel-Berichten in einem Web Server:

var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Sample Sheet");
worksheet.Cell("A1").Value = "Hello World!";
workbook.SaveAs("HelloWorld.xlsx");
41
Manuel

Hier ist eine vollständig freie C # -Bibliothek, mit der Sie aus einer DataSet, DataTable oder List<> in eine echte Excel 2007-.xlsx-Datei mit den OpenXML-Bibliotheken exportieren können:

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

Der vollständige Quellcode wird - kostenlos - zusammen mit Anweisungen und einer Demoanwendung zur Verfügung gestellt.

Nachdem Sie diese Klasse zu Ihrer Anwendung hinzugefügt haben, können Sie Ihr DataSet in nur einer Codezeile nach Excel exportieren:

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

Einfacher geht es nicht ...

Und es muss nicht einmal Excel auf Ihrem Server vorhanden sein.

30
Mike Gledhill

Sie könnten in Betracht ziehen, Ihre Dateien im Format XML ​​Spreadsheet 2003 zu erstellen. Dies ist ein einfaches XML-Format, das ein gut dokumentiertes Schema verwendet.

23
Sam Warwick

Syncfusion Essential XlsIO kann dies tun. Es ist nicht abhängig von Microsoft Office und unterstützt auch verschiedene Plattformen.

Codebeispiel:

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

Die gesamte Palette an Kontrollen ist kostenlos über das Programm community license verfügbar, wenn Sie sich qualifizieren (weniger als 1 Million USD Umsatz). Hinweis: Ich arbeite für Syncfusion.

18
Davis Jebaraj

Vielleicht möchten Sie einen Blick auf GemBox.Spreadsheet werfen.

Sie haben eine kostenlose Version mit allen Funktionen, jedoch begrenzt auf 150 Zeilen pro Blatt und 5 Blatt pro Arbeitsmappe, falls dies Ihren Anforderungen entspricht.

Ich musste es noch nicht selbst benutzen, sieht aber interessant aus.

17
ManiacZX

OpenXML ist auch eine gute Alternative, um die Installation von MS Excel auf einem Server zu vermeiden. Das von Microsoft bereitgestellte Open XML SDK 2.0 vereinfacht die Bearbeitung von Open XML-Paketen und der zugrunde liegenden Open XML-Schemaelemente in einem Paket. Die Open XML-Anwendungsprogrammierschnittstelle (API) umfasst viele allgemeine Aufgaben, die Entwickler mit Open XML-Paketen durchführen.

Check this out OpenXML: Alternative, die die Installation von MS Excel auf dem Server verhindert

14
Sachin Dhir

Gut,

sie können auch eine Drittanbieter-Bibliothek wie Aspose verwenden.

Diese Bibliothek hat den Vorteil, dass Excel nicht auf Ihrem Computer installiert werden muss, was in Ihrem Fall ideal wäre.

14
Dimi Takis

Die verschiedenen verfügbaren Office 2003 XML-Bibliotheken eignen sich für kleinere Excel-Dateien. Ich finde jedoch die schiere Größe einer großen Arbeitsmappe, die im XML-Format gespeichert ist, ein Problem. Eine Arbeitsmappe, mit der ich arbeite, wäre zum Beispiel 40 MB im neuen (und zwar enger gepackter) XLSX-Format, das eine 360 ​​MB-XML-Datei wird.

Nach meinen Recherchen gibt es zwei kommerzielle Pakete, die die Ausgabe in ältere Binärdateiformate ermöglichen. Sie sind:

Weder sind billig (500USD bzw. 800USD, denke ich). Beide arbeiten jedoch unabhängig von Excel.

Was mich interessieren würde, ist das Excel-Ausgabemodul für OpenOffice.org. Ich frage mich, ob sie von Java auf .Net portiert werden können.

13
biozinc

Ich bin damit einverstanden, XML-Spreadsheets zu generieren. Hier ein Beispiel, wie es für C # 3 gemacht wird (jeder bloggt nur in VB 9: P) http://www.aaron-powell.com/linq- to-xml-to-Excel

13
Aaron Powell

Sie möchten einfach eine weitere Referenz zu einer Drittanbieterlösung hinzufügen, die Ihr Problem direkt anspricht: http://www.officewriter.com

(Haftungsausschluss: Ich arbeite für SoftArtisans, das Unternehmen, das OfficeWriter herstellt)

12
Eisbaer

IKVM + POI

Oder Sie könnten das Interop verwenden ...

11
MagicKat

Hier ist eine Möglichkeit, dies mit LINQ to XML zu tun, einschließlich Beispielcode:

Schnelles Importieren und Exportieren von Excel-Daten mit LINQ in XML

Dies ist ein wenig komplex, da Sie Namespaces usw. importieren müssen, Sie können jedoch externe Abhängigkeiten vermeiden.

(Natürlich ist es auch VB .NET, nicht C #, aber Sie können den VB .NET-Inhalt in seinem eigenen Projekt immer für die Verwendung von XML-Literalen isolieren und alles andere in C # tun.)

11
Ryan Lundy

Sie können mit dieser Bibliothek schön formatierte Excel-Dateien erstellen: http://officehelper.codeplex.com/documentation
Siehe unteres Beispiel:

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

wo Probe so aussieht:

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

Einige Drittanbieter von Komponenten wie Infragistics oder Syncfusion bieten sehr gute Excel-Exportfunktionen, für die keine Installation von Microsoft Excel erforderlich ist. 

Da diese Hersteller auch erweiterte UI-Grid-Komponenten bereitstellen, sind diese Komponenten besonders praktisch, wenn Sie möchten, dass Stil und Layout eines Excel-Exports den aktuellen Status eines Grids in der Benutzeroberfläche Ihrer Anwendung nachahmen.

Wenn Ihr Export serverseitig ausgeführt werden soll und der Schwerpunkt auf den zu exportierenden Daten liegt und keine Verknüpfung mit der Benutzeroberfläche besteht, würde ich eine der freien Open-Source-Optionen wählen (z. B. ExcelLibrary). 

Ich war zuvor an Projekten beteiligt, bei denen versucht wurde, serverseitige Automatisierung für die Microsoft Office-Suite zu verwenden. Aufgrund dieser Erfahrung würde ich dringend gegen diesen Ansatz empfehlen. 

11
Simen S
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);
            }
        }
    }
}

Hallo, diese Lösung besteht darin, Ihre Rasteransicht in Ihre Excel-Datei zu exportieren

11
Gaurav

Ich habe kürzlich FlexCel.NET verwendet und fand es eine ausgezeichnete Bibliothek! Ich sage das nicht über zu viele Softwareprodukte. Es macht keinen Sinn, das gesamte Verkaufsargument hier anzugeben, Sie können alle Funktionen auf ihrer Website lesen.

Es ist ein kommerzielles Produkt, aber Sie erhalten die vollständige Quelle, wenn Sie es kaufen. Ich denke, Sie könnten es in Ihre Versammlung einbauen, wenn Sie es wirklich wollten. Ansonsten ist es nur eine zusätzliche Baugruppe für xcopy - keine Konfiguration oder Installation oder ähnliches.

Ich denke nicht, dass Sie ohne Bibliotheken von Drittanbietern keinen Weg finden werden, da .NET Framework offensichtlich keine Unterstützung dafür bietet und OLE Automatisierung ist nur eine Welt voller Schmerzen.

10
EMP

Ich habe einen einfachen Code zum Exportieren von Datensätzen nach Excel geschrieben, ohne ein Excel-Objekt mithilfe von System.IO.StreamWriter zu verwenden.

Nachfolgend finden Sie den Code, mit dem alle Tabellen aus dem Datensatz gelesen und nacheinander in die Blätter geschrieben werden. Ich habe Hilfe von diesem Artikel erhalten.

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();
    }
10
Harsha.Vaswani

Die einfachste und schnellste Möglichkeit, eine Excel-Datei aus C # zu erstellen, ist die Verwendung des Open XML Productivity Tool. Das Open XML Productivity Tool wird mit der Open XML SDK-Installation geliefert. Das Tool erstellt jede Excel-Datei in C # -Code. Der C # -Code kann dann verwendet werden, um diese Datei neu zu generieren.

Ein Überblick über den Prozess ist:

  1. Installieren Sie das Open XML SDK mit dem Tool.
  2. Erstellen Sie eine Excel-Datei mit dem neuesten Excel-Client mit dem gewünschten Aussehen. Nennen Sie es DesiredLook.xlsx.
  3. Öffnen Sie mit dem Tool DesiredLook.xlsx und klicken Sie oben auf die Schaltfläche Code reflektieren  enter image description here
  4. Der C # -Code für Ihre Datei wird im rechten Fensterbereich des Tools generiert. Fügen Sie dies Ihrer C # -Lösung hinzu und generieren Sie Dateien mit dem gewünschten Look.

Als Bonus funktioniert diese Methode für alle Word- und PowerPoint-Dateien. Als C # -Entwickler nehmen Sie dann Änderungen am Code vor, die Ihren Anforderungen entsprechen.

Ich habe eine einfache WPF-App auf github entwickelt, die zu diesem Zweck unter Windows läuft. Es gibt eine Platzhalter-Klasse mit dem Namen GeneratedClass, in die Sie den generierten Code einfügen können. Wenn Sie eine Version der Datei zurückgehen, wird eine Excel-Datei wie folgt generiert:

 enter image description here

9
Taterhead

Schauen Sie sich Beispiele an, wie Sie Excel-Dateien erstellen.

Es gibt Beispiele in C # und VB.NET

Es verwaltet XSL-XSLX- und CSV-Excel-Dateien.

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

8
Bonnie Cornell

Einige nützliche Excel-Automatisierung in C # finden Sie unter folgendem Link.

http://csharp.net-informations.com/Excel/csharp-Excel-tutorial.htm

bolton.

8
user35711

Hast du schon mal Sylk ausprobiert?

Wir haben Excel-Sheets im klassischen Stil als Sylk erstellt und suchen jetzt auch nach einem Excel-Generator.

Die Vorteile für Sylk sind, Sie können die Zellen formatieren. 

7
Stefan Koelle

Die Java-Open-Source-Lösung ist Apache POI . Vielleicht gibt es eine Möglichkeit, Interop hier einzurichten, aber ich weiß nicht genug über Java, um das zu beantworten.

Als ich dieses Problem erforschte, benutzte ich schließlich die Interop-Baugruppen.

4
Nick

Suchen Sie nach ExtremeML. Es ist eine ziemlich coole Bibliothek, in der Sie das OpenXML-Format zum Erzeugen von OpenXML-Dateien verwenden können.

Es ist auch ein OpenSource-Projekt.

http://www.extrememl.com/

4
Jens

Ich stimme auch für GemBox.Spreadsheet .

Sehr schnell und einfach zu bedienen, mit vielen Beispielen auf ihrer Website.

Ich habe meine Berichtsaufgaben auf eine völlig neue Ebene der Ausführungsgeschwindigkeit gebracht.

3

http://www.codeproject.com/KB/cs/Excel_and_C_.aspx <= Warum nutzen Sie nicht einfach die eingebaute Power von Windows? Installieren Sie Office auf dem Server. Jede installierte Anwendung kann automatisiert werden.

So viel einfacher, verwenden Sie einfach die nativen Methoden.

Wenn es installiert ist, können Sie es verwenden. Dies ist das beeindruckendste und meistgenutzte Feature in Windows, das in den guten alten Zeiten als COMbed COM bezeichnet wurde, und es spart Ihnen jede Menge Zeit und Schmerzen.

Oder verwenden Sie einfach die MS-Bibliothek von ref lib - http://csharp.net-informations.com/Excel/csharp-create-Excel.htm

3
Craig Mc

Sie können es einfach im XML-Format in XML schreiben und mit der Erweiterung .XLS benennen, und es wird mit Excel geöffnet. Sie können die gesamte Formatierung (Fett, Breiten usw.) in Ihrer XML-Dateikopfzeile steuern.

Es gibt ein Beispiel XML von Wikipedia .

3
ScaleOvenStove

Eine sehr einfache Möglichkeit, die oft übersehen wird, ist das Erstellen eines .rdlc-Berichts mithilfe von Microsoft Reporting und das Exportieren in das Excel-Format. Sie können es in Visual Studio entwerfen und die Datei mit Hilfe von: 

localReport.Render("EXCELOPENXML", null, ((name, ext, encoding, mimeType, willSeek) => stream = new FileStream(name, FileMode.CreateNew)), out warnings);

Sie können es auch mit .doc oder .pdf exportieren, indem Sie "WORDOPENXML" und "PDF" verwenden. Es wird auf vielen verschiedenen Plattformen wie ASP.NET und SSRS unterstützt.

Es ist viel einfacher, Änderungen in einem visuellen Designer vorzunehmen, in dem Sie die Ergebnisse sehen und mir vertrauen können. Sobald Sie mit dem Gruppieren von Daten beginnen, Gruppenköpfe formatieren und neue Abschnitte hinzufügen, möchten Sie sich nicht mit Dutzenden von XML-Knoten herumschlagen.

2
AlexDev

Vor einiger Zeit habe ich ein DLL auf NPOI erstellt. Es ist sehr einfach zu benutzen:

IList<DummyPerson> dummyPeople = new List<DummyPerson>();
//Add data to dummyPeople...
IExportEngine engine = new ExcelExportEngine();
engine.AddData(dummyPeople); 
MemoryStream memory = engine.Export();

Mehr darüber erfahren Sie auf hier

Übrigens ist 100% Open Source. Fühlen Sie sich frei zu verwenden, zu bearbeiten und zu teilen;)

1

Wenn Sie aus dem Code Datentabellen oder Datagridview erstellen, können Sie alle Daten mit dieser einfachen Methode speichern. Diese Methode wird nicht empfohlen, ist jedoch zu 100% funktionsfähig, selbst wenn Sie MS Excel nicht auf Ihrem Computer installieren.

try
 {
  SaveFileDialog saveFileDialog1 = new SaveFileDialog();
  saveFileDialog1.Filter = "Excel Documents (*.xls)|*.xls";
  saveFileDialog1.FileName = "Employee Details.xls";
  if (saveFileDialog1.ShowDialog() == DialogResult.OK)
  {
  string fname = saveFileDialog1.FileName;
  StreamWriter wr = new StreamWriter(fname);
  for (int i = 0; i <DataTable.Columns.Count; i++)
  {
  wr.Write(DataTable.Columns[i].ToString().ToUpper() + "\t");
  }
  wr.WriteLine();

  //write rows to Excel file
  for (int i = 0; i < (DataTable.Rows.Count); i++)
  {
  for (int j = 0; j < DataTable.Columns.Count; j++)
  {
  if (DataTable.Rows[i][j] != null)
  {
  wr.Write(Convert.ToString(getallData.Rows[i][j]) + "\t");
  }
   else
   {
   wr.Write("\t");
   }
   }
   //go to next line
   wr.WriteLine();
   }
   //close file
   wr.Close();
   }
   }
   catch (Exception)
   {
    MessageBox.Show("Error Create Excel Sheet!");
   }

Überprüfen Sie dies, ohne dass Sie Bibliotheken von Drittanbietern benötigen. Sie können einfach datendatenfähige Daten in eine Excel-Datei exportieren

var dt = "your code for getting data into datatable";
            Response.ClearContent();
            Response.AddHeader("content-disposition", string.Format("attachment;filename={0}.xls", DateTime.Now.ToString("yyyy-MM-dd")));
            Response.ContentType = "application/vnd.ms-Excel";
            string tab = "";
            foreach (DataColumn dataColumn in dt.Columns)
            {
                Response.Write(tab + dataColumn.ColumnName);
                tab = "\t";
            }
            Response.Write("\n");
            int i;
            foreach (DataRow dataRow in dt.Rows)
            {
                tab = "";
                for (i = 0; i < dt.Columns.Count; i++)
                {
                    Response.Write(tab + dataRow[i].ToString());
                    tab = "\t";
                }
                Response.Write("\n");
            }
            Response.End();
0
Shubham

Um xls im xlsx-Format zu speichern, müssen Sie lediglich die SaveAs-Methode aus der Microsoft.Office.Interop.Excel-Bibliothek aufrufen. Diese Methode benötigt etwa 16 Parameter und einer davon ist auch das Dateiformat.

Microsoft-Dokument: Here SaveAs-Methode Argumente

Das Objekt, das wir übergeben müssen, ist wie 

wb.SaveAs(filename, 51, System.Reflection.Missing.Value,
System.Reflection.Missing.Value, false, false, 1,1, true, 
System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value)

Hier ist 51 der Aufzählungswert für XLSX

Für SaveAs in verschiedenen Dateiformaten können Sie auf das Verzeichnis xlFileFormat verweisen.

0
Vijay Dodamani