2012-10-11 158 views
6

有谁知道如何做到这一点?EPPlus枢轴表 - 折叠整个字段

我使用EPPlus在.Net和已经创建了2个字段和一个总结数据字段数据透视表:

Dim Pivot As OfficeOpenXml.Table.PivotTable.ExcelPivotTable 
Pivot = wksPivot.PivotTables.Add(wksPivot.Cells("A1"), Datarange, "pName") 

Pivot.RowFields.Add(Pivot.Fields("Fld1")).Sort = Table.PivotTable.eSortType.Ascending 
Pivot.RowFields.Add(Pivot.Fields("Fld2")).Sort = Table.PivotTable.eSortType.Ascending 

Dim dtaFld As OfficeOpenXml.Table.PivotTable.ExcelPivotTableDataField 
dtaFld = Pivot.DataFields.Add(Pivot.Fields("XYZ")) 
dtaFld.Function = Table.PivotTable.DataFieldFunctions.Sum 

一切都很正常,但我希望有透视表开始的崩溃当用户打开工作簿时(在Excel中,当您创建数据透视表时,可以右键单击数据元素并选择“展开/折叠”>“折叠整个字段”

热我可以这样做通过代码??(和我愿意使用直接OpenXML,如果EPPlus不支持这个呢......)

还有,有没有办法从工作簿中删除原始数据,以便数据透视表仍然有效?我试过了,当我打开工作簿时,我的数据透视表是空白的? - 我目前的逻辑导致我到this question ...任何想法?

(我只知道我在VB写的这个问题,但我加了两个C# & VB标签这个问题 - 我很舒服,在任何一种语言的代码 - 谢谢!)

+0

作为一个附加到这个问题,因为没有人回答了这个问题,我落得这样做创建一个使用EPPlus速度与数据表的表,然后将其保存。然后,我使用Excel.Interop界面打开工作表,创建了数据透视表并使用“Field1.ShowDetail = False”将其折叠为我想要的... –

+0

作为我的附加组件附加组件... The上面的评论不再为我服务,因为我现在想把这个应用程序转移到ASP/IIS,所以Excel Interop不再是一个有效的可能性... –

回答

-1

使用EPPlus你可以尝试类似(从this SO post服用):

(from pf in pivot.Fields 
select pf).ToList().ForEach(f => 
{ 
    f.Compact = false; 
    f.Outline = false; 
}); 

或许更简单地说,不喜欢的东西下面的工作?

pvtTable.Compact = False 
pvtTable.CompactData = False 
pvtTable.Outline = False 
pvtTable.OutlineData = False 
pvtTable.ShowDrill = True 

也期待在this SO post详述看到一个漂亮的逆向工程方法Excel如何实现“东西”。

P.S.不能帮助你与其他'也''问题抱歉。

+0

保罗,它似乎并没有改变枢轴表完全崩溃...你能用这个代码来完成它吗?感谢您的回应! –

2

可以让它xlsm并添加到它的vba。这可能是这个解决方案最差的答案,但它实现了完全崩溃。我提供了一个工作示例,只需将过去复制到一个新的控制台应用程序。添加epplus依赖项“F5”。

修改/从http://epplus.codeplex.com/SourceControl/latest#SampleApp/Sample15.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using OfficeOpenXml.Table; 
using OfficeOpenXml.Table.PivotTable; 
using OfficeOpenXml; 
using System.IO; 

namespace pTable 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      //ExcelPackage _pck = new ExcelPackage(); 

      Directory.CreateDirectory(string.Format("Test")); 
      //ExcelPackage _pck = new ExcelPackage(new FileInfo("Test\\Worksheet.xlsx")); 
      ExcelPackage _pck = new ExcelPackage(new FileInfo("Test\\Worksheet.xlsm")); 

      var wsPivot1 = _pck.Workbook.Worksheets.Add("Rows-Data on columns"); 

      var ws = _pck.Workbook.Worksheets.Add("Data"); 
      ws.Cells["K1"].Value = "Item"; 
      ws.Cells["L1"].Value = "Category"; 
      ws.Cells["M1"].Value = "Stock"; 
      ws.Cells["N1"].Value = "Price"; 
      ws.Cells["O1"].Value = "Date for grouping"; 

      ws.Cells["K2"].Value = "Crowbar"; 
      ws.Cells["L2"].Value = "Hardware"; 
      ws.Cells["M2"].Value = 12; 
      ws.Cells["N2"].Value = 85.2; 
      ws.Cells["O2"].Value = new DateTime(2010, 1, 31); 

      ws.Cells["K3"].Value = "Crowbar"; 
      ws.Cells["L3"].Value = "Hardware"; 
      ws.Cells["M3"].Value = 15; 
      ws.Cells["N3"].Value = 12.2; 
      ws.Cells["O3"].Value = new DateTime(2010, 2, 28); 

      ws.Cells["K4"].Value = "Hammer"; 
      ws.Cells["L4"].Value = "Hardware"; 
      ws.Cells["M4"].Value = 550; 
      ws.Cells["N4"].Value = 72.7; 
      ws.Cells["O4"].Value = new DateTime(2010, 3, 31); 

      ws.Cells["K5"].Value = "Hammer"; 
      ws.Cells["L5"].Value = "Hardware"; 
      ws.Cells["M5"].Value = 120; 
      ws.Cells["N5"].Value = 11.3; 
      ws.Cells["O5"].Value = new DateTime(2010, 4, 30); 

      ws.Cells["K6"].Value = "Crowbar"; 
      ws.Cells["L6"].Value = "Hardware"; 
      ws.Cells["M6"].Value = 120; 
      ws.Cells["N6"].Value = 173.2; 
      ws.Cells["O6"].Value = new DateTime(2010, 5, 31); 

      ws.Cells["K7"].Value = "Hammer"; 
      ws.Cells["L7"].Value = "Hardware"; 
      ws.Cells["M7"].Value = 1; 
      ws.Cells["N7"].Value = 4.2; 
      ws.Cells["O7"].Value = new DateTime(2010, 6, 30); 

      ws.Cells["K8"].Value = "Saw"; 
      ws.Cells["L8"].Value = "Hardware"; 
      ws.Cells["M8"].Value = 4; 
      ws.Cells["N8"].Value = 33.12; 
      ws.Cells["O8"].Value = new DateTime(2010, 6, 28); 

      ws.Cells["K9"].Value = "Screwdriver"; 
      ws.Cells["L9"].Value = "Hardware"; 
      ws.Cells["M9"].Value = 1200; 
      ws.Cells["N9"].Value = 45.2; 
      ws.Cells["O9"].Value = new DateTime(2010, 8, 31); 

      ws.Cells["K10"].Value = "Apple"; 
      ws.Cells["L10"].Value = "Groceries"; 
      ws.Cells["M10"].Value = 807; 
      ws.Cells["N10"].Value = 1.2; 
      ws.Cells["O10"].Value = new DateTime(2010, 9, 30); 

      ws.Cells["K11"].Value = "Butter"; 
      ws.Cells["L11"].Value = "Groceries"; 
      ws.Cells["M11"].Value = 52; 
      ws.Cells["N11"].Value = 7.2; 
      ws.Cells["O11"].Value = new DateTime(2010, 10, 31); 
      ws.Cells["O2:O11"].Style.Numberformat.Format = "yyyy-MM-dd"; 

      var pt = wsPivot1.PivotTables.Add(wsPivot1.Cells["A1"], ws.Cells["K1:N11"], "Pivottable1"); 

      pt.Compact = true; 
      pt.CompactData = true; 

      pt.GrandTotalCaption = "Total amount"; 
      pt.RowFields.Add(pt.Fields[1]); 
      pt.RowFields.Add(pt.Fields[0]); 
      pt.DataFields.Add(pt.Fields[3]); 
      pt.DataFields.Add(pt.Fields[2]); 
      pt.DataFields[0].Function = DataFieldFunctions.Product; 
      pt.DataOnRows = false; 



      _pck.Workbook.CreateVBAProject(); 

      var sb = new StringBuilder(); 

      sb.AppendLine("Private Sub Workbook_Open()"); 
      sb.AppendLine(" Range(\"A1\").Select"); 
      sb.AppendLine(" ActiveSheet.PivotTables(\"Pivottable1\").PivotFields(\"Category\").PivotItems(\"Hardware\").ShowDetail = False"); 
      sb.AppendLine("End Sub"); 

      _pck.Workbook.CodeModule.Code = sb.ToString(); 

      _pck.Save(); 


     } 

    } 
} 
+0

你知道吗,@FaceToDesk,我正在考虑一遍又一遍地做这件事,并且HOPING有一个更好的解决方案,但它真的似乎没有基于这个问题已经得到的反应的缺乏。非常感谢你,我认为你100%正确,这是解决问题的最好方法! –

+0

我在想,我会在第一次运行后让'Workbook_Open' Sub删除它自己,就像这里显示的那样:http://www.excelforum.com/excel-programming-vba -macros/532200-如何去除的-workbook_open-macro.html。一旦完成后,我会发布我的最终代码,向其他任何遇到此类问题的人展示可以完成的任务。只是为了HOPING,我可以得到另一个解决方案,我不打算标记你为正确的答案(仍然希望有人在那里有另一个答案),但你绝对配得上赏金!非常感谢你的帮助!!!! –