Excelピボットでの1年、月、日のデータフィールドをフィルタリングする
質問
私は使用しています epplus Excelレポートを作成します。今、私はaでピボットを作成しようとしています DateTime
PageField
, 、ユーザーが自分で見たい期間をフィルタリングできるようにします。しかし、デフォルトでは、データワークシートで1年、月、または日にこれをフィルタリングすることはできますが、ピボットで動作することはありません。
これが私が持っているものです:
Dim wsPivot = excel.Workbook.Worksheets.Add("Pivot")
Dim wsData = excel.Workbook.Worksheets.Add("Data")
Dim source = workSheet.GetDataSource
wsData.Cells("A1").LoadFromDataTable(source, True, OfficeOpenXml.Table.TableStyles.Medium6)
For Each col As DataColumn In source.Columns
If col.DataType = GetType(Date) Then
Dim colNumber = col.Ordinal + 1
Dim range = wsData.Cells(1, colNumber, source.Rows.Count, colNumber)
range.Style.Numberformat.Format = "dd.mm.yyyy"
End If
Next
Dim dataRange = wsData.Cells(wsData.Dimension.Address.ToString())
dataRange.AutoFitColumns()
Dim pivotTable = wsPivot.PivotTables.Add(wsPivot.Cells("A3"), dataRange, "Open Contacts")
pivotTable.PageFields.Add(pivotTable.Fields("OwnedAt")) '** this is the date column i want to group **'
pivotTable.PageFields.Add(pivotTable.Fields("Owner"))
pivotTable.RowFields.Add(pivotTable.Fields("Country"))
pivotTable.ColumnFields.Add(pivotTable.Fields("Status"))
pivotTable.DataFields.Add(pivotTable.Fields("Count"))
数時間と数分を含むリストからDateTime値を選択し、月ごとにグループ化しないことのみが可能です(下の写真を参照)。
これがデータワークシートのフィルターリストです。これをピボットで取得する方法は?
前もって感謝します。
ノート: :私もこれを尋ねました CodePlexで 成功せずに。たぶん、他の誰かがエップルスとの経験がなくても、他の図書館と同様の問題を知っていても助けることができるかもしれません。 DateTime値をSQLあたりの個別の列(年、月、日)に分割することができました。しかし、私はピボットが非常に多くのフィールドとより混乱することを恐れています(私も他の日付フィールドを分割する必要があります)。プログラムでピボットを生成した経験がまったくない場合でも、Excelユーザーが何を経験するのでしょうか(私はそうではありません)。
解決
ExcelがPagefieldでもRowfieldでも私のデートフィールドでグループ化できなかった理由は、データシートに1つのフォーマットの行があったためです。次の行はこの問題を引き起こします(私の質問の完全なコードを参照)。
Dim range = wsData.Cells(1, colNumber, source.Rows.Count, colNumber)
range.Style.Numberformat.Format = "dd.mm.yyyy"
範囲のセルメソッドのパラメーターは次のとおりです。
1. From-Row 2. From-Column 3. To-Row 4. To-Column
なぜなら LoadFromDataTable
Columsの名前をヘッダーとしてデータテーブルにロードし、最後の行はフォーマットされていないため、ピボットは日付をグループ化できません。
だからこれはそれを修正しました:
Dim range = wsData.Cells(2, colNumber, source.Rows.Count + 1, colNumber)