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?
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);
}
}
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).
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);
}
j'ai récemment trouvé cette bibliothèque qui convertit un classeur Excel en un DataSet:Excel Lecteur De Données
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.
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.
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();
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.
ce qui semble très prometteur. Son open source et disponible sous forme de paquet nuget.
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.
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 ;)