Как читать из XLSX (Excel)?

У меня проблема с чтением из файла .xlsx(Excel). Я попытался использовать:

var fileName = @"C:\automated_testing\ProductsUploadTemplate-2015-10-22.xlsx";
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, "XLSData");
DataTable data = ds.Tables["XLSData"];

// ... Loop over all rows.
StringBuilder sb = new StringBuilder();
foreach (DataRow row in data.Rows)
{
    sb.AppendLine(string.Join(",", row.ItemArray));
}

но если не удалось выполнить connectionString. Поэтому я обновил строку для поддержки .xlsx:

var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 12.0;", fileName);

но я получаю:

Поставщик 'Microsoft.ACE.OLEDB.12.0' не зарегистрирован на локальном компьютере.

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

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

Другие подходы, которые я проверил:

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

comment: не поддерживает имена столбцов настроек из разных строк, чем первый (в некоторых моих файлах Excel есть комментарии в 4-6 первых строках, а затем строка заголовков и данных ниже).

комментарий: та же проблема, что и выше.

комментарий: загруженный вес пакета был более 60 МБ, и мне требуется установить его в систему, что невозможно в моей ситуации. В любом случае, люди отмечают, что он ограничен 150 строками.

Тем временем я попытаюсь проверить https://code.google.com/p/linqtoexcel/, но все другие идеи более чем приветствуются!

EDIT: просто проверил LinqToExcel, такую ​​же проблему, как указано выше:

Поставщик 'Microsoft.ACE.OLEDB.12.0' не зарегистрирован на локальном компьютере.

EDIT2: В конечном итоге кажется, что это решение решило мою проблему:

qaru.site/info/95013/...

Ответ 1

Если вы читаете данные из файла Excel, вы можете использовать пакет EPPlus NuGet и использовать следующий код:

//using OfficeOpenXml;
using (ExcelPackage xlPackage = new ExcelPackage(new FileInfo(@"C:\YourDirectory\sample.xlsx")))
{
    var myWorksheet = xlPackage.Workbook.Worksheets.First(); //select sheet here
    var totalRows = myWorksheet.Dimension.End.Row;
    var totalColumns = myWorksheet.Dimension.End.Column;

    var sb = new StringBuilder(); //this is your data
    for (int rowNum = 1; rowNum <= totalRows; rowNum++) //select starting row here
    {
        var row = myWorksheet.Cells[rowNum, 1, rowNum, totalColumns].Select(c => c.Value == null ? string.Empty : c.Value.ToString());
        sb.AppendLine(string.Join(",", row));
    }
}

Ответ 2

Чтение файлов Excel с помощью поставщика OLE возможно только при установке MS Jet (MS Access). Я заметил, что вы решили использовать .NET interop для API, но это не очень хорошая идея: для этого требуется установленная MS Excel и не рекомендуется использовать для автоматизации на серверах.

Если вам не нужно поддерживать старые (двоичные) форматы Excel (xls) и достаточно читать XLSX, я рекомендую использовать EPPlus библиотека. Он предоставляет простой и мощный API для чтения и записи файлов XLSX (и имеет много примеров):

var existingFile = new FileInfo(filePath);
// Open and read the XlSX file.
using (var package = new ExcelPackage(existingFile)) {
   // access worksheets, cells etc
}

Ответ 3

Я хотел бы предложить с открытым исходным кодом & бесплатная библиотека ExcelMapper (доступна на NuGet).

Он обеспечивает гораздо более краткий (т.е. читабельный) способ чтения файлов Excel по сравнению с более традиционными подходами, например, с помощью Запросы OLE или Microsoft.Interop.Office.

1. Имеется файл Excel:

enter image description here

2. Создайте объект Person С#:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
}

3. Прочтите его, используя ExcelMapper

  var fileName = @"C:\Temp\Names.xlsx"; // your excel file
  List<Person> people = new ExcelMapper(fileName).Fetch<Person>();

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

  var fileName = @"C:\Temp\Names.xlsx"; // your excel file
  List<Person> people = new ExcelMapper(fileName).Fetch<Person>("Sheet2");

Вы можете установить его с помощью NuGet

Install-Package ExcelMapper

Отказ от ответственности: я не связан с ExcelMapper, но, попробовав различные библиотеки, я нашел, что с этой библиотекой проще всего работать.

Вот бесплатное короткое видео, демонстрирующее ExcelMapper. instructional video - how to read excel files in c#

Ответ 4

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