2015-07-15 24 views
15

Bazı veriler, sonraki iki sayfa S2 and S3 numaralı sayfada bulunan Özet görünüm olarak gösterilecek bir excel sayfasına S1 dışa aktarmaya çalışıyorum. Tek bir pivot oluşturabiliyorum ve mükemmel çalışıyor. Ama iki pivot oluşturduğumda, sonuçta ortaya çıkan Excel dosyası bozuk olarak işlenir.ClosedXML - Birden çok eksenli tablo oluşturma

using XL = ClosedXML.Excel; 
... 
XL.XLWorkbook wb = new XL.XLWorkbook(); 
dsData = Session["ExportData"] as DataSet; 

var sheet1 = wb.Worksheets.Add("output table"); 
sheet1.Cell(1, 1).InsertTable(dsData.Tables[0], "output table", true); 

// sheet1 is the reference sheet S1 
var dataRange = sheet1.RangeUsed(); 

// First Pivot 
XL.IXLWorksheet ptSheet1 = wb.Worksheets.Add("S2"); 

var pt1 = ptSheet1.PivotTables.AddNew("PivotTable1", ptSheet.Cell(3, 1), dataRange); 


pt1.ReportFilters.Add("CX"); 

pt1.RowLabels.Add("C1"); 
pt1.RowLabels.Add("C2"); 
pt1.RowLabels.Add("C3"); 
pt1.RowLabels.Add("C4"); 

pt1.ColumnLabels.Add("CL1"); 
pt1.ColumnLabels.Add("CL2"); 
pt1.ColumnLabels.Add("CL3"); 

pt1.Values.Add("V").SummaryFormula = XL.XLPivotSummary.Sum; 


// Second Pivot 
XL.IXLWorksheet ptSheet2 = wb.Worksheets.Add("S3"); 

var pt2 = ptSheet2.PivotTables.AddNew("PivotTable2", ptSheet1.Cell(3, 1), dataRange); 

pt2.ReportFilters.Add("QQ"); 

pt2.RowLabels.Add("C1"); 
pt2.RowLabels.Add("C2"); 

pt2.ColumnLabels.Add("CL1"); 
pt2.ColumnLabels.Add("CL2"); 
pt2.ColumnLabels.Add("CL3"); 

pt2.Values.Add("V").SummaryFormula = XL.XLPivotSummary.Sum; 
- İşte

Corrupt

Ben pivotlar oluşturmak için kullanıyorum kodudur - tıklayarak On Yani bozuk By

,

evet, bu olsun

C1, C2, C3. C4 and V referans sayfasındaki S1 numaralı sütun adlarıdır.

+1

renderers tarafından bozuk olarak ne demek istiyorsun? herhangi bir hata (lar) ortaya çıkıyor mu? Lütfen bize – jomsk1e

+0

@ jomsk1e dışa aktarma için tüm kodu göster. Soruyu güncelledim, lütfen kontrol edin. –

+1

Ben aynı sorunu yaşıyorum. . Hiç bir çözüm veya bir çözüm buldunuz mu? – leora

cevap

11

Sorun, bir ClosedXML uygulama hatasından kaynaklanmaktadır.

Kolayca aşağıdaki pasajı (kendi Pivot Tablolar örneğin değiştirilmiş bir versiyonu) kullanarak ve Excel ile sonuçlanan dosyasını açarak yeniden olabilir:

static void CreateTestPivotTables(string filePath) 
{ 
    var wb = new XLWorkbook(); 

    var wsData = wb.Worksheets.Add("Data");    
    wsData.Cell("A1").Value = "Category"; 
    wsData.Cell("A2").Value = "A"; 
    wsData.Cell("A3").Value = "B"; 
    wsData.Cell("A4").Value = "B"; 
    wsData.Cell("B1").Value = "Number"; 
    wsData.Cell("B2").Value = 100; 
    wsData.Cell("B3").Value = 150; 
    wsData.Cell("B4").Value = 75; 
    var source = wsData.Range("A1:B4"); 

    for (int i = 1; i <= 2; i++) 
    { 
     var name = "PT" + i; 
     var wsPT = wb.Worksheets.Add(name); 
     var pt = wsPT.PivotTables.AddNew(name, wsPT.Cell("A1"), source); 
     pt.RowLabels.Add("Category"); 
     pt.Values.Add("Number") 
      .ShowAsPctFrom("Category").And("A") 
      .NumberFormat.Format = "0%"; 
    } 

    wb.SaveAs(filePath); 
} 

böcek XLWorkbook_Save.cs yer almaktadır - GeneratePivotTables yöntemi:

içermesine izin esnada workbookPart.Workbook için birden PivotCaches ekler hattı workbookPart.Workbook.AppendChild(pivotCaches); ile
private static void GeneratePivotTables(WorkbookPart workbookPart, WorksheetPart worksheetPart, 
    XLWorksheet xlWorksheet, 
    SaveContext context) 
{ 
    foreach (var pt in xlWorksheet.PivotTables) 
    { 
     var ptCdp = context.RelIdGenerator.GetNext(RelType.Workbook); 

     var pivotTableCacheDefinitionPart = workbookPart.AddNewPart<PivotTableCacheDefinitionPart>(ptCdp); 
     GeneratePivotTableCacheDefinitionPartContent(pivotTableCacheDefinitionPart, pt); 

     var pivotCaches = new PivotCaches(); 
     var pivotCache = new PivotCache {CacheId = 0U, Id = ptCdp}; 

     pivotCaches.AppendChild(pivotCache); 

     workbookPart.Workbook.AppendChild(pivotCaches); 

     var pivotTablePart = 
      worksheetPart.AddNewPart<PivotTablePart>(context.RelIdGenerator.GetNext(RelType.Workbook)); 
     GeneratePivotTablePartContent(pivotTablePart, pt); 

     pivotTablePart.AddPart(pivotTableCacheDefinitionPart, context.RelIdGenerator.GetNext(RelType.Workbook)); 
    } 
} 

