Сведения о вопросе

DED

04:09, 7th August, 2020

Теги

c#   .net   excel   ms-office    

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

Просмотров: 1005   Ответов: 25

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

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



  Сведения об ответе

PROGA

16:25, 9th August, 2020

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


  Сведения об ответе

fo_I_K

01:58, 21st August, 2020

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

http://www.connectionstrings.com/?перевозчик=excel2007 или http://www.connectionstrings.com/?перевозчик=excel

-Райан

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


  Сведения об ответе

dumai

15:58, 9th August, 2020

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

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


  Сведения об ответе

baggs

11:26, 15th August, 2020

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


  Сведения об ответе

PAGE

11:58, 18th August, 2020

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

http://exceldatareader.codeplex.com/

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


  Сведения об ответе

screen

03:07, 24th August, 2020

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


  Сведения об ответе

pumpa

18:25, 27th August, 2020

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


  Сведения об ответе

piter

12:51, 3rd August, 2020

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


  Сведения об ответе

repe

20:40, 25th August, 2020

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

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

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

Овации,

Карл


  Сведения об ответе

lourence

21:38, 23rd August, 2020

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


  Сведения об ответе

ASSembler

03:59, 19th August, 2020

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


  Сведения об ответе

park

13:19, 4th August, 2020

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


  Сведения об ответе

PAGE

23:26, 7th August, 2020

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

http://www.devtriogroup.com/ExcelReader


  Сведения об ответе

+-*/

11:51, 16th August, 2020

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


  Сведения об ответе

FAriza

21:32, 15th August, 2020

Простите меня, если я здесь не на своей базе, но разве не для этого существует офис PIA ?


  Сведения об ответе

appple

15:52, 7th August, 2020

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


  Сведения об ответе

PAGE

02:47, 18th August, 2020

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


  Сведения об ответе

SEEYOU

13:59, 1st August, 2020

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


  Сведения об ответе

SKY

02:40, 15th August, 2020

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

http://excelwrapperdotnet.codeplex.com/


  Сведения об ответе

DO__IT

21:12, 15th August, 2020

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

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

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

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


  Сведения об ответе

SSESION

12:12, 25th August, 2020

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

Excel Раздел Документации По Каналу Передачи Данных http://filehelpers.sourceforge.net/example_exceldatalink.html


  Сведения об ответе

park

21:11, 2nd August, 2020

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


  Сведения об ответе

ЯЯ__4

18:24, 7th August, 2020

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


  Сведения об ответе

ЯЯ__4

11:49, 4th August, 2020

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

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

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


  Сведения об ответе

lourence

17:48, 25th August, 2020

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

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

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться