Comment lire un fichier excel dans C# sans utiliser Microsoft.Bureau.Interop.Bibliothèques Excel

j'ai une application .Net-Windows en C#. J'ai besoin d'ouvrir un excel et de le traiter. Comment puis-je faire cela sans utiliser Microsoft.Bureau.Interop.Des bibliothèques Excel?

40
demandé sur Jeremy Thompson 2012-02-06 08:40:52

11 réponses

var fileName = @"C:\ExcelFile.xlsx";
var connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties=\"Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text\""; ;
using (var conn = new OleDbConnection(connectionString))
{
    conn.Open();

    var sheets = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
    using (var cmd = conn.CreateCommand())
    {
        cmd.CommandText = "SELECT * FROM [" + sheets.Rows[0]["TABLE_NAME"].ToString() + "] ";

        var adapter = new OleDbDataAdapter(cmd);
        var ds = new DataSet();
        adapter.Fill(ds);
    }
}
38
répondu Aleksandar Vucetic 2012-02-06 05:04:19

je recommande fortement CSharpJExcel pour la lecture des fichiers Excel 97-2003 (xls) et ExcelPackage pour la lecture des fichiers Excel 2007/2010 (Office Open XML format, xlsx).

Ils fonctionnent parfaitement. Ils n'ont absolument aucune dépendance sur quoi que ce soit.

Echantillon utilisant CSharpJExcel:

Workbook workbook = Workbook.getWorkbook(new System.IO.FileInfo(fileName));
var sheet = workbook.getSheet(0);
...
var content = sheet.getCell(colIndex, rowIndex).getContents();
...
workbook.close();

échantillon en utilisant ExcelPackage:

using (ExcelPackage xlPackage = new ExcelPackage(existingFile))
{
  // get the first worksheet in the workbook
  ExcelWorksheet worksheet = xlPackage.Workbook.Worksheets[1];
  int iCol = 2;  // the column to read

  // output the data in column 2
  for (int iRow = 1; iRow < 6; iRow++)
    Console.WriteLine("Cell({0},{1}).Value={2}", iRow, iCol, 
      worksheet.Cell(iRow, iCol).Value);

  // output the formula in row 6
  Console.WriteLine("Cell({0},{1}).Formula={2}", 6, iCol, 
    worksheet.Cell(6, iCol).Formula);

} // the using statement calls Dispose() which closes the package.

EDIT:

Il y a un autre projet, ExcelDataReader, qui semble avoir la capacité à gérer les deux formats. C'est aussi facile comme les autres que j'ai mentionnés.

Il y a aussi d'autres bibliothèques:

  • NPOI: Port de l'Apache POI bibliothèque .NET:

    Très puissant, gratuit et open source. Dans en plus D'Excel (97-2010), il prend également en charge les fichiers Word et PowerPoint.

  • ExcelLibrary:

    Il supporte seulement les fichiers Excel 97-2003 (xls).

  • EPPlus:

    Une extension à ExcelPackage. Plus facile à utiliser (je suppose).

53
répondu Mohammad Dehghan 2017-05-17 08:01:50

je déconseille fortement L'utilisation D'OleDB, surtout si elle doit être exécutée sur un serveur. Son susceptible de vous coûter plus à long terme-par exemple, nous avons eu un travail SSIS appelant une procédure stockée avec L'OleDB la lecture d'un fichier excel dans le sptroc et a continué à s'écraser la boîte SQL! J'ai sorti le truc de L'OleDB du sproc et il a arrêté de planter le serveur.

une meilleure méthode que j'ai trouvée est de le faire avec Office 2003 et les fichiers XML-en ce qui concerne . Remarque: Office 2003 est une exigence minimale pour ce à voler:

Ref pour la lecture à partir d'Excel: http://www.roelvanlisdonk.nl/?p=924 (merci de faire plus de recherches pour trouver d'autres exemples)

Ref pour la rédaction D'une feuille de calcul Excel: http://weblogs.asp.net/jgaylord/archive/2008/08/11/use-linq-to-xml-to-generate-excel-documents.aspx

public void ReadExcelCellTest()
        {
            XDocument document = XDocument.Load(@"C:\BDATA\Cars.xml");
            XNamespace workbookNameSpace = @"urn:schemas-microsoft-com:office:spreadsheet";

            // Get worksheet
            var query = from w in document.Elements(workbookNameSpace + "Workbook").Elements(workbookNameSpace + "Worksheet")
                        where w.Attribute(workbookNameSpace + "Name").Value.Equals("Settings")
                        select w;
            List<XElement> foundWoksheets = query.ToList<XElement>();
            if (foundWoksheets.Count() <= 0) { throw new ApplicationException("Worksheet Settings could not be found"); }
            XElement worksheet = query.ToList<XElement>()[0];

            // Get the row for "Seat"
            query = from d in worksheet.Elements(workbookNameSpace + "Table").Elements(workbookNameSpace + "Row").Elements(workbookNameSpace + "Cell").Elements(workbookNameSpace + "Data")
                    where d.Value.Equals("Seat")
                    select d;
            List<XElement> foundData = query.ToList<XElement>();
            if (foundData.Count() <= 0) { throw new ApplicationException("Row 'Seat' could not be found"); }
            XElement row = query.ToList<XElement>()[0].Parent.Parent;

            // Get value cell of Etl_SPIImportLocation_ImportPath setting
            XElement cell = row.Elements().ToList<XElement>()[1];

            // Get the value "Leon"
            string cellValue = cell.Elements(workbookNameSpace + "Data").ToList<XElement>()[0].Value;

            Console.WriteLine(cellValue);
        }
