Чтение файлов Excel из С#

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

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

Ответ 1

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"),
                    });

Ответ 2

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

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

-Ryan

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

http://exceldatareader.codeplex.com/

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

Ответ 6

Вот некоторый код, который я написал в С#, используя .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;
        }
    }
}

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

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

Приветствия,

Карл

Ответ 10

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

Ответ 11

Я хочу показать простой метод для чтения файла 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/. Вы можете получить более подробную информацию.

Ответ 12

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

Ответ 13

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

Ответ 14

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

Ответ 15

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

Ответ 16

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

Ответ 17

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

http://www.devtriogroup.com/ExcelReader

Ответ 18

Я рекомендую библиотеку FileHelpers, которая является бесплатной и простой в использовании библиотекой .NET для импорта/экспорта данных из EXCEL, фиксированной длины или разделительных записей в файлах, строках или потоках + больше.

Раздел документации по Data Data Link http://filehelpers.sourceforge.net/example_exceldatalink.html

Ответ 19

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

http://excelwrapperdotnet.codeplex.com/

Ответ 20

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

Ответ 21

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

  • Разрешить Чтение/Запись файлов, созданных Excel
  • Быть Быстро в производительности (не как использование COM)
  • Будь MS Office Независимый (необходимо использовать без клиентов, имеющих MS Office)
  • Быть Свободно или Open Source (но активно развивается)

Существует несколько вариантов, но мы нашли NPoi (.NET-порт Java long существующий Poi проект с открытым исходным кодом): http://npoi.codeplex.com/

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

Ответ 22

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

Ответ 23

Поздно к вечеринке, но я поклонник LinqToExcel

Ответ 24

вы можете написать таблицу Excel, которая загружает заданную таблицу Excel и сохраняет ее как csv (вместо того, чтобы делать это вручную).

тогда вы можете автоматизировать это из С#.

и после его в csv, программа С# может заглянуть в это.

(также, если кто-то просит вас программировать в excel, лучше притвориться, что вы не знаете, как)

(edit: ah yes, rob и ryan оба справа)

Ответ 25

Я знаю, что люди делали расширение Excel для этой цели.
Вы более или менее создаете кнопку в Excel, которая говорит "Экспорт в программу X", а затем экспортируйте и отправьте данные в формате, который программа может прочитать.

http://msdn.microsoft.com/en-us/library/ms186213.aspx должно быть хорошим местом для начала.

Удачи.

Ответ 26

Просто сделал быстрый демонстрационный проект, требующий управления некоторыми файлами excel. Компонент .NET из программного обеспечения GemBox был адекватен моим потребностям. Он имеет бесплатную версию с несколькими ограничениями.

http://www.gemboxsoftware.com/GBSpreadsheet.htm

Ответ 27

Пакет Excel - это компонент с открытым исходным кодом (GPL) для чтения/записи файлов Excel 2007. Я использовал его в небольшом проекте, и API прост. Работает только с XLSX (Excel 200 &), а не с XLS.

Исходный код также кажется хорошо организованным и легко обойти (если вам нужно расширить функциональность или исправить незначительные проблемы, как и я).

Сначала я попробовал подход ADO.Net(строка подключения к Excel), но он был чреват неприятными хаками - например, если вторая строка содержит число, она вернет ints для всех полей в столбце ниже и тихо отбросить любые данные, которые не подходят.

Ответ 28

Take.io Электронная таблица сделает эту работу за вас и бесплатно. Просто взгляните на this.

Ответ 29

Мы используем ClosedXML в довольно больших системах.

  • Free
  • Простота установки
  • Прямое кодирование
  • Очень отзывчивая поддержка
  • Команда разработчиков экстремально открыта для новых предложений. Часто новые функции и исправления ошибок реализованы в течение одной недели.

Ответ 30

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