3

OpenXMLを使用してスプレッドシートを開き、スプレッドシートの行をループしています。行内のすべてのセルを返すlinqクエリがあります。linqクエリは、MSDNのデモから直接リッピングされました。

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つの列があるとします。このlinqクエリが機能する方法は、特定の行の値を持つセルのみを返すことです。したがって、「John」、「」、「173 Sycamore」を含むデータの行がある場合、linqクエリは列挙に「John」と「173Sycamore」のみを返します。これにより、次のかどうかを知ることができなくなります。 「173Sycamore」はSSNまたはアドレスフィールドです。

ここで繰り返しますが、必要なのは、値を含むセルだけでなく、すべてのセルが返されることです

私は考えられるあらゆる方法でlinqクエリをサルしようとしましたが、運がまったくありませんでした(つまり、where句を削除するのはトリックではありません)。どんな助けでもいただければ幸いです。ありがとう!

4

3 に答える 3

4

OpenXML 標準では、データのないセルのプレースホルダーは定義されていません。つまり、XML の基になるストレージはスパースです。これは、次の 2 つの方法のいずれかで回避できます。

  1. すべての「使用可能な」または「可能な」セルのリストを作成し (おそらく CROSS JOINタイプの操作を使用して)、コレクションに「左」結合してrow.Descendants<Cell>()、セル参照に値があるかどうかを確認します。
  2. ClosedXMLEPPlusなどのサード パーティ製ツールをExcel データのラッパーとして利用し、それらのインターフェイスをクエリすると、開発者にとってより使いやすくなります。
于 2012-01-19T00:05:22.683 に答える
3

ClosedXML の場合:

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
      // ...
   }
}
于 2012-01-19T15:03:38.610 に答える
0

私がお勧めする 1 つの方法は、すべての null セルに空白のデータを入力して、linq ステートメントによって返されるようにすることです。その方法については、この回答を参照してください。

于 2012-01-19T18:34:44.590 に答える