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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
232
0
488 460
32
Перейти к ответу Данный вопрос помечен как решенный

Ответы 32

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

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

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

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

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

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

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

Удачи

Простите меня, если я здесь за пределами базы, но разве не для этого предназначены Офис PIA's?

Да, но это потребует создания экземпляра Excel.Application, загрузки файла xls и т. д. Если требуется просто прочитать некоторые данные из файла, то гораздо проще и легче использовать один из описанных методов ADO.NET. в других ответах.

Adam Ralph 20.01.2009 01:28

Слишком медленно, используя Office PIA в качестве базовой линии, все остальное работает быстрее - даже с использованием массива Object, переданного из свойства .Value2. Которая до сих пор использует PIA.

Anonymous Type 20.12.2010 01:11

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

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

-Райан

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

Это самый быстрый способ.

StingyJack 19.01.2009 17:06

Конечно, это неправда, Стинг. Вы должны просеять все данные и написать дрянной код БД (вручную создавать модели, сопоставлять столбцы со свойствами, yadda yadda). Самый быстрый способ - разрешить какой-нибудь другой бедный сукин сын сделает это за вас. Вот почему люди используют фреймворки вместо того, чтобы писать все снизу вверх.

user1228 27.11.2009 21:27

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

cyberzed 11.02.2010 16:26

Бесполезный метод! При чтении усекает текстовые столбцы до 255 символов. Остерегаться! Смотрите: двигатель stackoverflow.com/questions/1519288/… ACE делает то же самое!

Triynko 13.05.2010 22:29

Трийнко, прошло очень много времени с тех пор, как я использовал этот метод, но IIRC вы можете обойти ограничение в 255 символов, определив ODBC DSN для электронной таблицы, а затем определив столбцы как более длинные по длине, а затем использовать DSN для подключения к электронную таблицу. Это больно, но я считаю, что это можно обойти.

Ryan Farley 14.05.2010 02:24

Имейте в виду, что использование ADO.NET для чтения данных из Excel требует установки Microsoft Access или Microsoft Access Database Engine Redistributable.

zihotki 05.01.2011 19:43

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

Brian Low 13.04.2011 22:50

Это также не будет работать ВСЕГО, если вы работаете в 64-битном процессе. форумы.asp.net/p/1128266/1781961.aspx

aquinas 24.09.2011 01:19

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

@ Anonymous-type Я прочитал вопрос и предлагал полезную альтернативу желаемой реализации OSS ... потому что, ну, я был почти уверен, что ничего доступного не было. И, судя по принятому ответу, требование наличия установленного Office не является проблемой.

xanadont 20.12.2010 23:25

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

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

К вашему сведению: я пробовал это, и это не соответствовало моей потребности в возможности читать зашифрованный файл.

Chad 10.10.2012 20:56

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

Не могу больше согласиться, Чериан. Этому коду много лет ... еще до того, как я овладел Resharper :)

hitec 13.07.2009 21:48

Код уродливый, но он показывает, как получить имена листов, отлично!

Sam 23.07.2010 13:16
Ответ принят как подходящий

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

Если кажется, что Select в этом подходе пытается угадать тип данных столбца и принудительно использовать этот предполагаемый тип данных. Например, если у вас есть столбец с в основном двойными значениями, вам не понравится передача x.Field, но ожидает x.Field. Это правда?

Kevin Le - Khnle 03.06.2010 18:47

