2012-10-11 25 views
6

Czy ktoś wie, jak to zrobić?Tabela przestawna EPPlus - Zwiń całe pole

Używam EPPlus w .NET i stworzyliśmy tabelę przestawną z 2 pól wierszy i jednej zbiorczej dataField:

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 

wszystko działa świetnie, ale chcę mieć Pivot Table rozpocząć jak zawalił kiedy użytkownik otwiera skoroszyt (w programie Excel, gdy tworzysz tabelę przestawną, możesz kliknąć element danych prawym przyciskiem myszy i wybrać "Rozwiń/zwiń"> "Zwiń całe pole"

Gorąco mogę to zrobić przez kod ?? (I jestem skłonny użyć bezpośredniego OpenXML, jeśli EPPlus jeszcze tego nie obsługuje ...)

TAKŻE TAKŻE, czy istnieje sposób usunięcia danych surowych ze skoroszytu, aby tabela przestawna nadal działała? próbowałem i po otwarciu skoroszytu mój tabela przestawna jest pusta? - Moja obecna logika doprowadziła mnie do this question ... Jakieś myśli?

(wiem, pisałem to pytanie w VB ale dodałem zarówno C# & VB tagów na to pytanie. - Jestem zadowolony z kodu w każdym języku - Dzięki !!)

+0

Jako dodatek do tego pytania, ponieważ nikt nie odpowiedział na to, co skończyło się robi było stworzenie arkusza z DataTable przy użyciu EPPlus dla prędkości, a następnie zapisanie go . Następnie otworzyłem arkusz przy użyciu interfejsu Excel.Interop, utworzyłem tabelę przestawną i użyłem "Field1.ShowDetail = False", aby zwinąć go tak, jak chciałem ... –

+0

Jako dodatek do mojego dodatku ... powyższy komentarz już mi nie służy, ponieważ teraz chcę przenieść tę aplikację do ASP/IIS, więc Excel Interop nie jest już prawidłową możliwością ... –

Odpowiedz

-1

Korzystanie EPPlus mogłeś spróbować czegoś podobnego (wzięte z this SO post):

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

czy może prościej, nie coś poniższej pracy?

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

Również spojrzeć this SO post wyszczególnieniem piękny sposób odwrotny inżynier dla widząc jak excel „rzeczy” osiąga.

P.S. Nie mogę ci pomóc z twoimi innymi "również" przykro mi.

+0

Paul, wydaje się, że nie zmienia on możliwości przestawiania na całkowicie zwinięty ... Czy byłeś w stanie to zrobić za pomocą tego kodu? Dzięki za odpowiedzi!!!! –

2

Może to zrobić xlsm i dodać do niego vba. Jest to prawdopodobnie najgorsza odpowiedź na to rozwiązanie, ale osiąga pełną zapaść. Podałem przykład, wystarczy skopiować przeszłość do nowej aplikacji konsolowej. dodaj zależność epplus, "F5".

zmodyfikowany/zaczerpnięte z 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

Wiesz co, @FaceToDesk, myślałem o robieniu tego w kółko i NAPRAWDĘ było lepsze rozwiązanie, ale NAPRAWDĘ nie wydaje się, że istnieje jeden oparty na braku odpowiedzi, które otrzymało to pytanie. Dziękuję bardzo, myślę, że masz 100% racji i to jest najlepszy sposób, aby poradzić sobie z problemem !!! –

+0

Zastanawiam się, czy mam zamiar to zmylić z tym, że po usunięciu subskrypcji "Workbook_Open" po pierwszym uruchomieniu ... Jak pokazano tutaj: http://www.excelforum.com/excel-programming-vba -macros/532200-how-to-remove-workbook_open-macro.html.Wezwę mój ostateczny kod, gdy skończę, aby pokazać komukolwiek, kto kiedykolwiek ma tego rodzaju problem, co można zrobić. Tylko ze względu na HOPING, mogę znaleźć inne rozwiązanie, nie mam zamiaru oznaczyć cię jako poprawnej odpowiedzi (wciąż mam nadzieję, że ktoś tam ma inną odpowiedź), ale zdecydowanie zasługujesz na nagrodę !! Dziękuję bardzo za Twoją pomoc!!!! –