web-dev-qa-db-fra.com

Comment lire depuis XLSX (Excel)?

J'ai un problème avec la lecture du fichier .xlsx (Excel). J'ai essayé d'utiliser:

var fileName = @"C:\automated_testing\ProductsUploadTemplate-2015-10-22.xlsx";
var connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", fileName);

var adapter = new OleDbDataAdapter("SELECT * FROM [workSheetNameHere$]", connectionString);
var ds = new DataSet();
adapter.Fill(ds, "XLSData");
DataTable data = ds.Tables["XLSData"];

// ... Loop over all rows.
StringBuilder sb = new StringBuilder();
foreach (DataRow row in data.Rows)
{
    sb.AppendLine(string.Join(",", row.ItemArray));
}

mais en cas d'échec en raison de connectionString. J'ai donc mis à jour la ligne pour prendre en charge .xlsx:

var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 12.0;", fileName);

mais je reçois:

Le fournisseur "Microsoft.ACE.OLEDB.12.0" n'est pas enregistré sur la machine locale.

(Le problème ici est que je ne peux pas installer de nouveau logiciel sur ma machine de test à distance, donc je ne suis pas en mesure de le réparer et j'ai besoin de trouver une autre solution.)

Je dois également être sûr que les données importées seront stockées d'une manière simple (je suis un programmeur débutant) pour me permettre de les parcourir, c'est-à-dire de créer des objets avec les données de la ligne.

Autres approches que j'ai vérifiées:

commentaire: semble probablement fonctionner pour moi, mais ne prend pas en charge les fichiers Excel de dimensions inconnues (nombre aléatoire de lignes et de colonnes).

comment: ne prend pas en charge les noms de colonne de paramètres d'une ligne différente de la première (dans certains de mes fichiers Excel, il y a des commentaires dans 4-6 premières lignes, puis la ligne d'en-tête et les données ci-dessous).

commentaire: même problème que ci-dessus.

commentaire: le poids du package téléchargé dépassait 60 Mo et il me faut l'installer sur le système, ce qui n'est pas possible dans ma situation. Quoi qu'il en soit, les gens disent qu'il est limité à 150 lignes.

En attendant, je vais essayer de vérifier https://code.google.com/p/linqtoexcel/ , mais toutes les autres idées sont plus que bienvenues!

EDIT: Je viens de vérifier que LinqToExcel, même problème que ci-dessus:

Le fournisseur "Microsoft.ACE.OLEDB.12.0" n'est pas enregistré sur la machine locale.

EDIT2: En fin de compte, il semble que cette solution ait résolu mon problème:

https://stackoverflow.com/a/19065266/3146582

20
Tomasz Tarnowski

Si vous lisez des données à partir du fichier Excel, vous pouvez utiliser le package NuGet EPPlus et utiliser le code suivant:

//using OfficeOpenXml;
using (ExcelPackage xlPackage = new ExcelPackage(new FileInfo(@"C:\YourDirectory\sample.xlsx")))
{
    var myWorksheet = xlPackage.Workbook.Worksheets.First(); //select sheet here
    var totalRows = myWorksheet.Dimension.End.Row;
    var totalColumns = myWorksheet.Dimension.End.Column;

    var sb = new StringBuilder(); //this is your data
    for (int rowNum = 1; rowNum <= totalRows; rowNum++) //select starting row here
    {
        var row = myWorksheet.Cells[rowNum, 1, rowNum, totalColumns].Select(c => c.Value == null ? string.Empty : c.Value.ToString());
        sb.AppendLine(string.Join(",", row));
    }
}
28
Arghya C

La lecture de fichiers Excel avec OLE n'est possible que si le moteur MS Jet (MS Access) est installé. J'ai remarqué que vous avez décidé d'utiliser l'interopérabilité .NET vers l'API, mais ce n'est pas une bonne idée: il nécessite MS Excel installé et n'est pas recommandé d'utiliser pour l'automatisation sur les serveurs.

Si vous n'avez pas besoin de prendre en charge les anciens formats Excel (binaires) (xls) et que la lecture de XLSX est suffisante, je recommande d'utiliser la bibliothèque EPPlus . Il fournit une API simple et puissante pour la lecture et l'écriture de fichiers XLSX (et contient de nombreux exemples):

var existingFile = new FileInfo(filePath);
// Open and read the XlSX file.
using (var package = new ExcelPackage(existingFile)) {
   // access worksheets, cells etc
}
2

Je voudrais suggérer la bibliothèque open-source et gratuite ExcelMapper (disponible sur NuGet).

Il fournit une manière beaucoup plus concise (c'est-à-dire lisible) de lire les fichiers Excel par rapport aux approches plus conventionnelles via par ex. OLE requêtes ou Microsoft.Interop.Office.

1. Étant donné un fichier Excel :

enter image description here

2.Créez un objet Personne C #:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
}

3.Lisez-le à l'aide d'ExcelMapper

  var fileName = @"C:\Temp\Names.xlsx"; // your Excel file
  List<Person> people = new ExcelMapper(fileName).Fetch<Person>();

Vous pouvez également lire à partir d'autres feuilles de calcul, en passant simplement un argument de feuille supplémentaire:

  var fileName = @"C:\Temp\Names.xlsx"; // your Excel file
  List<Person> people = new ExcelMapper(fileName).Fetch<Person>("Sheet2");

Vous pouvez l'installer en utilisant NuGet

Install-Package ExcelMapper

Avis de non-responsabilité: Je ne suis pas associé à ExcelMapper, mais après avoir essayé différentes bibliothèques, j'ai trouvé cette bibliothèque la plus facile à utiliser.

Voici une courte, gratuite vidéo présentant ExcelMapper. instructional video - how to read Excel files in c#

1