web-dev-qa-db-fra.com

Comment lire un fichier Excel en C # sans utiliser les bibliothèques Microsoft.Office.Interop.Excel

J'ai une application .Net-Windows en C #. Je dois ouvrir un fichier Excel et le traiter. Comment puis-je faire cela sans utiliser les bibliothèques Microsoft.Office.Interop.Excel?

42
ASD
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);
    }
}
40
Aleksandar Vucetic

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

Ils fonctionnent tous les deux parfaitement. Ils ne dépendent absolument de rien.

Échantillon 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 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.

[~ # ~] éditer [~ # ~] :

Il existe un autre projet, ExcelDataReader , qui semble avoir la capacité de gérer les deux formats. C'est aussi facile que les autres que j'ai mentionnées.

Il y a aussi d'autres bibliothèques:

56
Mohammad Dehghan

Recherchez GSpread.NET. C'est aussi un projet OpenSource qui ne nécessite pas l'installation d'Office. Vous pouvez utiliser Google Spreadsheets à l'aide de l'API de Microsoft Excel. Si vous souhaitez réutiliser l'ancien code pour accéder à Google Spreadsheets, GSpread.NET est le meilleur moyen. Vous devez ajouter quelques lignes:

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

Le code suivant reste inchangé.

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

2
miro

Si vous devez ouvrir des fichiers XLS plutôt que des fichiers XLSX, http://npoi.codeplex.com/ est un excellent choix. Nous l'avons utilisé à bon escient sur nos projets.

2
Pete McKinney

Je vous déconseille d'utiliser OleDB, en particulier s'il doit être exécuté sur un serveur. Cela risque de vous coûter plus cher à long terme - par exemple, nous avions un travail SSIS appelant une procédure stockée avec l'OleDB lisant un fichier Excel dans le sptroc et continuant à planter la boîte SQL! J'ai sorti le contenu d'OleDB du sproc et il a cessé de planter le serveur.

Une meilleure méthode que j'ai trouvée consiste à le faire avec Office 2003 et les fichiers XML - en ce qui concerne considérations relatives à l'automatisation côté serveur d'Office . Remarque: Office 2003 est une condition minimale requise pour ce vol:

Réf pour lire Excel: http://www.roelvanlisdonk.nl/?p=924 (veuillez faire plus de recherches. pour trouver d'autres exemples)

Ref pour l'écriture 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
Jeremy Thompson

J'ai récemment trouvé cette bibliothèque qui convertit un fichier de classeur Excel en un fichier DataSet : Excel Data Reader

2
Hand-E-Food

Vous pouvez essayer OleDB pour lire les données d'un fichier Excel. S'il vous plaît essayez 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
Thit Lwin Oo

Je viens de chercher une solution et de trouver Spreadsheetlight

ce qui semble très prometteur. Son source ouverte et disponible sous forme de paquet de pépites.

1
Nick

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

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

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

Fortement recommandé.

1
Kunal Kakkad

Si vous ne souhaitez pas utiliser interop, vous pouvez essayer OfficeWriter . En fonction de la quantité de traitement que vous devez réellement effectuer sur le fichier, il peut être excessif. Vous pouvez demander un essai gratuit. Une API entièrement documentée est disponible sur le site de documentation .

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

0
Nick Martin

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

Je me suis battu pendant 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 chevalier à déployer. Ensuite, j'ai essayé les solutions open source, mais la plupart d'entre elles sont obsolètes et ont un mauvais support.

Les contrôles xlsio de syncfusion ne sont que ceux que j’utilise et qui me satisfont, mais d’autres existent. Si vous pouvez l'avouer, n'hésitez pas, c'est la meilleure solution. Pourquoi? Parce qu'il n'a pas de dépendances avec le système et supporte immédiatement toutes les versions de office. Entre autres avantages, c'est très rapide.

Et non, je ne travaille pas pour synfusion;)

0
Jonx