2
répondu Jeremy Thompson 2012-02-06 04:58:01

j'ai récemment trouvé cette bibliothèque qui convertit un classeur Excel en un DataSet:Excel Lecteur De Données

2
répondu Hand-E-Food 2012-02-06 05:01:09

Si vous avez besoin d'ouvrir les fichiers XLS plutôt que de fichiers XLSX, http://npoi.codeplex.com/ est un excellent choix. Nous l'avons utilisé à bon effet sur nos projets.

2
répondu Pete McKinney 2012-08-28 20:07:31

chercher GSpread.NET. Il S'agit également d'un projet OpenSource qui ne nécessite pas l'installation d'un bureau. Vous pouvez travailler avec Google Spreadsheets en utilisant L'API de Microsoft Excel. Si vous souhaitez réutiliser L'ancien code pour accéder aux tableurs Google, GSpread.NET c'est le meilleur moyen. Vous avez besoin d'ajouter un peu de ligne:

Set objExcel = CreateObject("GSpreadCOM.Application")
// Name             - User name, any you like
// ClientIdAndSecret - `client_id|client_secret` format
// ScriptId         - Google Apps script ID
app.MailLogon(Name, ClientIdAndSecret, ScriptId);

les autres codes restent inchangés.

http://scand.com/products/gspread/index.html

2
répondu miro 2016-05-27 14:14:46

Vous pouvez essayer OleDB pour lire les données du fichier excel. Veuillez essayer comme suit..

DataSet ds_Data = new DataSet();
OleDbConnection oleCon = new OleDbConnection();

string strExcelFile = @"C:\Test.xlsx";
oleCon.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strExcelFile + ";Extended Properties=\"Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text\"";;

 string SpreadSheetName = "";

OleDbDataAdapter Adapter = new OleDbDataAdapter();
OleDbConnection conn = new OleDbConnection(sConnectionString);

string strQuery;
conn.Open();

int workSheetNumber = 0;

DataTable ExcelSheets = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

SpreadSheetName = ExcelSheets.Rows[workSheetNumber]["TABLE_NAME"].ToString();

strQuery = "select * from [" + SpreadSheetName + "] ";
OleDbCommand cmd = new OleDbCommand(strQuery, conn);
Adapter.SelectCommand = cmd;
DataSet dsExcel = new DataSet();
Adapter.Fill(dsExcel);
conn.Close();
1
répondu Thit Lwin Oo 2012-02-06 04:50:16

j'ai utilisé Excel.dll bibliothèque qui est:

  • open source
  • léger
  • rapide
  • compatible avec xls et xlsx

La documentation disponible ici: https://exceldatareader.codeplex.com/

Fortement recommandable.

1
répondu Kunal Kakkad 2015-12-18 07:17:25
Tableetlight

ce qui semble très prometteur. Son open source et disponible sous forme de paquet nuget.

1
répondu Nick 2016-05-11 14:00:17

Si vous ne souhaitez pas utiliser interop, vous pourriez vouloir essayer OfficeWriter. Selon la quantité de traitement que vous avez vraiment besoin de faire sur le fichier, il pourrait être exagéré cependant. Vous pouvez demander un essai gratuit. Il y a une api entièrement documentée disponible sur le site site de documentation.

DISCLAIMER: je suis l'un des ingénieurs qui ont construit la dernière version.

0
répondu Nick Martin 2012-02-06 15:46:34

Vous pouvez aussi faire ce que je fais et par un contrôle commercial comme celui-ci: http://www.syncfusion.com/products/reporting-edition/xlsio

je me pavane depuis des années avant de finir avec une solution commerciale. J'ai d'abord essayé L'approche OLEDB qui est très facile à utiliser dans mon environnement de développement mais peut être un knightmare à déployer. Puis j'ai essayé les solutions open source mais la plupart d'entre eux sont dépassés et ont un mauvais soutien.

les commandes xlsio de syncfusion sont juste ceux que j'utilise et sont heureux avec, mais d'autres existent. Si vous pouvez affort, n'hésitez pas, c'est la meilleure solution. Pourquoi? Parce qu'il n'a pas de dépendances avec le système et prend en charge toutes les versions d'office. Parmi les autres avantages, il est vraiment rapide.

Et non, je ne travaille pas pour synfusion ;)

0
répondu Jonx 2012-08-28 20:00:21