2012-10-11 160 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,我可以得到另一個解決方案,我不打算標記你爲正確的答案(仍然希望有人在那裏有另一個答案),但你絕對配得上賞金!非常感謝你的幫助!!!! –