2012-01-18 14 views
3

私はスプレッドシートを開き、スプレッドシートの行をループするためにOpenXMLを使用しています。私は、行内のすべてのセルを返すlinqクエリを持っています。 Linqクエリは、MSDNのデモからそのままリッピングされました。OpenXML linqクエリ

IEnumerable<String> textValues = 
    from cell in row.Descendants<Cell>() 
    where cell.CellValue != null 
    select (cell.DataType != null 
      && cell.DataType.HasValue 
      && cell.DataType == CellValues.SharedString 
      ? sharedString.ChildElements[int.Parse(cell.CellValue.InnerText)].InnerText 
      : cell.CellValue.InnerText); 

LINQクエリは、値を持つすべてのセルを返すに素晴らしいですが、それは価値を持たない細胞を返しません。これは、どの細胞がどの細胞であるかを知ることを不可能にする。もう少し説明しましょう。たとえば、スプレッドシートに3つの列、名前、SSN、住所があります。このlinqクエリが動作する方法は、指定された行の値を持つセルだけを返します。したがって、 "John"、 ""、 "173 Sycamore"のデータ行がある場合、linqクエリは列挙で "John"と "173 Sycamore"を返すだけで、 "173 Sycamore"はSSNまたはAddressフィールドです。

私が必要とするのは、値がのセルだけでなく、すべてのセルが返されることです。

私は考えることができるすべての方法でlinqクエリを猿にしようとしましたが、私は運が全くありませんでした(つまり、where節を削除するのはやり手ではありません)。どんな助けもありがとう。ありがとう!

答えて

4

OpenXML標準では、データを持たないセルのプレースホルダは定義されていません。言い換えれば、XMLの基礎となるストレージはまばらです。その後、「左」にrow.Descendants<Cell>()コレクションに参加(おそらく操作のCROSS JOINタイプを使用することによって)

  1. は全て「利用可能」または「可能性」のセルのリストを作成します。次のいずれかの方法でこのラウンド仕事ができますセル参照が値を持っている場合
  2. は、ExcelデータのラッパーとしてClosedXMLまたはEPPlusのようなサードパーティ製のツールを活用し、より多くの開発者に優しいそのインターフェイスを、照会ご覧ください。 ClosedXMLで
+0

私はExcelスプレッドシートをエクスポートするためにClosedXMLを使用しましたが、インポートしたとは思いませんでした。それは?今日の自分のウェブサイトで今日も素早くリアルに見えていて、本当に素早く見えましたが、それが見えませんでした。私はEPPlusを見てみましょう。実際、OpenXMLを使って何かをしようとするたびに、一見シンプルでなければならないことに驚いていますが、何かが終了することになります! – Jagd

+0

データを読み書きする機能をインポートすることによって、OpenXMLとEPPlusの両方でデータを書き込むことができます。私はOpenXMLで直接何かをしようとすることは王子の痛みですが、上記のようなツールやSDKの一部としてのドキュメントエクスプローラでは、これまでのCOM Interopよりはるかに優れたsooooooを扱うことに同意します! – jklemmack

+1

ClosedXMLはうまく機能しました。私はOpenXMLを使いこなすのではなく、最初から使いたいと思っています。再度、感謝します! – Jagd

3

var wb = new XLWorkbook("YourWorkbook.xlsx"); 
var ws = wb.Worksheet("YourWorksheetName"); 
var range = ws.RangeUsed(); 
foreach(var row in range.Rows()) 
{ 
    // Do something with the row... 
    // ... 

    foreach(var cell in row.Cells()) 
    { 
     // Now do something with every cell in the row 
     // ... 
    } 
} 
+0

驚くばかり!確かめます! – Jagd

+0

ああ、あまりにも多くの努力は、ほとんどコードに凝縮した。ありがとう –

0

私はお勧め一つの方法は、彼らはあなたのLINQ文によって返されますので、ブランクデータを持つすべてのヌル細胞に記入することです。これを行うには、answerを参照してください。