Как прочитать файл Excel в C # без использования библиотек Microsoft.Office.Interop.Excel - PullRequest
42 голосов
/ 06 февраля 2012

У меня есть приложение .Net-Windows на C #.Мне нужно открыть Excel и обработать его.Как это сделать без использования библиотек Microsoft.Office.Interop.Excel?

Ответы [ 11 ]

56 голосов
/ 06 февраля 2012

Я настоятельно рекомендую CSharpJExcel для чтения файлов Excel 97-2003 (xls) и ExcelPackage для чтения файлов Excel 2007/2010 (Формат Office Open XML, xlsx).

Они оба работают отлично. Они абсолютно не зависят ни от чего.

Образец с использованием CSharpJExcel :

Workbook workbook = Workbook.getWorkbook(new System.IO.FileInfo(fileName));
var sheet = workbook.getSheet(0);
...
var content = sheet.getCell(colIndex, rowIndex).getContents();
...
workbook.close();

Образец с использованием ExcelPackage :

using (ExcelPackage xlPackage = new ExcelPackage(existingFile))
{
  // get the first worksheet in the workbook
  ExcelWorksheet worksheet = xlPackage.Workbook.Worksheets[1];
  int iCol = 2;  // the column to read

  // output the data in column 2
  for (int iRow = 1; iRow < 6; iRow++)
    Console.WriteLine("Cell({0},{1}).Value={2}", iRow, iCol, 
      worksheet.Cell(iRow, iCol).Value);

  // output the formula in row 6
  Console.WriteLine("Cell({0},{1}).Formula={2}", 6, iCol, 
    worksheet.Cell(6, iCol).Formula);

} // the using statement calls Dispose() which closes the package.

РЕДАКТИРОВАТЬ :

Есть еще один проект, ExcelDataReader , который, похоже, способен обрабатывать оба формата. Это также легко, как и другие, которые я упомянул.

Есть и другие библиотеки:

  • NPOI: Порт библиотеки Apache POI для .NET :
    Очень мощный, бесплатный и с открытым исходным кодом. В дополнение к Excel (97-2010) он также поддерживает файлы Word и PowerPoint.

  • ExcelLibrary
    Он поддерживает только файлы Excel 97-2003 (xls).

  • EPPlus
    Расширение для ExcelPackage. Проще в использовании (наверное).

40 голосов
/ 06 февраля 2012
var fileName = @"C:\ExcelFile.xlsx";
var connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties=\"Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text\""; ;
using (var conn = new OleDbConnection(connectionString))
{
    conn.Open();

    var sheets = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
    using (var cmd = conn.CreateCommand())
    {
        cmd.CommandText = "SELECT * FROM [" + sheets.Rows[0]["TABLE_NAME"].ToString() + "] ";

        var adapter = new OleDbDataAdapter(cmd);
        var ds = new DataSet();
        adapter.Fill(ds);
    }
}
2 голосов
/ 27 мая 2016

Ищите GSpread.NET.Это также проект OpenSource, и он не требует установки Office.Вы можете работать с таблицами Google, используя API из Microsoft Excel.Если вы хотите повторно использовать старый код для получения доступа к таблицам Google, лучше всего использовать GSpread.NET.Вам нужно добавить несколько строк:

Set objExcel = CreateObject("GSpreadCOM.Application")
// Name             - User name, any you like
// ClientIdAndSecret - `client_id|client_secret` format
// ScriptId         - Google Apps script ID
app.MailLogon(Name, ClientIdAndSecret, ScriptId);

Далее код остается без изменений.

http://scand.com/products/gspread/index.html

2 голосов
/ 29 августа 2012

Если вам нужно открывать файлы XLS, а не файлы XLSX, http://npoi.codeplex.com/ - отличный выбор.Мы использовали это, чтобы оказать хорошее влияние на наши проекты.

2 голосов
/ 06 февраля 2012

Недавно я обнаружил эту библиотеку, которая преобразует файл книги Excel в DataSet : Excel Data Reader

2 голосов
/ 06 февраля 2012

Я бы настоятельно рекомендовал не использовать OleDB, особенно если он будет работать на сервере.В долгосрочной перспективе это, вероятно, обойдется вам дороже - например, у нас было задание SSIS, вызывающее хранимую процедуру, когда OleDB считывал файл Excel в sptroc и продолжало вылетать блок SQL!Я вынул материал OleDB из sproc, и он прекратил сбой сервера.

