web-dev-qa-db-fra.com

Exporter les valeurs dans List pour exceller

Bonjour, je vais avoir un conteneur de liste qui contient la liste des valeurs. Je souhaite exporter les valeurs de la liste directement vers Excel. Est-il possible de le faire directement?

14
susanthosh

OK, voici un guide étape par étape si vous souhaitez utiliser COM.

  1. Vous devez avoir installé Excel.
  2. Ajoutez une référence à votre projet à la DLL interop Excel. Pour ce faire, dans l'onglet .NET, sélectionnez Microsoft. Office.Interop.Excel . Il pourrait y avoir plusieurs assemblys Sélectionnez le .__ approprié à votre version de Visual Studio ET Excel. 
  3. Voici un exemple de code pour créer un nouveau classeur et remplir une colonne avec Les éléments de votre liste.

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

En utilisant le concept CSV, s'il ne s'agit que d'une liste de chaînes. En supposant que l soit votre liste:

using System.IO;

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

Utilisation de ClosedXML library (il n’est pas nécessaire d’installer MS Excel

Je viens d’écrire un exemple simple pour vous montrer comment vous pouvez nommer le fichier, la feuille de calcul et sélectionner des cellules:

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

Si vous préférez, vous pouvez créer un System.Data.DataSet ou un System.Data.DataTable avec toutes les données, puis simplement l'ajouter en tant que workseet avec workbook.AddWorksheet(yourDataset) ou workbook.AddWorksheet(yourDataTable);

10
Tommaso Cerutti

Vous pouvez les exporter dans un fichier .csv et ouvrir le fichier dans Excel. Est-ce assez direct?

1
Jon Cage

La manière la plus simple (à mon avis) serait simplement de constituer un fichier CSV. Si vous voulez entrer dans le formatage et écrire réellement dans un fichier * .xlsx, il existe des solutions plus compliquées (et APIs ) pour le faire à votre place.

1
Sapph

En fonction de l'environnement dans lequel vous souhaitez effectuer cette opération, il est possible d'utiliser Excel Interop. C’est tout un gâchis que de gérer COM en veillant à dégager des ressources, sinon les instances Excel restent sur votre ordinateur.

Checkout this Exemple MSDN si vous souhaitez en savoir plus. 

Selon votre format, vous pouvez produire vous-même du CSV ou SpreadsheetML, ce n’est pas trop difficile. D'autres alternatives consistent à utiliser des bibliothèques tierces pour le faire. Évidemment, ils coûtent de l'argent si.

0
Ian

le moyen le plus simple de le faire est d'ouvrir Excel créer une feuille contenant les données de test que vous souhaitez exporter, puis dire dans Excel enregistrer au format XML ouvrir le fichier XML voir le format XML attendu par Excel et le générer en remplaçant les données de test par des données d'exportation

Spécification de balisage SpreadsheetML

@lan c'est xml pour un fichier simle execel avec une valeur de colonne générée avec office 2003 ce format est pour office 2003 et supérieur 

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

où le fichier de classe de référence cs.getcompletionreport() correspond à Business Layer for App
J'espère que ça aide.

0
Rizwan Patel

La façon la plus simple d'utiliser ClosedXml.

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

Pour plus d'informations, vous pouvez également consulter le wiki de ClosedXml . https://github.com/closedxml/closedxml/wiki

0
leahsaif

Je sais que je suis en retard pour cette fête, mais je pense que cela pourrait être utile pour les autres.

Les réponses déjà postées concernent le format csv et l’autre par Interop dll où vous devez installer Excel sur le serveur, chaque approche ayant ses propres avantages et inconvénients . Voici une option qui vous donnera 

  1. Sortie Excel parfaite [pas de csv]
  2. Avec Excel parfait et votre type de données correspond
  3. Sans installation d'Excel
  4. Passer la liste et obtenir une sortie Excel :)

vous pouvez y parvenir en utilisant NPOI DLL , disponible à la fois pour .net et pour .net core

Pas :

  1. Importer une DLL NPOI
  2. Ajoutez le code des sections 1 et 2 fourni ci-dessous
  3. Bon aller

Section 1

Ce code effectue la tâche ci-dessous:

  1. Création d'un nouvel objet Excel - _workbook = new XSSFWorkbook();
  2. Création d'un nouvel objet de feuille Excel - _sheet =_workbook.CreateSheet(_sheetName); 
  3. Invoque WriteData() - expliqué plus tard Enfin, créer et
  4. retournant l'objet MemoryStream

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

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

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

Section 2

Dans la section 2, nous allons effectuer les étapes suivantes:

  1. Convertit List en DataTable Reflection pour lire le nom de la propriété, votre
  2. En-tête de colonne viendra d'ici
  3. Boucle à travers DataTable pour créer des lignes Excel

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

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

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

Maintenant, il vous suffit d’appeler la fonction WriteData () en transmettant votre liste, qui vous fournira votre Excel.

Je l'ai testé dans Web API et Web API, fonctionne comme un charme.

0