2012-10-11 18 views
6

Bunu nasıl yapacağını bilen var mı?EPPlus Özet Tablo - Alanın tamamını küçültün

.NET içinde EPPlus kullanıyorum ve 2 satır alanları ve bir özet DataField olan bir pivot tablo oluşturduk

:

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 

her şey harika çalışıyor, ancak ben çöktü olarak Pivot Tablo başlamak istiyorum kullanıcı çalışma kitabını açtığında (Excel'de, pivot tabloyu oluştururken, veri öğesine sağ tıklayıp "Genişlet/Daralt>>" Tüm Alanı Daralt ">

Bunu yapabilir miyim? kodu ile? (Ve EPPlus bunu henüz desteklemiyorsa doğrudan OpenXML kullanmak istiyorum ...)

ALSO, Ham tabloyu çalışma kitabından silmek için bir yol var mı, böylece pivot tablo hala çalışıyor? Denedim ve çalışma kitabını açtığımda, pivot tablomuz boş mu? - Şu anki mantığım beni this question'a yönlendirdi ... Herhangi bir düşünce?

(Ben VB bu soruyu yazdım biliyorum ama C# & VB bu soruya etiketler eklendi ikisi de -. Teşekkür !! - Ben de dilde kodu ile rahatım) yapabildin EPPlus kullanma

+0

alınan/modifiye . Daha sonra, Excel.Interop arabirimini kullanarak sayfayı açtım, Pivot Tablosunu yarattım ve "Field1.ShowDetail = False" 'i istediğim gibi daraltmak için kullandım ... –

+0

Eklentime bir eklenti olarak ... Artık bu uygulama artık bana hizmet veriyor çünkü artık bu uygulamayı ASP/IIS'ye taşımak istiyorum ve bu yüzden Excel Interop artık geçerli bir olasılık değil ... –

cevap

-1

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

ya da belki daha basitçe aşağıdaki iş gibi bir şey yapar: (this SO post Alındığı) gibi bir şey denemek? başarır 'şeyleri' excel nasıl

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

Ayrıca görme için güzel ters mühendislik yöntemini ayrıntılarıyla this SO post bak.

P.S. Diğer 'aynı zamanda' soru ile size yardımcı olamaz üzgünüm.

+0

Paul, tam olarak daraltmak için pivot değiştirilemez ... Bu kodu kullanarak bunu başardınız mı? Yanıt için teşekkürler !! –

2

Bunu xlsm yapabilir ve buna vba ekleyebiliriz. Bu muhtemelen bu çözümün en kötü cevabıdır, ancak tam çöküşü sağlar. Çalışan bir örnek verdim, sadece yeni bir konsol uygulamasına geçmiş kopyalayın. epplus bağımlılığını ekleyin, "F5". kimse cevap beri

sonra kaydederek, ben hız için EPPlus kullanılarak datatable ile levha yaratıyordu bunu kadar sona erdi, bir eklenti bu soruya şöyle 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

Ne olduğunu biliyor musun, @FaceToDesk, bunu tekrar tekrar yapmayı düşünüyordum ve HOPING daha iyi bir çözümdü, ama GERÇEKTEN bu sorunun ne kadar sürdüğü cevapların eksikliğine dayanmıyor gibi görünüyor. Çok teşekkür ederim, bence% 100 doğru ve bu sorunu çözmek için en iyi yoldur! –

+0

Ben düşünüyorum ilk kez çalıştırdıktan sonra 'Workbook_Open' Sub kendini silmeyi ile bu kadar karıştırmak gidiyorum ... Burada gösterildiği gibi: http://www.excelforum.com/excel-programming-vba -macros/532200-how-to-kaldır-Workbook_Open-macro.html.Bu tür bir sorunu olan başka kimseyi göstermek için bitirildikten sonra son kodumu göndereceğim. Sadece HOPING uğruna başka bir çözüm bulabilirim, henüz henüz doğru cevap olarak işaretlemeyeceğim (hala başka bir cevabın olduğunu umarak), ama kesinlikle ödülü hak ediyorsun! Yardımın için çok teşekkür ederim!!!! –