Лучший способ, который я нашел, - это сделать это с Office 2003 и файлами XML - в отношении Рекомендации для сервераАвтоматизация офиса .Примечание: Office 2003 является минимальным требованием для этого:

Ref для чтения из Excel: http://www.roelvanlisdonk.nl/?p=924 (пожалуйста, проведите дополнительные исследования, чтобы найти другие примеры)

Ссылка для написания электронной таблицы Excel: http://weblogs.asp.net/jgaylord/archive/2008/08/11/use-linq-to-xml-to-generate-excel-documents.aspx

public void ReadExcelCellTest()
        {
            XDocument document = XDocument.Load(@"C:\BDATA\Cars.xml");
            XNamespace workbookNameSpace = @"urn:schemas-microsoft-com:office:spreadsheet";

            // Get worksheet
            var query = from w in document.Elements(workbookNameSpace + "Workbook").Elements(workbookNameSpace + "Worksheet")
                        where w.Attribute(workbookNameSpace + "Name").Value.Equals("Settings")
                        select w;
            List<XElement> foundWoksheets = query.ToList<XElement>();
            if (foundWoksheets.Count() <= 0) { throw new ApplicationException("Worksheet Settings could not be found"); }
            XElement worksheet = query.ToList<XElement>()[0];

            // Get the row for "Seat"
            query = from d in worksheet.Elements(workbookNameSpace + "Table").Elements(workbookNameSpace + "Row").Elements(workbookNameSpace + "Cell").Elements(workbookNameSpace + "Data")
                    where d.Value.Equals("Seat")
                    select d;
            List<XElement> foundData = query.ToList<XElement>();
            if (foundData.Count() <= 0) { throw new ApplicationException("Row 'Seat' could not be found"); }
            XElement row = query.ToList<XElement>()[0].Parent.Parent;

            // Get value cell of Etl_SPIImportLocation_ImportPath setting
            XElement cell = row.Elements().ToList<XElement>()[1];

            // Get the value "Leon"
            string cellValue = cell.Elements(workbookNameSpace + "Data").ToList<XElement>()[0].Value;

            Console.WriteLine(cellValue);
        }
1 голос
/ 11 мая 2016

Я только что искал решение и наткнулся Spreadsheetlight

, что выглядит очень многообещающе. Его открытый исходный код и доступен в виде пакета nuget.

1 голос
/ 18 декабря 2015

Я использовал Excel.dll библиотека, которая:

  • с открытым исходным кодом
  • легкий
  • быстро
  • совместимо с xls и xlsx

Документация доступна здесь: https://exceldatareader.codeplex.com/

Настоятельно рекомендуется.

1 голос
/ 06 февраля 2012

Вы можете попробовать OleDB для чтения данных из файла Excel.Пожалуйста, попробуйте как следует ..

DataSet ds_Data = new DataSet();
OleDbConnection oleCon = new OleDbConnection();

string strExcelFile = @"C:\Test.xlsx";
oleCon.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strExcelFile + ";Extended Properties=\"Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text\"";;

 string SpreadSheetName = "";

OleDbDataAdapter Adapter = new OleDbDataAdapter();
OleDbConnection conn = new OleDbConnection(sConnectionString);

string strQuery;
conn.Open();

int workSheetNumber = 0;

DataTable ExcelSheets = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

SpreadSheetName = ExcelSheets.Rows[workSheetNumber]["TABLE_NAME"].ToString();

strQuery = "select * from [" + SpreadSheetName + "] ";
OleDbCommand cmd = new OleDbCommand(strQuery, conn);
Adapter.SelectCommand = cmd;
DataSet dsExcel = new DataSet();
Adapter.Fill(dsExcel);
conn.Close();
0 голосов
/ 29 августа 2012

Вы также можете делать то, что я делаю, и с помощью коммерческого контроля, подобного этому: http://www.syncfusion.com/products/reporting-edition/xlsio

Я боролся в течение многих лет, прежде чем закончить с коммерческим решением. Сначала я попробовал подход OLEDB, который очень прост в использовании в моей среде разработки, но может быть рыцарем для развертывания. Затем я попробовал решения с открытым исходным кодом, но большинство из них устарели и имеют плохую поддержку.

Элементы управления xlsio из syncfusion - это те, которыми я пользуюсь, и которые мне нравятся, но есть и другие. Если вы можете перенести его, не стесняйтесь, это лучшее решение. Зачем? Потому что он не имеет никаких зависимостей от системы и сразу поддерживает все версии офиса. Среди других преимуществ, таких как, это действительно быстро.

И нет, я не работаю на синфузию;)

...