wake-up-neo.net

Exportieren der Werte in List nach Excel

Hallo, ich habe einen Listencontainer, der die Liste der Werte enthält. Ich möchte die Listenwerte direkt nach Excel exportieren. Gibt es eine Möglichkeit, dies direkt zu tun?

14
susanthosh

OK, hier ist eine Schritt-für-Schritt-Anleitung, wenn Sie COM verwenden möchten.

  1. Sie müssen Excel installiert haben.
  2. Fügen Sie der Excel-Interop-DLL einen Verweis auf Ihr Projekt hinzu. Wählen Sie dazu Auf der Registerkarte .NET. Microsoft.Office.Interop.Excel. Es können mehrere Assemblys Mit diesem Namen vorhanden sein. Wählen Sie das für Ihre Version von Visual Studio UND Excel gültige . 
  3. Hier ist ein Codebeispiel, um eine neue Arbeitsmappe zu erstellen und eine Spalte mit Den Elementen aus Ihrer Liste zu füllen.

using NsExcel = Microsoft.Office.Interop.Excel;

public void ListToExcel(List<string> list)
{
    //start Excel
    NsExcel.ApplicationClass excapp = new Microsoft.Office.Interop.Excel.ApplicationClass();

    //if you want to make Excel visible           
    excapp.Visible = true;

    //create a blank workbook
    var workbook = excapp.Workbooks.Add(NsExcel.XlWBATemplate.xlWBATWorksheet);

    //or open one - this is no pleasant, but yue're probably interested in the first parameter
    string workbookPath = "C:\test.xls";
    var workbook = excapp.Workbooks.Open(workbookPath,
        0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "",
        true, false, 0, true, false, false);

    //Not done yet. You have to work on a specific sheet - note the cast
    //You may not have any sheets at all. Then you have to add one with NsExcel.Worksheet.Add()
    var sheet = (NsExcel.Worksheet)workbook.Sheets[1]; //indexing starts from 1

    //do something usefull: you select now an individual cell
    var range = sheet.get_Range("A1", "A1");
    range.Value2 = "test"; //Value2 is not a typo

    //now the list
    string cellName;
    int counter = 1;
    foreach (var item in list)
    {
        cellName = "A" + counter.ToString();
        var range = sheet.get_Range(cellName, cellName);
        range.Value2 = item.ToString();
        ++counter;
    }

    //you've probably got the point by now, so a detailed explanation about workbook.SaveAs and workbook.Close is not necessary
    //important: if you did not make Excel visible terminating your application will terminate Excel as well - I tested it
    //but if you did it - to be honest - I don't know how to close the main Excel window - maybee somewhere around excapp.Windows or excapp.ActiveWindow
}
18
naeron84

Verwenden Sie die CSV-Idee, wenn es sich nur um eine Liste von Strings handelt. Angenommen, l ist Ihre Liste:

using System.IO;

using(StreamWriter sw = File.CreateText("list.csv"))
{
  for(int i = 0; i < l.Count; i++)
  {
    sw.WriteLine(l[i]);
  }
}
12

