2015-10-23 157 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第一排意見,然後是頭排和下面的數據)。

點評:作爲上述同樣的問題。

評論:下載包重量超過60MB,它要求我的系統上,這是不可能在我的處境安裝。無論如何,人們評論說它僅限於150行。

同時我會盡量檢查https://code.google.com/p/linqtoexcel/,但所有其他想法都非常值得歡迎!

編輯:只是檢查了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

謝謝!這對我來說是最好的解決方案。我只是改變了一下,並用foreach替換爲追加到stringbuilder。 –

+0

@BlackHat很高興幫助:) –

+1

EPPlus是GNU GPL v3許可。 – nyconing

-2

你這臺機器上開發呢?如果不是,我會建議使用OpenXml SDK,你必須在開發者機器上使用install it

1

與OLE提供商閱讀Excel文件是可能的,只有安裝了MS Jet引擎(MS接入) 。我注意到你決定使用.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 
}