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

c# .net excel ms-office

449728 просмотра

30 ответа

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

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

Автор: dbkk Источник Размещён: 26.07.2019 04:30

Ответы (30)


153 плюса

Решение
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"),
                    });
Автор: Robin Robinson Размещён: 19.08.2008 12:18

83 плюса

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

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

-Ryan

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

Автор: Ryan Farley Размещён: 19.08.2008 07:28

27 плюса

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

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

Автор: Ian Nelson Размещён: 20.08.2008 01:19

22 плюса

Вот что я использовал для 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);
    }
}
Автор: Dmitry Shechtman Размещён: 04.09.2008 11:39

21 плюса

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

http://exceldatareader.codeplex.com/

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

Автор: Michał Pawłowski Размещён: 08.09.2010 08:45

16 плюса

Вот код, который я написал на 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;
        }
    }
}
Автор: hitec Размещён: 19.08.2008 10:50

15 плюса

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

Автор: Rune Grimstad Размещён: 04.11.2008 11:22

12 плюса

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

Автор: Hafthor Размещён: 04.09.2008 06:00

8 плюса

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

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

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

Ура,

деревенщина

Автор: Carl Seleborg Размещён: 20.08.2008 01:24

6 плюса

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

Автор: anonymous Размещён: 11.05.2009 03:26

6 плюса

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

 private DataTable ReadExcelToTable (путь строки)    
 {

     // Строка соединения

     string connstring = "Provider = Microsoft.ACE.OLEDB.12.0; Источник данных =" + путь + "; Расширенные свойства = 'Excel 8.0; HDR = NO; IMEX = 1';";  
     // то же имя 
     // string connstring = Provider = Microsoft.JET.OLEDB.4.0; Источник данных = "+ путь + //"; Расширенные свойства = 'Excel 8.0; HDR = NO; IMEX = 1'; "; 

     использование (OleDbConnection conn = new OleDbConnection (connstring))
     {
        conn.Open ();
        // Получить имя всех листов
        DataTable sheetName = conn.GetOleDbSchemaTable (OleDbSchemaGuid.Tables, new object [] {null, null, null, "Table"});  

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

        //Строка запроса 
        строка sql = string.Format ("SELECT * FROM [{0}]", firstSheetName); 
        OleDbDataAdapter ada = новый OleDbDataAdapter (sql, connstring);
        DataSet set = new DataSet ();
        ada.Fill (комплект);
        вернуть set.Tables [0];   
   }
 }

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

Автор: Lizzy Размещён: 06.03.2012 08:49

4 плюса

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

Автор: xanadont Размещён: 19.08.2008 07:31

3 плюса

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

Автор: Rob Cooper Размещён: 19.08.2008 07:28

3 плюса

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

Автор: kenny Размещён: 04.09.2008 11:10

3 плюса

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

Автор: Joe Erickson Размещён: 19.01.2009 03:49

3 плюса

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

Автор: liya Размещён: 30.09.2009 03:18

3 плюса

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

http://www.devtriogroup.com/ExcelReader

Автор: Bonnie Cornell Размещён: 12.04.2011 07:30

2 плюса

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

Раздел документации ссылок на данные Excel http://filehelpers.sourceforge.net/example_exceldatalink.html

Автор: Jason Von Ruden Размещён: 04.09.2008 10:24

2 плюса

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

http://excelwrapperdotnet.codeplex.com/

Автор: user289261 Размещён: 09.03.2010 12:16

2 плюса

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

Автор: John R Размещён: 26.08.2010 06:01

2 плюса

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

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

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

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

Автор: Thetam Размещён: 21.04.2011 10:07

2 плюса

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

Автор: cless Размещён: 13.09.2011 04:47

2 плюса

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

Автор: DeeDee Размещён: 26.10.2012 03:09

1 плюс

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

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

и как только он в csv, программа c # может это сделать.

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

(редактировать: ах да, Роб и Райан оба правы)

Автор: Leon Bambrick Размещён: 19.08.2008 07:26

1 плюс

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

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

Удачи

Автор: Lars Mæhlum Размещён: 19.08.2008 07:26

1 плюс

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

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

Автор: Christian Hagelid Размещён: 19.08.2008 07:48

1 плюс

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

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

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

Автор: dbkk Размещён: 01.10.2009 03:44

1 плюс

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

  • Свободно
  • Прост в установке
  • Прямое кодирование
  • Очень отзывчивая поддержка
  • Команда разработчиков чрезвычайно открыта для новых предложений. Часто новые функции и исправления ошибок реализуются в течение одной недели
Автор: Doctor Rudolf Размещён: 17.08.2012 08:34

1 плюс

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

Автор: Balena Размещён: 15.09.2011 03:33

0 плюса

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

Автор: Hafthor Размещён: 24.08.2009 06:21
Вопросы из категории :
32x32