web-dev-qa-db-de.com

Exportieren von DataTable nach Excel mit Open Xml SDK in c #

Sorry für mein Englisch bitte .. Ich bin neu in open xml sdk .. Mein Programm kann einige Daten und DataTable in eine Excel-Datei (Vorlage) exportieren . Es funktioniert sehr gut, aber ich muss auch eine DataTable einfügen ....__ Mein Beispielcode:

using (Stream OutStream = new MemoryStream())
{
    // read teamplate
    using (var fileStream = File.OpenRead(templatePath))
        fileStream.CopyTo(OutStream);

    // exporting
    Exporting(OutStream);

    // to start
    OutStream.Seek(0L, SeekOrigin.Begin);

    // out
    using (var resultFile = File.Create(resultPath))
        OutStream.CopyTo(resultFile);

Nächste Methode zum Exportieren

private void Exporting(Stream template)
{
    using (var workbook = SpreadsheetDocument.Open(template, true, new OpenSettings                          { AutoSave = true }))
    {
        // Replace shared strings
        SharedStringTablePart sharedStringsPart = workbook.WorkbookPart.SharedStringTablePart;
        IEnumerable<Text> sharedStringTextElements = sharedStringsPart.SharedStringTable.Descendants<Text>();

        DoReplace(sharedStringTextElements);
        // Replace inline strings
        IEnumerable<WorksheetPart> worksheetParts = workbook.GetPartsOfType<WorksheetPart>();

        foreach (var worksheet in worksheetParts)
        {
            DoReplace(worksheet.Worksheet.Descendants<Text>());
        }

        int z = 40;
        foreach (System.Data.DataRow row in ExcelWorkXLSX.ToOut.Rows)
        {
            for (int i = 0; i < row.ItemArray.Count(); i++)
            { 
                ExcelWorkXLSX.InsertText(workbook, row.ItemArray.ElementAt(i).ToString(), getColumnName(i), Convert.ToUInt32(z)); }
                z++;
            }
        } 

    }
}

Aber dieses Fragment zur Ausgabe von DataTable slooooooooooooooooooooowwwwwwwww ...

Wie kann ich DataTable schnell und zuverlässig nach Excel exportieren?

38
user1576474

Ich habe dieses kurze Beispiel geschrieben. Für mich geht das. Ich habe es nur mit einem Datensatz mit einer Tabelle getestet, aber ich denke, das reicht für Sie.

Bedenken Sie, dass ich alle Zellen als String behandelt habe (nicht einmal SharedStrings). Wenn Sie SharedStrings verwenden möchten, müssen Sie möglicherweise mein Sample etwas anpassen.

Bearbeiten: Damit dies funktioniert, müssen dem Projekt WindowsBase- und DocumentFormat.OpenXml-Referenzen hinzugefügt werden.

Genießen,

private void ExportDataSet(DataSet ds, string destination)
        {
            using (var workbook = SpreadsheetDocument.Create(destination, DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook))
            {
                var workbookPart = workbook.AddWorkbookPart();

                workbook.WorkbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook();

                workbook.WorkbookPart.Workbook.Sheets = new DocumentFormat.OpenXml.Spreadsheet.Sheets();

                foreach (System.Data.DataTable table in ds.Tables) {

                    var sheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>();
                    var sheetData = new DocumentFormat.OpenXml.Spreadsheet.SheetData();
                    sheetPart.Worksheet = new DocumentFormat.OpenXml.Spreadsheet.Worksheet(sheetData);

                    DocumentFormat.OpenXml.Spreadsheet.Sheets sheets = workbook.WorkbookPart.Workbook.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.Sheets>();
                    string relationshipId = workbook.WorkbookPart.GetIdOfPart(sheetPart);

                    uint sheetId = 1;
                    if (sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Count() > 0)
                    {
                        sheetId =
                            sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Select(s => s.SheetId.Value).Max() + 1;
                    }

                    DocumentFormat.OpenXml.Spreadsheet.Sheet sheet = new DocumentFormat.OpenXml.Spreadsheet.Sheet() { Id = relationshipId, SheetId = sheetId, Name = table.TableName };
                    sheets.Append(sheet);

                    DocumentFormat.OpenXml.Spreadsheet.Row headerRow = new DocumentFormat.OpenXml.Spreadsheet.Row();

                    List<String> columns = new List<string>();
                    foreach (System.Data.DataColumn column in table.Columns) {
                        columns.Add(column.ColumnName);

                        DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell();
                        cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
                        cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(column.ColumnName);
                        headerRow.AppendChild(cell);
                    }


                    sheetData.AppendChild(headerRow);

                    foreach (System.Data.DataRow dsrow in table.Rows)
                    {
                        DocumentFormat.OpenXml.Spreadsheet.Row newRow = new DocumentFormat.OpenXml.Spreadsheet.Row();
                        foreach (String col in columns)
                        {
                            DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell();
                            cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
                            cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(dsrow[col].ToString()); //
                            newRow.AppendChild(cell);
                        }

                        sheetData.AppendChild(newRow);
                    }

                }
            }
        }
80
eburgos

