【发布时间】:2016-10-21 17:52:09
【问题描述】:
我有一些看起来像这样的数据的旧视图 - 请注意,9 月到 12 月是 2015 年,而不是 2016 年:
不过,此数据的数据透视表版本显示所有年份为 2016 年:
...因此也对它们进行了错误的排序,因为今年的混乱,9 月至 12 月在 1 月和 2 月之后。
数据透视表是从另一个工作表上的源数据生成的,该工作表与“旧”工作表具有相同的数据(9 月至 12 月 = 2015 年,1 月和 2 月 = 2016 年):
日期值从源数据添加到数据透视表,如下所示:
var pch = _xlBook.PivotCaches();
int pivotDataRowsUsed = xlBook.Worksheets["PivotData"].UsedRange.Rows.Count;
int pivotDataColsUsed =
xlBook.Worksheets["PivotData"].UsedRange.Columns.Count;
string lastColWrittenAsAlpha
ReportRunnerConstsAndUtils.GetExcelColumnName(pivotDataColsUsed);
string endRange = string.Format("{0}{1}", lastColWrittenAsAlpha
pivotDataRowsUsed);
Range sourceData = _xlBook.Worksheets["PivotData"].Range[string.Format("A1:{0}", endRange)];
PivotCache pc = pch.Create(XlPivotTableSourceType.xlDatabase, sourceData);
PivotTable pvt = pc.CreatePivotTable(_xlPivotTableSheet.Range["A6"], "PivotTable");
. . .
var monthField = pvt.PivotFields("MonthYr");
monthField.Orientation = XlPivotFieldOrientation.xlColumnField;
monthField.NumberFormat = "mmm yyyy";
monthField.DataRange.Interior.Color = ColorTranslator.ToOle(Color.LightBlue);
pvt.CompactLayoutColumnHeader = "Months";
上面看到的 9 月、10 月和 11 月的行都是“15-”;一月和二月都是“16-”
那么为什么日期标签在所有情况下都显示“16”,而不是有时显示“15”,我怎样才能让它们正确显示?
更新
更糟糕的是,当我运行典型的 13 个月的报告时,因此有两个相同的月份(但来自两个不同的年份) - 它显示它们是同一年,即使数据 不同:
更新 2
好奇者和好奇者 - 像这样使用 NumberFormat "dd mmm":
//monthField.NumberFormat = "mmm yyyy"; with this, they all show one year, even when the range spans two years
//monthField.NumberFormat = "dd mmm yyyy"; this shows a combination, such as "16 Jan 2016" and "15 Sep 2016"
monthField.NumberFormat = "dd mmm";
...确实给了我不同的年份,但它们的顺序是错误的(16 在 15 之前):
更新 3
更奇怪的是,我生成了一份 13 个月的报告,因此有两个相同的月份(但年份不同);在这种情况下,2016 年是有序的,然后是 2015 年,和以前一样,除了翻倍的月份,其中 2015 年正确但奇怪(基于其余月份标签的行为)首先出现:
更新 4
我已经尝试了以下每种组合,但它们都以某种方式失败:
向数据透视表使用的源工作表提供数据 - 格式为“YY-MMM”(如“15-Sep”)或“YYYY-MMM”(如“2015-Sep”):
monthYearCell.Value2 = ReportRunnerConstsAndUtils.GetMMMYYFromYYYYMM(MonthYear);
-或:
string _prependedCentury = "20" + MonthYear;
monthYearCell.Value2 = ReportRunnerConstsAndUtils.GetMMMYYFromYYYYMM(_prependedCentury); //MonthYear);
然后应用各种 NumberFormats:
//monthField.NumberFormat = "MMM yy";
monthField.NumberFormat = "MMM yyyy";
//monthField.NumberFormat = "yyyy MMM";
//monthField.NumberFormat = "yyyy-MMM";
//monthField.NumberFormat = "dd mmm";
必须有数据格式和 NumberFormat 属性的某种组合,才能以正确的顺序正确显示值,但我还没有找到它。
更新 5
如果源数据的格式为 YYYYMM(例如“201509”和“201510”)且数据透视表使用的 NumberFormat 为“MMM yy”,则两列(2015 年 9 月和 2015 年 10 月)均显示为“Sep 51 英寸。
【问题讨论】:
-
如果你这样说有帮助吗: var monthField = "20"+pvt.PivotFields("MonthYr");因为我想知道现在它是否认为 15 Jan 是 Jan 15, 2016
-
过道捷克出来。
-
嗯。我想我对设置monthField的值知之甚少。不过,如果你能弄清楚,我仍然想知道它认为日期是什么。如果我的预感是正确的,如果您将 NumberFormat 设置为“dd mmm yyyy”,我敢打赌您会在那里看到 15 和 16。
-
您是否有机会将此电子表格(或证明问题的电子表格)上传到 DropBox 或 G-Drive?我有几个想法,但如果没有看到实际问题,我无法巩固其中任何一个。
-
Clay——我最初的猜测,也只是猜测,“Dec 15”可能是“12/15/2016”。它是 MMM DD,但是当您将格式更改为 MMM YY 时,似乎年份会发生变化,而实际上您可能会显示不同的日期元素
标签: c# excel pivot-table excel-interop