Вопрос

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

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

Это было полезно?

Решение

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?

http://exceldatareader.codeplex.com/

Я использовал в it anger, в производственной среде, для извлечения больших объемов данных из различных файлов 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;
        }
    }
}

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

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

Простите меня, если я здесь не в теме, но разве это не то, что Офис ПИА предназначены для?

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

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

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

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

http://www.devtriogroup.com/ExcelReader

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

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

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

http://excelwrapperdotnet.codeplex.com/

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

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

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

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

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

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

Опаздываю на вечеринку, но я фанат LinqToExcel

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

тогда вы могли бы автоматизировать это с помощью c #.

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

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

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

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

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

Удачи вам

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

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

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

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

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

Мы используем Закрытый XML в довольно больших системах.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top