eburgos, ich habe Ihren Code leicht modifiziert, da er in Ihrem Dataset mehrere Datentabellen überschrieb und diese nur in der Kalkulationstabelle überschrieben wurden. In der Arbeitsmappe waren nur noch ein Arbeitsblatt vorhanden. Ich habe im Grunde nur den Teil verschoben, in dem die Arbeitsmappe außerhalb der Schleife erstellt wird. Hier ist der aktualisierte Code.

private void ExportDSToExcel(DataSet ds, string destination)
{
    using (var workbook = SpreadsheetDocument.Create(destination, DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook))
    {
        var workbookPart = workbook.AddWorkbookPart();
        workbook.WorkbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook();
        workbook.WorkbookPart.Workbook.Sheets = new DocumentFormat.OpenXml.Spreadsheet.Sheets();

        uint sheetId = 1;

        foreach (DataTable table in ds.Tables)
        {
            var sheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>();
            var sheetData = new DocumentFormat.OpenXml.Spreadsheet.SheetData();
            sheetPart.Worksheet = new DocumentFormat.OpenXml.Spreadsheet.Worksheet(sheetData);                

            DocumentFormat.OpenXml.Spreadsheet.Sheets sheets = workbook.WorkbookPart.Workbook.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.Sheets>();
            string relationshipId = workbook.WorkbookPart.GetIdOfPart(sheetPart);

            if (sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Count() > 0)
            {
                sheetId =
                    sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Select(s => s.SheetId.Value).Max() + 1;
            }

            DocumentFormat.OpenXml.Spreadsheet.Sheet sheet = new DocumentFormat.OpenXml.Spreadsheet.Sheet() { Id = relationshipId, SheetId = sheetId, Name = table.TableName };
            sheets.Append(sheet);

            DocumentFormat.OpenXml.Spreadsheet.Row headerRow = new DocumentFormat.OpenXml.Spreadsheet.Row();

            List<String> columns = new List<string>();
            foreach (DataColumn column in table.Columns)
            {
                columns.Add(column.ColumnName);

                DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell();
                cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
                cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(column.ColumnName);
                headerRow.AppendChild(cell);
            }

            sheetData.AppendChild(headerRow);

            foreach (DataRow dsrow in table.Rows)
            {
                DocumentFormat.OpenXml.Spreadsheet.Row newRow = new DocumentFormat.OpenXml.Spreadsheet.Row();
                foreach (String col in columns)
                {
                    DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell();
                    cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
                    cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(dsrow[col].ToString()); //
                    newRow.AppendChild(cell);
                }

                sheetData.AppendChild(newRow);
            }
        }
    }
}
14
msr

Ich habe auch eine C #/VB.Net-Bibliothek "Export to Excel" geschrieben, die OpenXML und (noch wichtiger) auch OpenXmlWriter verwendet, damit beim Schreiben großer Dateien nicht genügend Speicherplatz zur Verfügung steht.

Den vollständigen Quellcode und eine Demo können Sie hier herunterladen:

Nach Excel exportieren

Es ist kinderleicht zu bedienen ... __ Geben Sie einfach den Dateinamen, in den Sie schreiben möchten, und DataTable, DataSet oder List<>.

CreateExcelFile.CreateExcelDocument(myDataSet, "MyFilename.xlsx");

Wenn Sie es von einer ASP.Net-Anwendung aus aufrufen, übergeben Sie die HttpResponse-Datei, in die die Datei geschrieben werden soll.

CreateExcelFile.CreateExcelDocument(myDataSet, "MyFilename.xlsx", Response);
7
Mike Gledhill

Ich habe meinen eigenen Export nach Excel geschrieben, da nichts anderes meinen Anforderungen entsprach. Es ist schnell und ermöglicht eine umfangreiche Formatierung der Zellen. Sie können es unter überprüfen

https://openxmlexporttoexcel.codeplex.com/

Ich hoffe, es hilft.

1
Steve

Sie können meine Bibliothek hier anschauen. Unter dem Dokumentationsabschnitt erfahren Sie, wie Sie eine Datentabelle importieren. 

Du musst nur schreiben

using (var doc = new SpreadsheetDocument(@"C:\OpenXmlPackaging.xlsx")) {
    Worksheet sheet1 = doc.Worksheets.Add("My Sheet");
    sheet1.ImportDataTable(ds.Tables[0], "A1", true);
}

Ich hoffe es hilft!

0
jamdagni86

Sie könnten versuchen, einen Blick auf diese Bibliothek zu werfen. Ich habe es für eines meiner Projekte verwendet und fand es sehr einfach, zuverlässig und schnell zu arbeiten (ich habe es nur zum Exportieren von Daten verwendet).

http://epplus.codeplex.com/

0
KLIM8D

Ich habe eine akzeptierte Antwort versucht und eine Meldung erhalten, dass die generierte Excel-Datei beim Versuch, sie zu öffnen, beschädigt ist. Ich konnte das Problem beheben, indem ich einige Änderungen vorgenommen habe, beispielsweise das Ende des Codes unterhalb der Zeile.

workbookPart.Workbook.Save();

Ich habe den vollständigen Code @ Exportieren von DataTable nach Excel mit Open XML in c # gepostet

0
Saranga