2015-10-23 23 views
12

У меня проблема с чтением из .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 неизвестных размеров (случайное число строк и столбцов).

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

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

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

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

EDIT: Только что проверил, что LinqToExcel, такой же вопрос, как и выше:

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

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

https://stackoverflow.com/a/19065266/3146582

+0

epplus https://epplus.codeplex.com/ – Fredou

+0

@Fredou: это не создавать электронные таблицы? Мне нужно читать с одного. У вас есть пример этого? –

+0

он также может прочитать файл excel, проверьте этот вопрос stackoverflow http://stackoverflow.com/questions/11685204/reading-excel-spreasheet-using-epplus или эту запись в блоге http://blog.fryhard.com/archive/2010 /10/28/reading-xlsx-files-using-c-and-epplus.aspx – Fredou

ответ

14

Если вы читаете данные из 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 your data 
    for (int rowNum = 1; rowNum <= totalRows; rowNum++) //selet 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)); 
    } 
} 
+0

Спасибо! Это лучшее решение для меня. Я просто немного изменил его и заменил добавление в stringbuilder с помощью foreach. –

+0

@BlackHat рад, что это помогло :) –

+1

EPPlus был лицензирован GNU GPL v3. – nyconing

-2

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

1

Чтение 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 
} 
Смежные вопросы