0 ya da 1

Bunun üzerine

söyleniyor, bunu düzeltmek için tek yol aşağıdaki gibi yukarıdaki yöntemi değiştirerek kaynak kodu içinde bulunmaktadır:

private static void GeneratePivotTables(WorkbookPart workbookPart, WorksheetPart worksheetPart, 
    XLWorksheet xlWorksheet, 
    SaveContext context) 
{ 
    var pivotCaches = workbookPart.Workbook.GetFirstChild<PivotCaches>(); 
    foreach (var pt in xlWorksheet.PivotTables) 
    { 
     var ptCdp = context.RelIdGenerator.GetNext(RelType.Workbook); 

     var pivotTableCacheDefinitionPart = workbookPart.AddNewPart<PivotTableCacheDefinitionPart>(ptCdp); 
     GeneratePivotTableCacheDefinitionPartContent(pivotTableCacheDefinitionPart, pt); 

     if (pivotCaches == null) 
      workbookPart.Workbook.AppendChild(pivotCaches = new PivotCaches()); 
     var pivotCache = new PivotCache { CacheId = (uint)pivotCaches.Count(), Id = ptCdp }; 
     pivotCaches.AppendChild(pivotCache); 

     var pivotTablePart = 
      worksheetPart.AddNewPart<PivotTablePart>(context.RelIdGenerator.GetNext(RelType.Workbook)); 
     GeneratePivotTablePartContent(pivotTablePart, pt); 
     pivotTablePart.PivotTableDefinition.CacheId = pivotCache.CacheId; 

     pivotTablePart.AddPart(pivotTableCacheDefinitionPart, context.RelIdGenerator.GetNext(RelType.Workbook)); 
    } 
} 

Güncelleme: iyi haber Yayınımın Francois Botha tarafından ClosedXML source repository fix tetikleyen vardır (Ayrıca oraya getiren petelids kredisine de), böylece kodu, umuyoruz ki bir sonraki sürümüne kadar umuyoruz.

+0

Paketin bir bakıcısı olarak, insanlar çekme istekleri olarak yama gönderebilirse bunu çok isterim. http: // github.Tabii, ben sadece sorulara dün çalıştı ve katkıda bulunmak için zaman yok ettik com/ClosedXML/ClosedXML –

+0

@FrancoisBotha (sanırım bazı ek gereksinimleri vardır bir kod parçacığını atma tıpkı değil) ve ardından kullanıcı petelids görünüyor bunu zaten yaptı. –

+1

@IvanStoev - Ben yaptım ama acele ettim ve bir parça yaptım. Cevabımı herhangi bir değer eklemediğinden sildim (ve bunun yerine sizinkini seçtiniz). FrancoisBotha daha iyi bir yama oluşturdu. – petelids

2

Bu değişikliği deneyin. Ek bir satır eklediğim bir not aldım. Ayrıca, AddNew() yönteminin yanlış çalışma sayfası başvurusu olabileceğini düşünüyorum? Bir başkasının üzerine bir pivot tablo eklemeyi deniyor olabilirsiniz. Eklediğim ek satırdan ziyade asıl sorun bu olabilir.

using XL = ClosedXML.Excel; 
... 
XL.XLWorkbook wb = new XL.XLWorkbook(); 
dsData = Session["ExportData"] as DataSet; 
var sheet1 = wb.Worksheets.Add("output table"); 
sheet1.Cell(1, 1).InsertTable(dsData.Tables[0], "output table", true); 

// sheet1 is the reference sheet S1 
var dataRange = sheet1.RangeUsed(); 
PivotCache cache = wb.PivotCaches.Add(dataRange); //---THIS LINE HAS BEEN ADDED--- 

// First Pivot 
XL.IXLWorksheet ptSheet1 = wb.Worksheets.Add("S2"); 
var pt1 = ptSheet1.PivotTables.AddNew("PivotTable1", ptSheet1.Cell(3, 1), cache); 
//Changed ptSheet.Cell... to ptSheet1.Cell... 
pt1.ReportFilters.Add("CX"); 
pt1.RowLabels.Add("C1"); 
pt1.RowLabels.Add("C2"); 
pt1.RowLabels.Add("C3"); 
pt1.RowLabels.Add("C4"); 
pt1.ColumnLabels.Add("CL1"); 
pt1.ColumnLabels.Add("CL2"); 
pt1.ColumnLabels.Add("CL3"); 
pt1.Values.Add("V").SummaryFormula = XL.XLPivotSummary.Sum; 

// Second Pivot 
XL.IXLWorksheet ptSheet2 = wb.Worksheets.Add("S3"); 
var pt2 = ptSheet2.PivotTables.AddNew("PivotTable2", ptSheet2.Cell(3, 1), cache); 
//Changed ptSheet1.Cell... to ptSheet2.Cell... 
pt2.ReportFilters.Add("QQ"); 
pt2.RowLabels.Add("C1"); 
pt2.RowLabels.Add("C2"); 
pt2.ColumnLabels.Add("CL1"); 
pt2.ColumnLabels.Add("CL2"); 
pt2.ColumnLabels.Add("CL3"); 
pt2.Values.Add("V").SummaryFormula = XL.XLPivotSummary.Sum; 
İlgili konular