Чтение файлов Excel из C#
есть ли бесплатная или открытая библиотека для чтения файлов Excel (.xls) непосредственно из программы на C#?
Он не должен быть слишком причудливым, просто чтобы выбрать рабочий лист и прочитать данные в виде строк. До сих пор я использовал функцию Export to Unicode text в Excel и анализировал полученный (разделенный табуляцией) файл, но я хотел бы исключить ручной шаг.
30 ответов:
var fileName = string.Format("{0}\fileNameHere", Directory.GetCurrentDirectory()); 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, "anyNameHere"); DataTable data = ds.Tables["anyNameHere"];
Это то, что я обычно использую. Это немного отличается, потому что я обычно придерживаюсь AsEnumerable() при редактировании таблиц:
var data = ds.Tables["anyNameHere"].AsEnumerable();
поскольку это позволяет мне использовать LINQ для поиска и построения структур из полей.
var query = data.Where(x => x.Field<string>("phoneNumber") != string.Empty).Select(x => new MyContact { firstName= x.Field<string>("First Name"), lastName = x.Field<string>("Last Name"), phoneNumber =x.Field<string>("Phone Number"), });
Если это просто простые данные, содержащиеся в файле Excel, вы можете прочитать данные с помощью ADO.NET см. строки подключения, перечисленные здесь:
http://www.connectionstrings.com/?carrier=excel2007 или http://www.connectionstrings.com/?carrier=excel
-Райан
обновление: тогда вы можете просто прочитать рабочий лист через что-то вроде
select * from [Sheet1$]
ADO.NET подход является быстрым и легким, но у него есть несколько причуд, о которых вы должны знать, особенно в отношении того, как обрабатываются типы данных.
эта превосходная статья поможет вам избежать некоторых распространенных ошибок: http://blog.lab49.com/archives/196
Это то, что я использовал для Excel 2003:
Dictionary<string, string> props = new Dictionary<string, string>(); props["Provider"] = "Microsoft.Jet.OLEDB.4.0"; props["Data Source"] = repFile; props["Extended Properties"] = "Excel 8.0"; StringBuilder sb = new StringBuilder(); foreach (KeyValuePair<string, string> prop in props) { sb.Append(prop.Key); sb.Append('='); sb.Append(prop.Value); sb.Append(';'); } string properties = sb.ToString(); using (OleDbConnection conn = new OleDbConnection(properties)) { conn.Open(); DataSet ds = new DataSet(); string columns = String.Join(",", columnNames.ToArray()); using (OleDbDataAdapter da = new OleDbDataAdapter( "SELECT " + columns + " FROM [" + worksheet + "$]", conn)) { DataTable dt = new DataTable(tableName); da.Fill(dt); ds.Tables.Add(dt); } }
Как насчет Excel Data Reader?
http://exceldatareader.codeplex.com/
Я использовал в нем гнев, в производственной среде, чтобы вытащить большие объемы данных из различных файлов Excel в SQL Server Compact. Он работает очень хорошо, и это довольно прочный.
вот код, который я написал в C# с помощью .NET 1.1 несколько лет назад. Не уверен, что это будет именно то, что вам нужно (и не может быть мой лучший код :)).
using System; using System.Data; using System.Data.OleDb; namespace ExportExcelToAccess { /// <summary> /// Summary description for ExcelHelper. /// </summary> public sealed class ExcelHelper { private const string CONNECTION_STRING = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=<FILENAME>;Extended Properties=\"Excel 8.0;HDR=Yes;\";"; public static DataTable GetDataTableFromExcelFile(string fullFileName, ref string sheetName) { OleDbConnection objConnection = new OleDbConnection(); objConnection = new OleDbConnection(CONNECTION_STRING.Replace("<FILENAME>", fullFileName)); DataSet dsImport = new DataSet(); try { objConnection.Open(); DataTable dtSchema = objConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); if( (null == dtSchema) || ( dtSchema.Rows.Count <= 0 ) ) { //raise exception if needed } if( (null != sheetName) && (0 != sheetName.Length)) { if( !CheckIfSheetNameExists(sheetName, dtSchema) ) { //raise exception if needed } } else { //Reading the first sheet name from the Excel file. sheetName = dtSchema.Rows[0]["TABLE_NAME"].ToString(); } new OleDbDataAdapter("SELECT * FROM [" + sheetName + "]", objConnection ).Fill(dsImport); } catch (Exception) { //raise exception if needed } finally { // Clean up. if(objConnection != null) { objConnection.Close(); objConnection.Dispose(); } } return dsImport.Tables[0]; #region Commented code for importing data from CSV file. // string strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source=" + System.IO.Path.GetDirectoryName(fullFileName) +";" +"Extended Properties=\"Text;HDR=YES;FMT=Delimited\""; // // System.Data.OleDb.OleDbConnection conText = new System.Data.OleDb.OleDbConnection(strConnectionString); // new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM " + System.IO.Path.GetFileName(fullFileName).Replace(".", "#"), conText).Fill(dsImport); // return dsImport.Tables[0]; #endregion } /// <summary> /// This method checks if the user entered sheetName exists in the Schema Table /// </summary> /// <param name="sheetName">Sheet name to be verified</param> /// <param name="dtSchema">schema table </param> private static bool CheckIfSheetNameExists(string sheetName, DataTable dtSchema) { foreach(DataRow dataRow in dtSchema.Rows) { if( sheetName == dataRow["TABLE_NAME"].ToString() ) { return true; } } return false; } } }
Koogra-это компонент с открытым исходным кодом, написанный на C#, который читает и пишет файлы Excel.
в то время как вы специально просили .xls, подразумевая более старые форматы файлов, для форматов OpenXML (например, xlsx) я настоятельно рекомендую OpenXML SDK (http://msdn.microsoft.com/en-us/library/bb448854.aspx)
Я сделал Большое чтение из файлов Excel в C# некоторое время назад, и мы использовали два подхода:
- COM API, где вы получаете доступ к объектам Excel напрямую и манипулировать ими с помощью методов и свойств
- драйвер ODBC, который позволяет использовать Excel как базу данных.
последний подход был много быстрее: чтение большой таблицы с 20 столбцами и 200 строками займет 30 секунд через COM и полсекунды через ODBC. Так Что Я рекомендовал бы подход к базе данных, если все, что вам нужно, это данные.
спасибо,
Карл
ExcelMapper-это инструмент с открытым исходным кодом (http://code.google.com/p/excelmapper/), который можно использовать для чтения листов Excel Как строго типизированных объектов. Он поддерживает форматы XLS и XLSX.
Я хочу показать простой метод для чтения XLS / xlsx файл с. NET. я надеюсь, что следующее будет полезно для вас.
private DataTable ReadExcelToTable(string path) { //Connection String string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"; //the same name //string connstring = Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + path + //";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"; using(OleDbConnection conn = new OleDbConnection(connstring)) { conn.Open(); //Get All Sheets Name DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[]{null,null,null,"Table"}); //Get the First Sheet Name string firstSheetName = sheetsName.Rows[0][2].ToString(); //Query String string sql = string.Format("SELECT * FROM [{0}]",firstSheetName); OleDbDataAdapter ada =new OleDbDataAdapter(sql,connstring); DataSet set = new DataSet(); ada.Fill(set); return set.Tables[0]; } }код из статьи: http://www.c-sharpcorner.com/uploadfile/d2dcfc/read-excel-file-with-net/. Вы можете получить более подробную информацию от него.
не бесплатно, но с последним офисом есть очень хорошая автоматизация .Чистый API-интерфейс. (там был API в течение длительного времени, но был противный COM) вы можете делать все, что вы хотите / нужно в коде все в то время как приложение Office остается скрытым фоновым процессом.
Простите меня, если я здесь вне базы, но разве это не то, что офис Пиа для?
в последнее время, частично, чтобы стать лучше в LINQ.... Я использую API автоматизации Excel для сохранения файла в виде электронной таблицы XML, а затем обрабатываю этот файл с помощью LINQ to XML.
SpreadsheetGear для .NET - это совместимый с Excel компонент электронных таблиц для. NET. вы можете увидеть, что наши клиенты говорят о производительности в правой части нашего страница продукта. Вы можете попробовать себя бесплатную полнофункциональную оценка.
SmartXLS является еще одним компонентом электронной таблицы excel, который поддерживает большинство функций диаграмм excel, движков формул и может читать/записывать формат excel2007 openxml.
.NET компонент Excel Reader .NET может удовлетворить ваши требования. Это достаточно хорошо для чтения XLSX и XLS файлов. Так что попробуйте его с:
Я рекомендую библиотеку FileHelpers, которая является бесплатной и простой в использовании библиотекой .NET для импорта / экспорта данных из EXCEL, фиксированной длины или разделенных записей в файлах, строках или потоках + больше.
Раздел Документации Excel Data Link http://filehelpers.sourceforge.net/example_exceldatalink.html
вы можете попробовать использовать это решение с открытым исходным кодом, что делает работу с Excel намного чище.
SpreadsheetGear является удивительным. Да, это расходы, но по сравнению с этими другими решениями, это стоит того. Это быстро, надежно, очень всесторонне, и я должен сказать, что после использования этого продукта в моей полной программной работе более полутора лет, их поддержка клиентов фантастическая!
решение, которое мы использовали, необходимо, чтобы:
- разрешить Читать/Писать из Excel производимых файлов
- быть быстро в производительности (не как с помощью COMs)
- быть MS Office независимая (необходимо использовать без клиентов, имеющих MS Office установлен)
- быть свободный или Open Source (но активно развивается)
есть несколько вариантов, но мы нашли NPoi (.NET порт Java давно существует Poi проект с открытым исходным кодом), чтобы быть лучшим: http://npoi.codeplex.com/
Он также позволяет работать .док и. ppt-формат файла
Если это просто табличные данные. Я бы порекомендовал помощники файла данных Маркос Мелли, который может быть загружен здесь.
опоздал на вечеринку, но я фанат LinqToExcel
вы можете написать электронную таблицу excel, которая загружает данную электронную таблицу excel и сохраняет ее как csv (а не делает это вручную).
тогда вы можете автоматизировать это из c#.
и как только его в csv, программа c# может Грок, что.
(кроме того, если кто-то просит вас программировать в excel, лучше притвориться, что вы не знаете, как)
(edit: Ах да, Роб и Райан оба правы)
Я знаю, что люди делают Excel "расширение" для этой цели.
Вы более или менее сделать кнопку в Excel, который говорит "экспорт в программу X", а затем экспортировать и отправить данные в формате программа может читать.http://msdn.microsoft.com/en-us/library/ms186213.aspx должно быть хорошим местом для начала.
удачи
просто сделал быстрый демо-проект, который требовал управления некоторыми файлами excel. Интернет .Net компонент из программного обеспечения GemBox, было достаточно для моих потребностей. Он имеет бесплатную версию с некоторыми ограничениями.
Пакет Excel является компонентом с открытым исходным кодом (GPL) для чтения/записи файлов Excel 2007. Я использовал его в небольшом проекте,и API прост. Работает только с XLSX (Excel 200&), а не с XLS.
исходный код также кажется хорошо организованным и легко обойти (если вам нужно расширить функциональность или исправить незначительные проблемы, как я сделал).
сначала я попробовал ADO.Net (строка подключения Excel) подход, но это было чревато неприятными хаки -- для например, если второй строка содержит число, оно будет возвращать ints для всех полей в столбце ниже и тихо отбрасывать любые данные, которые не подходят.
мы используем:ClosedXML в довольно больших системах.
- свободный
- простота установки
- прямое кодирование
- очень отзывчивая поддержка
- команда разработчиков составляет очень открыты для новых предложений. Часто новые функции и исправления ошибок, реализованные в течение одной недели
Take.io
электронная таблица сделает эту работу за вас, и бесплатно. Просто взгляните на этой.
Я просто использовать ExcelLibrary загрузить .электронная таблица xls в набор данных. Отлично сработало для меня.