Façon optimale de lire un fichier Excel (.xls/.xlsx)

je sais qu'il y a différentes façons de lire un fichier Excel:

  • Iterop
  • Oledb
  • Open Xml SDK

la compatibilité n'est pas une question car le programme sera exécuté dans un environnement contrôlé.

Mon Exigence:

Lire un fichier à un DataTable / CUstom Entitie s (Je ne sais pas comment dynamique propriétés/champs d'un objet[noms de colonne permettra d'être bref dans un fichier Excel])

utiliser DataTable/Custom Entities pour effectuer certaines opérations en utilisant ses données.

mise à jour DataTable avec les résultats des opérations

renvoie à excel file .

ce qui serait plus simple.

également si possible me conseiller sur les entités personnalisées (ajout de propriétés / champs à un objet dynamiquement)

47
demandé sur shA.t 2012-10-21 12:36:10

4 réponses

regardez Linq-To-Excel . Il est assez soignée.

var book = new LinqToExcel.ExcelQueryFactory(@"File.xlsx");

var query =
    from row in book.Worksheet("Stock Entry")
    let item = new
    {
        Code = row["Code"].Cast<string>(),
        Supplier = row["Supplier"].Cast<string>(),
        Ref = row["Ref"].Cast<string>(),
    }
    where item.Supplier == "Walmart"
    select item;

il permet également l'accès en ligne fortement dactylographié aussi.

58
répondu Enigmativity 2015-11-04 20:58:00

en utilisant la requête OLE, c'est assez simple (par exemple sheetName est Sheet1$):

DataTable LoadWorksheetInDataTable(string fileName, string sheetName)
{           
    DataTable sheetData = new DataTable();
    using (OleDbConnection conn = this.returnConnection(fileName))
    {
       conn.Open();
       // retrieve the data using data adapter
       OleDbDataAdapter sheetAdapter = new OleDbDataAdapter("select * from [" + sheetName + "]", conn);
        sheetAdapter.Fill(sheetData);
    }                        
    return sheetData;
}

private OleDbConnection returnConnection(string fileName)
{
    return new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + "; Jet OLEDB:Engine Type=5;Extended Properties=\"Excel 8.0;\"");
}

pour les nouvelles versions Excel:

return new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + ";Extended Properties=Excel 12.0;");

vous pouvez également utiliser Excel Data Reader un projet open source sur CodePlex. Cela fonctionne très bien pour exporter des données à partir de feuilles Excel.

le code d'échantillon indiqué sur le lien spécifié:

FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);

//1. Reading from a binary Excel file ('97-2003 format; *.xls)
IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
//...
//2. Reading from a OpenXml Excel file (2007 format; *.xlsx)
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
//...
//3. DataSet - The result of each spreadsheet will be created in the result.Tables
DataSet result = excelReader.AsDataSet();
//...
//4. DataSet - Create column names from first row
excelReader.IsFirstRowAsColumnNames = true;
DataSet result = excelReader.AsDataSet();

//5. Data Reader methods
while (excelReader.Read())
{
//excelReader.GetInt32(0);
}

//6. Free resources (IExcelDataReader is IDisposable)
excelReader.Close();

référence: Comment puis-je importer à partir d'Excel à une base de données à l'aide de Microsoft.Bureau.Interop.Excel?

18
répondu Furqan Safdar 2017-09-19 16:05:32

essayez d'utiliser cette voie libre pour ceci, https://freenetexcel.codeplex.com

 Workbook workbook = new Workbook();

 workbook.LoadFromFile(@"..\..\parts.xls",ExcelVersion.Version97to2003);
 //Initialize worksheet
 Worksheet sheet = workbook.Worksheets[0];

 DataTable dataTable = sheet.ExportDataTable();
3
répondu Hark.Tenl 2014-04-24 10:37:01

si vous pouvez le restreindre à just (Open Office XML format) *.XLSX files, alors probablement la bibliothèque la plus populaire serait EPPLus .

Bonus est, il n'y a pas d'autres dépendances. Il suffit d'installer en utilisant nuget:

Install-Package EPPlus
1
répondu davewasthere 2017-10-19 10:02:15