2015-10-23 17 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:それはスプレッドシートを作成しませんか?私は1つから読む必要があります。それの例はありますか? –

+0

それはまた、この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

、あなたはEPPlus NuGetパッケージを使用して、OLEプロバイダで次のコード

//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

ありがとう!それは私にとって最高の解決策です。私はちょうどそれを変更し、forebuでstringbuilderに追加を置き換えました。 –

+0

@BlackHat喜んで助けました:) –

+1

EPPlusはGNU GPL v3のライセンスを受けました。 – nyconing

-2

あなたもこのマシンで開発している:最終的には、このソリューションは私の問題を解決しているようですか?いいえ、私はOpenXml SDKを使用することをお勧めしますinstall itは、開発者のマシンでのみです。あなたはExcelファイルからデータを読んでいるなら

1

読書Excelファイルを使用することができますMS Jetエンジン(MSアクセス)がインストールされている場合にのみ可能です。 .NET interopをAPIに使用することに決めましたが、これは良い考えではありません。インストールされたMS Excelが必要で、サーバー上の自動化には使用しないことをお勧めします。

古い(バイナリ)Excel形式(xls)をサポートする必要がなく、XLSXを読むだけで十分な場合は、EPPlusライブラリを使用することをお勧めします。これは、読み書きXLSXファイルの両方のためのシンプルで強力なAPIを提供します(と例をたくさん持っている):

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