2012-03-14 39 views
6

MicrosoftのCOM Interopを使用してC#でExcelドキュメントからデータを読み取ろうとしています。C#で結合されたExcelの列/行からデータを読み取る

これまでのところ、ドキュメントを読み込んでそこからデータを読み取ることができました。しかし、私は2つの異なる列からデータを読み込み、これらをjsonとして出力する必要があります(jquery ajax呼び出しの場合)

私はExcelドキュメントがどのように構造化されているかを素早く試作しました。私が持っているメソッドは、カテゴリ名のパラメータからデータを取得するためにどの列を見つけるために使用されるGetExcelDataByCategory(string categoryName)と呼ばれている;-)

enter image description here

を説明します。

だから、つまり、私はパラメータとして「区分2」とのコールを作ってるんだ場合、私はC列の行列から対応する日付のすべての値を取得する必要があり、その出力がします次のようになります。その後、JSONに解析/変換する必要が

enter image description here

私はこれを達成する方法については検索しましたが、今までは運がありませんでした:-(私はget_Range()メソッドを使用して範囲を選択することができますが、 ( "A1、C1")

これはExcelドキュメントからデータを読み込んだ私の最初の経験であり、覚えておくべきことがたくさんあると思います;-)私の2番目の画像に出力を得る方法はありますか?

ヘルプ/ヒントは大変ありがとうございます。 :-)

ありがとうございます。 http://exceldatareader.codeplex.com/

、あなたがjson.netを使用することができますJSONのために:あなたはExcelDataReaderを使用することができますエクセル解析と作成のための

すべてのベスト、

ボー

+0

Excelオブジェクトモデルを学習する最善の方法の1つは、手動でタスクを手動で実行するExcelでマクロを記録することです。次に、同様のタスクを実行するためにコードを構造化する方法を知るために、結果として得られたVBAコードをマクロで確認します。 –

答えて

4

これは私がどうなるのかです:

using Excel = Microsoft.Office.Interop.Excel; 

Excel.Application xlApp = new Excel.Application(); 
Excel.Workbook xlWorkbook = xlApp.Workbooks.Open("path to book"); 
Excel.Worksheet xlSheet = xlWorkbook.Sheets[1]; // get first sheet 
Excel.Range xlRange = xlSheet.UsedRange; // get the entire used range 

int numberOfRows = xlRange.Rows.Count; 
int numberOfCols = xlRange.Columns.Count; 
List<int> columnsToRead = new List<int>(); 
// find the columns that correspond with the string columnName which 
// would be passed into your method 
for(int i=1; i<=numberOfCols; i++) 
{ 
    if(xlRange.Cells[1,i].Value2 != null) // ADDED IN EDIT 
    { 
     if(xlRange.Cells[1,i].Value2.ToString().Equals(categoryName)) 
     { 
      columnsToRead.Add(i); 
     } 
    } 
} 
List<string> columnValue = new List<string>(); 
// loop over each column number and add results to the list 
foreach(int c in columnsToRead) 
{ 
    // start at 2 because the first row is 1 and the header row 
    for(int r = 2; r <= numberOfRows; r++) 
    { 
     if(xlRange.Cells[r,c].Value2 != null) // ADDED IN EDIT 
     { 
      columnValue.Add(xlRange.Cells[r,c].Value2.ToString()); 
     } 
    } 
} 

これは私がExcelを読み取るために使用するコードです。現在は、見出し(最初の行にあるもので指定されているもの)とそのすべての行を持つすべての列が読み込まれます。それはあなたが尋ねたもの(JSON形式にはなりません)とまったく同じものではありませんが、あなたを困惑させるのに十分だと思います。


EDIT:問題を引き起こしている空白セルがいくつかあるように見えます。空白のセルはInterop内でNULLになります。したがって、Value2またはValue2.ToString()が存在しないので、それらを呼び出そうとするとエラーが発生します。私はそれで何かをする前に、セルがヌルでないことを確認するためのコードを追加しました。エラーを防止します。

+0

こんにちはJetti、あなたの入力に感謝します!ありがとう:)しかし、私は私のエクセルファイル(.xls)私は例外を取得し続けます "null参照で実行時バインディングを実行することはできません"と私はデバッガを見て、この例外があります: "説明:古い形式または無効な型ライブラリ" Microsoftが示唆しているようにCurrentCultureを設定します。 -/ – bomortensen

+0

@bomortensenセルが空である可能性が高いため、問題が発生している可能性があります。私はそれで何かをする前に、セルが空でないことを確認するチェックをする私の答えにいくつかのコードを追加しました。それは問題を解決するはずです – Jetti

0

http://json.codeplex.com/

は両方ともかなり使いやすい。ちょうどウェブサイトを見てください。

+0

こんにちはステファン、ありがとう! :)私はそれを試しましたが、結果のカウントが252であっても、インデックスから範囲外のインデックスを取得しています。(今のところそれをやっていて、理由を調べるのに苦労しています。読者にGetValue(0)を作成しようとすると、私は他のインデックスと同じ結果を試してみました。 – bomortensen

関連する問題