2008-08-19 4 views
233

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

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

ответ

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

Если кажется, что в этом подходе «Выбор» пытается угадать тип данных столбца и заставить его угадать тип данных. Например, если у вас есть столбец с преимущественно двойными значениями, вам не понравится передача x.Field , но ожидает x.Field . Это правда? – 2010-06-03 14:47:12

1

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

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

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

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

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

1

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

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

Успехов

3

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

+5

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

83

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

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

-Ryan

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

+1

Таким образом, на сегодняшний день является самым быстрым. – StingyJack 2009-01-19 14:06:28

+17

Конечно, это не так, Стинг. Вы должны просеять все данные и написать дрянной код DB (вручную создайте свои модели, сопоставьте столбцы с свойствами, yadda yadda). Самый быстрый способ - позволить * другим бедным SOB сделать это за вас *. Вот почему люди используют фреймворки вместо того, чтобы писать все снизу вверх. – Will 2009-11-27 18:27:50

+0

Кроме того, у меня были времена, когда это не дало мне правильных результатов из-за проблем с локализацией ... бесконечный бой сепараторов – cyberzed 2010-02-11 13:26:32

4

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

1

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

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

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; 
     } 
    } 
} 
+9

Этот код нуждается в некоторой решарской любви – Cherian 2009-07-11 08:24:38

+0

Не могу договориться подробнее Cherian. Этот код много лет ... прежде чем я даже освоил Resharper :) – hitec 2009-07-13 17:48:08

27

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

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

+0

Вы ответили на мой вопрос (в виде комментария выше). – 2010-06-03 15:07:54

8

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

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

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

Cheers,

Карл

12

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

+2

Нет, спасибо, API OpenXml ужасен! – 2010-06-03 05:52:07

2

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

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

+1

Я тебя не смущу, но я недавно начал использовать FileHelpers и был шокирован тем, как ... дерьмовым. Например, единственный способ сопоставить столбцы в свойствах csv ... извините, FIELDS, модели *, чтобы создать поля в порядке столбцов *. Я не знаю о вас, но я не стал бы полагаться на причуду компилятора для одного из самых центральных соображений дизайна моей инфраструктуры f8king. – Will 2009-11-27 18:31:59

3

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

+0

XML Spreadsheet - довольно чистый формат :) – dbkk 2009-10-01 03:47:27

+0

Но как файлы excel .... мы можем защитить файлы xml с паролем? – gsvirdi 2010-05-26 05:52:58

+0

Я подозреваю, что вы можете защитить его от Excel, но не от человека с компилятором ... как-нибудь ... это просто байты. – kenny 2010-05-26 09:05:23

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); 
    } 
} 
+4

очень чистый код! – 2010-02-24 01:15:59

15

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

+0

Я думаю, эта ссылка нуждается в обновлении ... http://koogra.sourceforge.net/ – Dave 2009-02-02 20:39:09

+0

К сожалению! Очень неправильный url! Исправлено сейчас – 2009-02-02 22:07:53

3

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

6

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

0

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

3

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

1

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

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

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

2

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

21

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

http://exceldatareader.codeplex.com/

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

0

Excel Data Reader - это путь!

It's Open Source, at http://exceldatareader.codeplex.com/ и активно развивается.

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

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

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

3

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

http://www.devtriogroup.com/ExcelReader

2

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

  • Разрешить Чтение/запись из Excel, полученные файлы
  • Be Fast (не как использование COM)
  • Be MS Office Independent (требуется, чтобы быть полезными без клиентов, имеющих установленного MS Office)
  • В Free или Open Source (но активно развивается)

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

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

2

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

1

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

6

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

1

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

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