在Power Query中保留格式

时间:2019-05-09 12:23:22

标签: excel powerquery

在Power Query中添加新列后,我似乎无法保留以前设置的格式。

  • 源表的值包含两个小数位的百分比

enter image description here

  • 我导入PQ并应用它认为正确的格式:

enter image description here

  • 我将格式更改为所需的格式:

enter image description here

  • 在日期列上枢轴

enter image description here

  • 将其加载回工作表

enter image description here

  • 请注意,百分比格式会丢失。

如果我将Excel中的“结果”表格式化为带有两位小数的百分比,然后添加“行”(例如,源中具有相同日期但值不同的新条目)并刷新,则格式将为保存。

enter image description here

但是但是,如果新条目需要一个新列(例如新日期),则该新列的格式在加载回Excel时将为{{ 1}},而不是General

enter image description here

查询的属性如下。

enter image description here

是否有针对这些问题的PQ解决方案(初始格式和“刷新”格式)?还是我必须通过Worksheet_change事件诉诸VBA?

以下是查询的Percentage

M-Code

1 个答案:

答案 0 :(得分:0)

我看到了相同的行为。类型Percentage的值在Power Query编辑器中显示为百分比,但以General数字格式加载到工作表中。

错误的解决方法

如果您的情况允许(例如,如果您只想引用/显示表格的值而不希望计算/计算/执行任何数字运算),则可以将百分比值更改为文本。 (这并不是真正的解决方案,而且由于值的内部表示形式发生了更改,这是一个非常糟糕的解决方法。)

let
    Source = Excel.CurrentWorkbook(){[Name="Table3"]}[Content],
    transformed = Table.TransformColumns(Source, {{"ID", Text.From, type text}, {"Date", each DateTime.ToText(_, "M/d/yyyy"), type text}, {"Value", Percentage.From, Percentage.Type}}),
    newHeaders = List.Distinct(transformed[Date]),  
    pivoted = Table.Pivot(transformed, newHeaders, "Date", "Value", List.Sum),
    stringifyPercentageColumns = List.Accumulate(newHeaders, pivoted, (tableState, currentHeader) => Table.TransformColumns(tableState, {{currentHeader, each Text.From(_ * 100) & "%", type text}}) )
in
    stringifyPercentageColumns

好的解决方法

您已经提到过,可能需要通过VBA应用数字格式设置。 QueryTable.AfterRefresh事件似乎更相关(documentationworked example),但是对于这样一个简单的任务,需要大量的设置代码;因此Worksheet_Change事件的设置可能会更快。

也许其他人可以为您提供实际的解决方案,但是我认为问题在于Excel对Power Query的Percentage类型没有“默认数字格式”(如果甚至存在这样的概念)。因此问题不是Power Query而是Excel,但我只是在猜测,可能是错误的。


不相关。您的M代码似乎包含三个单独的Table.TransformColumnTypes,但是我认为您只需要一个(请参见我的transformed代码中的M表达式)。