Просто посмотрел на MSDN. Похоже на просто используется для попытки привести содержимое столбца к типу. В этом примере и просто приведение данных в столбцах к строкам. Если вам нужен дубль, вам нужно будет вызвать double.Parse (x.Field(«Стоимость») или что-то в этом роде. Поле - это метод расширения для DataRow, и похоже, что нет неуниверсальных версий.

Robin Robinson 03.06.2010 22:20

Сильно ли замедляет его добавление double.Parse в запрос Linq?

Anonymous Type 20.12.2010 01:06

Не то чтобы я заметил. Я не делал никаких реальных выступлений по этому поводу. Для наших целей это делается нечасто.

Robin Robinson 21.12.2010 20:07

Обратите внимание: если вы читаете xlsx, вам нужно вместо этого использовать эту строку подключения: string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source = {0}; Extended Properties=Excel 12.0;", fileName)

Andreas Grech 10.03.2012 22:50

К сожалению, драйвер Jet.OLEDB несовместим с 64-разрядной версией; вам нужно будет переключиться на целевой x86, а не на любой процессор (если вы все еще хотите использовать этот метод). В качестве альтернативы установите 64-битный драйвер ACE и измените строку подключения, чтобы использовать этот драйвер (как указано Андреасом) - microsoft.com/en-us/download/…

Duncan 06.06.2012 20:04

Невозможно установить 64-разрядный драйвер ACE, если на целевой машине установлена ​​32-разрядная версия Office.

Neal 29.10.2012 05:18

Если это кому-то поможет, драйвер Jet отлично работает в Win7 64bit ... до тех пор, пока у меня действительно открыт документ в Excel.

CodeRedick 14.01.2013 12:00

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

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

Вы ответили на мой вопрос (в форме комментария выше).

Kevin Le - Khnle 03.06.2010 19:07

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

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

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

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

Карл

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

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

Раздел документации по каналам передачи данных Excelhttp://filehelpers.sourceforge.net/example_exceldatalink.html

Я не буду вас опускать, но я недавно начал использовать FileHelpers и был шокирован тем, насколько ... хреново это. Например, единственный способ сопоставить столбцы в csv свойствам ... извините, FIELDS модели - это для создания полей в порядке столбцов. Не знаю, как вы, но я бы не стал полагаться на причуду компилятора в одном из важнейших соображений дизайна моего фреймворка f8king.

user1228 27.11.2009 21:31

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

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

kenny 26.05.2010 13:05

@gsvirdi, задайте отдельный вопрос по безопасности файлов Excel, это вопрос по производительности.

Anonymous Type 20.12.2010 01:12

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

рабочий лист не определен ... мне кажется немного странным после четкого определения всего остального.

Jeremy Holovacs 19.07.2011 19:02

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

Больше не выглядит особенно активным, по сравнению, скажем, с НКОИ.

David Burton 15.08.2012 15:13

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

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

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

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

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

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

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

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

http://excelwrapperdotnet.codeplex.com/

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

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

Anonymous Type 20.12.2010 01:11

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

http://exceldatareader.codeplex.com/

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

Я второй Читатель данных Excel; он также привел к невероятно полезной библиотеке тестов Excel Data Driven Tests, которая использует атрибут TestCaseSource NUnit 2.5, чтобы сделать тесты, управляемые данными, с использованием таблиц Excel до смешного простыми. Просто помните, что Resharper еще не поддерживает TestCaseSource, поэтому вам нужно использовать средство запуска NUnit.

David Keaveny 20.10.2010 09:14

К сожалению, мы только что столкнулись с некоторыми проблемами с этой библиотекой. Во-первых, у нас есть несколько полей валюты, выходящих как даты. Во-вторых, происходит сбой, если в книге есть пустые листы. Итак, хотя интегрировать было очень легко, сейчас мы пересматриваем, стоит ли продолжать использовать эту библиотеку. Вряд ли он активно развивается.

Ian1971 23.10.2012 17:02

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

RichieHindle 20.12.2012 16:25

У нас возникают проблемы с файлами Excel, поступающими из служб отчетов SQL Server. Они просто не работают, если вы их не откроете и не сохраните (даже в неотредактированном виде). @RichieHindle: о каких дополнительных элементах вы говорите (надеясь, что это поможет мне с моими файлами SSRS Excel)?

Peter 14.01.2013 12:40

@Peter: Я думаю, что у меня проблемы из-за отсутствия элемента <dimension> в <worksheet>.

RichieHindle 14.01.2013 13:12

Как обновление моего комментария выше. Мы продолжали работать с этой библиотекой, и на самом деле я и еще один парень стали разработчиками проекта, и сейчас над ним снова активно ведется работа. Проблемы, о которых я упомянул, теперь исправлены, как и поддержка открытого офиса и, надеюсь, SSRS (нужен кто-то для тестирования).

Ian1971 17.01.2013 16:39

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

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

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

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

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

Здесь уже упоминается exceldatareader stackoverflow.com/questions/15828/reading-excel-files-from-c‌ /…. Как вы думаете, почему нам нужен еще один ответ. Вы должны прокомментировать ссылку, чтобы не создавать мусор из длинных веток.

nemke 06.02.2011 16:26

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

http://www.devtriogroup.com/ExcelReader

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

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

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

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

Если у вас есть несколько таблиц на одном листе, вы можете дать каждой таблице имя объекта и прочитать таблицу с помощью метода OleDb, как показано здесь: http://vbktech.wordpress.com/2011/05/10/c-net-reading-and-writing-to-multiple-tables-in-the-same-microsoft-excel-worksheet/

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

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

Это действительно отличная маленькая библиотека. Он просто преобразует все в списки списков строк, что отлично подходит для той работы, для которой мне это нужно.

Drewmate 29.11.2012 03:24

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

Это был полезно, особенно в части чтения имен листов.

martinstoeckli 30.03.2012 01:07

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

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

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

Другие вопросы по теме