Verwenden von ClosedXML library (MS Excel muss nicht installiert werden

Ich schreibe nur ein einfaches Beispiel, um Ihnen zu zeigen, wie Sie die Datei, das Arbeitsblatt und die Zellen auswählen können:

    var workbook = new XLWorkbook();
    workbook.AddWorksheet("sheetName");
    var ws = workbook.Worksheet("sheetName");

    int row = 1;
    foreach (object item in itemList)
    {
        ws.Cell("A" + row.ToString()).Value = item.ToString();
        row++;
    }

    workbook.SaveAs("yourExcel.xlsx");

Wenn Sie möchten, können Sie eine System.Data.DataSet oder eine System.Data.DataTable mit allen Daten erstellen und diese dann als Arbeitsbereich mit workbook.AddWorksheet(yourDataset) oder workbook.AddWorksheet(yourDataTable) hinzufügen.

10
Tommaso Cerutti

Exportieren von Wertelisten nach Excel

  1. Installieren Sie in Nuget nächste Referenz
  2. Install-Package Syncfusion.XlsIO.Net.Core -Version 17.2.0.35
  3. Install-Package ClosedXML -Version 0.94.2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ClosedXML;
using ClosedXML.Excel;
using Syncfusion.XlsIO;

namespace ExporteExcel
{
    class Program
    {
        public class Auto
        {
            public string Marca { get; set; }

            public string Modelo { get; set; }
            public int Ano { get; set; }

            public string Color { get; set; }
            public int Peronsas { get; set; }
            public int Cilindros { get; set; }
        }
        static void Main(string[] args)
        {
            //Lista Estatica
            List<Auto> Auto = new List<Program.Auto>()
            {
                new Auto{Marca = "Chevrolet", Modelo = "Sport", Ano = 2019, Color= "Azul", Cilindros=6, Peronsas= 4 },
                new Auto{Marca = "Chevrolet", Modelo = "Sport", Ano = 2018, Color= "Azul", Cilindros=6, Peronsas= 4 },
                new Auto{Marca = "Chevrolet", Modelo = "Sport", Ano = 2017, Color= "Azul", Cilindros=6, Peronsas= 4 }
            };
            //Inizializar Librerias
            var workbook = new XLWorkbook();
            workbook.AddWorksheet("sheetName");
            var ws = workbook.Worksheet("sheetName");
            //Recorrer el objecto
            int row = 1;
            foreach (var c in Auto)
            {
                //Escribrie en Excel en cada celda
                ws.Cell("A" + row.ToString()).Value = c.Marca;
                ws.Cell("B" + row.ToString()).Value = c.Modelo;
                ws.Cell("C" + row.ToString()).Value = c.Ano;
                ws.Cell("D" + row.ToString()).Value = c.Color;
                ws.Cell("E" + row.ToString()).Value = c.Cilindros;
                ws.Cell("F" + row.ToString()).Value = c.Peronsas;
                row++;

            }
            //Guardar Excel 
            //Ruta = Nombre_Proyecto\bin\Debug
            workbook.SaveAs("Coches.xlsx");
        }
    }
}
1
Luis Valencia

Sie könnten sie in eine .csv-Datei ausgeben und die Datei in Excel öffnen. Ist das direkt genug?

1
Jon Cage

Der einfachste Weg (meiner Meinung nach) wäre, einfach eine CSV-Datei zusammenzustellen. Wenn Sie Formatierungen erstellen und tatsächlich in eine * .xlsx-Datei schreiben möchten, gibt es komplexere Lösungen (und APIs ), die das für Sie tun.

1
Sapph

Abhängig von der Umgebung, in der Sie dies tun möchten, ist dies mit Excel Interop möglich. Der Umgang mit COM ist jedoch ziemlich umständlich und stellt sicher, dass Sie Ressourcen aufräumen, ansonsten bleiben Excel-Instanzen auf Ihrem Computer hängen.

Überprüfen Sie dieses MSDN-Beispiel , wenn Sie mehr erfahren möchten. 

Abhängig von Ihrem Format können Sie CSV oder SpreadsheetML selbst erstellen, das ist nicht zu schwer. Andere Alternativen sind die Verwendung von Bibliotheken von Drittanbietern. Offensichtlich kosten sie aber Geld.

0
Ian

der einfachste Weg besteht darin, das Excel-Erstellungsblatt mit Testdaten zu öffnen, die Sie exportieren möchten, und dann in Excel als XML speichern. Öffnen Sie das XML-Format. Sehen Sie sich das XML-Format an, das Excel erwartet, und generieren Sie es, indem Sie die Testdaten durch Exportdaten ersetzen

SpreadsheetML-Auszeichnungsspezifikation

@lan Dies ist XML für eine einfache Execel-Datei mit einem Spaltenwert, den ich mit Office 2003 erstellt habe. Dieses Format ist für Office 2003 und höher 

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-Microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-Microsoft-com:office:office"
 xmlns:x="urn:schemas-Microsoft-com:office:Excel"
 xmlns:ss="urn:schemas-Microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
 <DocumentProperties xmlns="urn:schemas-Microsoft-com:office:office">
  <Author>Dancho</Author>
  <LastAuthor>Dancho</LastAuthor>
  <Created>2010-02-05T10:15:54Z</Created>
  <Company>cc</Company>
  <Version>11.9999</Version>
 </DocumentProperties>
 <ExcelWorkbook xmlns="urn:schemas-Microsoft-com:office:Excel">
  <WindowHeight>13800</WindowHeight>
  <WindowWidth>24795</WindowWidth>
  <WindowTopX>480</WindowTopX>
  <WindowTopY>105</WindowTopY>
  <ProtectStructure>False</ProtectStructure>
  <ProtectWindows>False</ProtectWindows>
 </ExcelWorkbook>
 <Styles>
  <Style ss:ID="Default" ss:Name="Normal">
   <Alignment ss:Vertical="Bottom"/>
   <Borders/>
   <Font/>
   <Interior/>
   <NumberFormat/>
   <Protection/>
  </Style>
 </Styles>
 <Worksheet ss:Name="Sheet1">
  <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="6" x:FullColumns="1"
   x:FullRows="1">
   <Row>
    <Cell><Data ss:Type="String">Value1</Data></Cell>
   </Row>
   <Row>
    <Cell><Data ss:Type="String">Value2</Data></Cell>
   </Row>
   <Row>
    <Cell><Data ss:Type="String">Value3</Data></Cell>
   </Row>
   <Row>
    <Cell><Data ss:Type="String">Value4</Data></Cell>
   </Row>
   <Row>
    <Cell><Data ss:Type="String">Value5</Data></Cell>
   </Row>
   <Row>
    <Cell><Data ss:Type="String">Value6</Data></Cell>
   </Row>
  </Table>
  <WorksheetOptions xmlns="urn:schemas-Microsoft-com:office:Excel">
   <Selected/>
   <Panes>
    <Pane>
     <Number>3</Number>
     <ActiveRow>5</ActiveRow>
    </Pane>
   </Panes>
   <ProtectObjects>False</ProtectObjects>
   <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
 </Worksheet>
 <Worksheet ss:Name="Sheet2">
  <WorksheetOptions xmlns="urn:schemas-Microsoft-com:office:Excel">
   <ProtectObjects>False</ProtectObjects>
   <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
 </Worksheet>
 <Worksheet ss:Name="Sheet3">
  <WorksheetOptions xmlns="urn:schemas-Microsoft-com:office:Excel">
   <ProtectObjects>False</ProtectObjects>
   <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
 </Worksheet>
</Workbook>
0
IordanTanev
List<"classname"> getreport = cs.getcompletionreport(); 

var getreported = getreport.Select(c => new { demographic = c.rName);   

die cs.getcompletionreport()-Referenzklassendatei ist Business Layer für App
Ich hoffe das hilft.

0
Rizwan Patel

Der einfachste Weg, ClosedXml zu verwenden.

Imports ClosedXML.Excel

var dataList = new List<string>() { "a", "b", "c" };
var workbook = new XLWorkbook();     //creates the workbook
var wsDetailedData = workbook.AddWorksheet("data"); //creates the worksheet with sheetname 'data'
wsDetailedData.Cell(1, 1).InsertTable(dataList); //inserts the data to cell A1 including default column name
workbook.SaveAs(@"C:\data.xlsx"); //saves the workbook

Für weitere Informationen können Sie auch das Wiki von ClosedXml überprüfen. https://github.com/closedxml/closedxml/wiki

0
leahsaif

Ich weiß, ich bin zu spät zu dieser Party, aber ich denke, es könnte für andere hilfreich sein.

Bereits veröffentlichte Antworten beziehen sich auf csv und andere auf Interop-DLL, in der Sie Excel über den Server installieren müssen. Jeder Ansatz hat seine eigenen Vor- und Nachteile 

  1. Perfekte Excel-Ausgabe [nicht CSV]
  2. Mit perfektem Excel und deinem Datentyp übereinstimmen
  3. Ohne Excel-Installation
  4. Liste übergeben und Excel-Ausgabe erhalten :)

sie können dies erreichen, indem Sie NPOI DLL verwenden, das sowohl für .net als auch für .net Core verfügbar ist

Schritte :

  1. NPOI-DLL importieren
  2. Fügen Sie den unten angegebenen Code für Abschnitt 1 und 2 hinzu
  3. Gut zu gehen

Abschnitt 1

Dieser Code führt folgende Aufgabe aus:

  1. Neues Excel-Objekt erstellen - _workbook = new XSSFWorkbook();
  2. Neues Excel Sheet-Objekt erstellen - _sheet =_workbook.CreateSheet(_sheetName); 
  3. Ruft WriteData() auf - später erklärt Zum Schluss erstellen und
  4. MemoryStream Objekt zurückgeben

================================================== =============================

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;

namespace GenericExcelExport.ExcelExport
{
    public interface IAbstractDataExport
    {
        HttpResponseMessage Export(List exportData, string fileName, string sheetName);
    }

    public abstract class AbstractDataExport : IAbstractDataExport
    {
        protected string _sheetName;
        protected string _fileName;
        protected List _headers;
        protected List _type;
        protected IWorkbook _workbook;
        protected ISheet _sheet;
        private const string DefaultSheetName = "Sheet1";

        public HttpResponseMessage Export
              (List exportData, string fileName, string sheetName = DefaultSheetName)
        {
            _fileName = fileName;
            _sheetName = sheetName;

            _workbook = new XSSFWorkbook(); //Creating New Excel object
            _sheet = _workbook.CreateSheet(_sheetName); //Creating New Excel Sheet object

            var headerStyle = _workbook.CreateCellStyle(); //Formatting
            var headerFont = _workbook.CreateFont();
            headerFont.IsBold = true;
            headerStyle.SetFont(headerFont);

            WriteData(exportData); //your list object to NPOI Excel conversion happens here

            //Header
            var header = _sheet.CreateRow(0);
            for (var i = 0; i < _headers.Count; i++)
            {
                var cell = header.CreateCell(i);
                cell.SetCellValue(_headers[i]);
                cell.CellStyle = headerStyle;
            }

            for (var i = 0; i < _headers.Count; i++)
            {
                _sheet.AutoSizeColumn(i);
            }

            using (var memoryStream = new MemoryStream()) //creating memoryStream
            {
                _workbook.Write(memoryStream);
                var response = new HttpResponseMessage(HttpStatusCode.OK)
                {
                    Content = new ByteArrayContent(memoryStream.ToArray())
                };

                response.Content.Headers.ContentType = new MediaTypeHeaderValue
                       ("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
                response.Content.Headers.ContentDisposition = 
                       new ContentDispositionHeaderValue("attachment")
                {
                    FileName = $"{_fileName}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx"
                };

                return response;
            }
        }

        //Generic Definition to handle all types of List
        public abstract void WriteData(List exportData);
    }
}

================================================== =============================

Sektion 2

In Abschnitt 2 führen wir die folgenden Schritte aus:

  1. Konvertiert List in DataTable Reflection, um den Eigenschaftsnamen zu lesen
  2. Die Spaltenüberschrift kommt von hier
  3. Durchlaufen Sie DataTable, um Excel-Zeilen zu erstellen

================================================== =============================

using NPOI.SS.UserModel;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Text.RegularExpressions;

namespace GenericExcelExport.ExcelExport
{
    public class AbstractDataExportBridge : AbstractDataExport
    {
        public AbstractDataExportBridge()
        {
            _headers = new List<string>();
            _type = new List<string>();
        }

        public override void WriteData<T>(List<T> exportData)
        {
            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));

            DataTable table = new DataTable();

            foreach (PropertyDescriptor prop in properties)
            {
                var type = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType;
                _type.Add(type.Name);
                table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? 
                                  prop.PropertyType);
                string name = Regex.Replace(prop.Name, "([A-Z])", " $1").Trim(); //space separated 
                                                                           //name by caps for header
                _headers.Add(name);
            }

            foreach (T item in exportData)
            {
                DataRow row = table.NewRow();
                foreach (PropertyDescriptor prop in properties)
                    row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
                table.Rows.Add(row);
            }

            IRow sheetRow = null;

            for (int i = 0; i < table.Rows.Count; i++)
            {
                sheetRow = _sheet.CreateRow(i + 1);
                for (int j = 0; j < table.Columns.Count; j++)
                {
                    ICell Row1 = sheetRow.CreateCell(j);

                    string type = _type[j].ToLower();
                    var currentCellValue = table.Rows[i][j];

                    if (currentCellValue != null && 
                        !string.IsNullOrEmpty(Convert.ToString(currentCellValue)))
                    {
                        if (type == "string")
                        {
                            Row1.SetCellValue(Convert.ToString(currentCellValue));
                        }
                        else if (type == "int32")
                        {
                            Row1.SetCellValue(Convert.ToInt32(currentCellValue));
                        }
                        else if (type == "double")
                        {
                            Row1.SetCellValue(Convert.ToDouble(currentCellValue));
                        }
                    }
                    else
                    {
                        Row1.SetCellValue(string.Empty);
                    }
                }
            }
        }
    }
}

================================================== =============================

Jetzt müssen Sie nur noch die Funktion WriteData () aufrufen, indem Sie Ihre Liste übergeben, und Sie erhalten Ihr Excel.

Ich habe es in WEB API und WEB API Core getestet und funktioniert wie ein Zauber.