2012-10-11 15 views
6

Qualcuno sa come fare?Tabella pivot EPPlus - Comprimi tutto il campo

sto usando EPPlus in .Net e ho creato una tabella pivot con 2 campi riga e una datafield sintesi:

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 

Tutto grandi opere, ma voglio avere la tabella pivot cominciare come crollata quando l'utente apre la cartella di lavoro (in Excel, quando si crea la tabella pivot, è possibile fare clic con il pulsante destro del mouse sull'elemento dati e selezionare "Espandi/comprimi"> "Comprimi intero campo"

Hot posso farlo via codice ?? (E sono disposto ad usare OpenXML diretto se EPPlus non lo supporta ancora ...)

ANCHE, esiste un modo per eliminare i dati Raw dalla cartella di lavoro in modo che la tabella pivot funzioni ancora? ho provato e quando apro la cartella di lavoro, il mio tavolo pivot è vuoto? - La mia logica attuale mi ha portato a this question ... Qualche idea ??

(so che ho scritto questa domanda in VB, ma ho aggiunto sia le C# & VB tag a questa domanda -. Mi sento a mio agio con il codice in entrambe le lingue - Grazie !!)

+0

Come un add-on a questa domanda perché nessuno ha risposto, quello che ho finito per fare è stato creare il foglio con il DataTable utilizzando EPPlus per la velocità, poi salvandolo . POI, ho aperto il foglio utilizzando l'interfaccia Excel.Interop, creato la tabella pivot e usato "Field1.ShowDetail = False" per comprimerlo come volevo ... –

+0

Come add-on per il mio componente aggiuntivo ... il commento sopra non mi serve più visto che ora desidero spostare questa applicazione su ASP/IIS e quindi Excel Interop non è più una possibilità valida ... –

risposta

-1

Uso EPPlus si potrebbe provare qualcosa di simile (Tratto da this SO post):

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

o forse più semplicemente, non fa qualcosa come il seguente lavoro?

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

un'occhiata anche a this SO post dettagliare un bel metodo di reverse engineering per vedere come Excel 'cose' realizza.

P.S. Non posso aiutarti con l'altra domanda "anche" mi dispiace.

+0

Paul, non sembra cambiare il pivottable completamente collassato ... Sei riuscito a farlo usando questo codice ?? Grazie per la risposta!!!! –

2

Potrebbe rendere xlsm e aggiungere vba a esso. Questa è probabilmente la peggiore risposta a questa soluzione, ma raggiunge il pieno collasso. Ho fornito un esempio funzionante, copia semplicemente passato in una nuova app per console. aggiungi la dipendenza epplus, "F5".

modificato/presa da 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

Sai cosa, @FaceToDesk, stavo pensando a farlo più e più volte e HOPING c'era una soluzione migliore, ma DAVVERO non sembra che ce n'è una basata sulla mancanza di risposte che questa domanda ha ricevuto. Grazie mille, penso che tu abbia ragione al 100% e questo è il modo migliore per affrontare il problema !!! –

+0

Sto pensando di mischiarlo con il fatto che il sottoprocesso 'Workbook_Open' si cancella da solo dopo essere stato eseguito la prima volta ... Come mostrato qui: http://www.excelforum.com/excel-programming-vba -macros/532200-how-to-remove-Workbook_Open-macro.html.Pubblicherò il mio ultimo codice una volta che ho finito per mostrare a chiunque altro abbia mai avuto questo tipo di problema che cosa si può fare. Solo per il piacere di HOPING posso ottenere un'altra soluzione, non ho intenzione di segnarti come la risposta corretta ancora appena (ancora sperando che qualcuno là fuori abbia un'altra risposta), ma ti meriti sicuramente la taglia !! Grazie mille per il vostro aiuto!!!! –