Чтение файлов Excel с C#

Есть ли бесплатная или открытая библиотека для чтения файлов Excel (.xls) непосредственно из программы на C#?

Необязательно быть слишком навороченным, просто выберите рабочий лист и считайте данные в виде строк. До сих пор я использовал функцию экспорта в текст Unicode Excel и анализировал полученный файл (с разделителями табуляции), но я бы хотел исключить ручной шаг.

Ответов (25)

Решение
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"),
                    });

Простите меня, если я здесь за пределами базы, но разве не для этого нужны Office PIA?

Если в файле Excel содержатся простые данные, их можно прочитать через ADO.NET. См. Строки подключения, перечисленные здесь:

http://www.connectionstrings.com/?carrier=excel2007 или http://www.connectionstrings.com/?carrier=excel

-Райан

Обновление: тогда вы можете просто прочитать рабочий лист через что-то вроде select * from [Sheet1$]

SpreadsheetGear потрясающий. Да, это дорого, но по сравнению с другими решениями оно того стоит. Это быстро, надежно, очень комплексно, и я должен сказать, что после того, как я использовал этот продукт в моей постоянной работе по разработке программного обеспечения более полутора лет, их поддержка клиентов просто фантастическая!

Как насчет Excel Data Reader?

http://exceldatareader.codeplex.com/

Я использовал его в производственной среде, чтобы вытащить большие объемы данных из различных файлов Excel в SQL Server Compact. Он работает очень хорошо и довольно надежен.

Компонент .NET Excel Reader .NET может удовлетворить ваши требования. Этого достаточно для чтения файлов XLSX и XLS. Так что попробуйте это:

http://www.devtriogroup.com/ExcelReader

Я хочу показать простой способ чтения файла xls / xlsx с помощью .NET. Я надеюсь, что следующая информация будет для вас полезной.

 private DataTable ReadExcelToTable (строковый путь)    
 {

     // Строка подключения

     string connstring = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source =" + path + "; Extended Properties = 'Excel 8.0; HDR = NO; IMEX = 1';";  
     // то же имя 
     // строка connstring = Provider = Microsoft.JET.OLEDB.4.0; Data Source = "+ path + //"; Extended Properties = 'Excel 8.0; HDR = NO; IMEX = 1'; "; 

     используя (OleDbConnection conn = new OleDbConnection (connstring))
     {
        conn.Open ();
        // Получить имя всех листов
        DataTable sheetName = conn.GetOleDbSchemaTable (OleDbSchemaGuid.Tables, новый объект [] {null, null, null, «Таблица»});  

        // Получаем имя первого листа
        строка firstSheetName = sheetName.Rows [0] [2] .ToString (); 

        //Строка запроса 
        строка sql = string.Format ("ВЫБРАТЬ * ИЗ [{0}]", firstSheetName); 
        OleDbDataAdapter ada = новый OleDbDataAdapter (sql, connstring);
        DataSet set = новый DataSet ();
        ada.Fill (установить);
        return set.Tables [0];   
   }
 }

Код взят из статьи: http://www.c-sharpcorner.com/uploadfile/d2dcfc/read-excel-file-with-net/ . Вы можете получить более подробную информацию оттуда.

Поздно на вечеринку, но я фанат LinqToExcel

Вот код, который я написал на 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;
        }
    }
}

Не бесплатно, но в последней версии Office есть очень хороший API для автоматизации .Net. (API существует уже давно, но был неприятным COM). Вы можете делать все, что хотите / нуждаетесь в коде, в то время как приложение Office остается скрытым фоновым процессом.

Некоторое время назад я много читал из файлов Excel на C#, и мы использовали два подхода:

  • COM API, с помощью которого вы напрямую получаете доступ к объектам Excel и управляете ими с помощью методов и свойств.
  • Драйвер ODBC, позволяющий использовать Excel как базу данных.

Последний подход был намного быстрее: чтение большой таблицы с 20 столбцами и 200 строками занимало 30 секунд через COM и полсекунды через ODBC. Поэтому я бы рекомендовал подход к базе данных, если все, что вам нужно, это данные.

Ваше здоровье,

Карл

Подход ADO.NET быстр и прост, но у него есть несколько причуд, о которых вам следует знать, особенно в отношении того, как обрабатываются типы данных.

Эта отличная статья поможет вам избежать некоторых распространенных ошибок: http://blog.lab49.com/archives/196

Хотя вы специально просили .xls, подразумевая старые форматы файлов, для форматов OpenXML (например, xlsx) я настоятельно рекомендую OpenXML SDK ( http://msdn.microsoft.com/en-us/library/bb448854.aspx )

В последнее время, отчасти для того, чтобы стать лучше в LINQ ... Я использовал API автоматизации Excel, чтобы сохранить файл как электронную таблицу XML, а затем обработать этот файл с помощью LINQ to XML.

Вот что я использовал для 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);
    }
}

Koogra - это компонент с открытым исходным кодом, написанный на C#, который читает и записывает файлы Excel.

SpreadsheetGear для .NET - это совместимый с Excel компонент электронных таблиц для .NET. Вы можете увидеть, что наши клиенты говорят о производительности, в правой части страницы нашего продукта . Вы можете попробовать это сами, воспользовавшись бесплатной полнофункциональной оценкой .

ExcelMapper - это инструмент с открытым исходным кодом ( http://code.google.com/p/excelmapper/ ), который можно использовать для чтения листов Excel как строго типизированных объектов. Он поддерживает форматы xls и xlsx.

Я просто использовал ExcelLibrary для загрузки электронной таблицы .xls в DataSet. У меня отлично сработало.

SmartXLS - еще один компонент электронных таблиц Excel, который поддерживает большинство функций диаграмм Excel, механизмов формул и может читать / писать в формате openxml excel2007.

Вы можете попробовать использовать это решение с открытым исходным кодом, которое значительно упрощает работу с Excel.

http://excelwrapperdotnet.codeplex.com/

Excel Data Reader - это то, что вам нужно!

Это открытый исходный код по адресу http://exceldatareader.codeplex.com/, который активно развивается.

Мы использовали его для чтения табличных (а иногда и не очень табличных) рабочих листов уже пару лет (в финансовом приложении).

Работает как шарм для чтения данных модульного теста с удобочитаемых листов.

Просто избегайте возможности возвращать DateTime, поскольку для Excel DateTime - это просто двойные числа.

Решение, которое мы использовали, необходимо для:

  • Разрешить чтение / запись файлов, созданных в Excel
  • Быть быстрым в производительности (не как при использовании COM)
  • Быть независимым от MS Office (необходимо, чтобы его можно было использовать без клиентов с установленным MS Office)
  • Быть свободным или открытым исходным кодом (но активно разработанным)

Есть несколько вариантов, но мы обнаружили, что NPoi (порт .NET для давно существующего проекта с открытым исходным кодом Java Poi ) является лучшим: http://npoi.codeplex.com/

Также позволяет работать с форматами файлов .doc и .ppt.

Если у вас есть несколько таблиц на одном листе, вы можете дать каждой таблице имя объекта и прочитать таблицу с помощью метода OleDb, как показано здесь: http://vbktech.wordpress.com/2011/05/10/c-net-reading -и-запись-в-несколько-таблиц-на-том-же-листе-Microsoft-Excel /

Если это просто табличные данные. Я бы порекомендовал помощников по файловым данным от Marcos Melli, которые можно скачать здесь .