2016-10-27 1 views
1

je produis une feuille Excel qui contient des données formatées comme ceci:Comment puis-je déplacer les "sous-éléments" dans un tableau croisé dynamique Excel vers une autre colonne?

enter image description here

OIEau, les « Total des colis », « Total des achats », « Prix moyen », et les valeurs « % du total » sont situés dans une colonne de leur propre (Data) pour chaque description globale (ou sidearching).

Quand je PivotTablize ces données, il met ces valeurs en dessous de chaque description:

enter image description here

Cela est logique, mais ceux qui sont habitués à l'apparence précédente voulez qu'il soit reproduit dans le tableau croisé dynamique. Comment puis-je déplacer les "sous-éléments" de la description dans le tableau croisé dynamique vers leur propre colonne?

Voici le code que j'utilise pour générer le tableau croisé dynamique:

private void PopulatePivotTableSheet() 
{ 
    string NORTHWEST_CORNER_OF_PIVOT_TABLE = "A6"; 
    AddPrePivotTableDataToPivotTableSheet(); 
    var dataRange = rawDataWorksheet.Cells[rawDataWorksheet.Dimension.Address]; 
    dataRange.AutoFitColumns(); 
    var pivotTable = pivotTableWorksheet.PivotTables.Add(
         pivotTableWorksheet.Cells[NORTHWEST_CORNER_OF_PIVOT_TABLE], 
         dataRange, 
         "PivotTable"); 
    pivotTable.MultipleFieldFilters = true; 
    pivotTable.GridDropZones = false; 
    pivotTable.Outline = false; 
    pivotTable.OutlineData = false; 
    pivotTable.ShowError = true; 
    pivotTable.ErrorCaption = "[error]"; 
    pivotTable.ShowHeaders = true; 
    pivotTable.UseAutoFormatting = true; 
    pivotTable.ApplyWidthHeightFormats = true; 
    pivotTable.ShowDrill = true; 

    // Row field[s] 
    var descRowField = pivotTable.Fields["Description"]; 
    pivotTable.RowFields.Add(descRowField); 

    // Column field[s] 
    var monthYrColField = pivotTable.Fields["MonthYr"]; 
    pivotTable.ColumnFields.Add(monthYrColField); 

    // Data field[s] 
    var totQtyField = pivotTable.Fields["TotalQty"]; 
    pivotTable.DataFields.Add(totQtyField); 

    var totPriceField = pivotTable.Fields["TotalPrice"]; 
    pivotTable.DataFields.Add(totPriceField); 

    // Don't know how to calc these vals here, so have to grab them from the source data sheet 
    var avgPriceField = pivotTable.Fields["AvgPrice"]; 
    pivotTable.DataFields.Add(avgPriceField); 

    var prcntgOfTotalField = pivotTable.Fields["PrcntgOfTotal"]; 
    pivotTable.DataFields.Add(prcntgOfTotalField); 
} 

Donc il y a une RowField ("MonthYr") avec des valeurs telles que "201509" et "201510", un ColumnField ("Description") et quatre DataFields, qui s'alignent dans le champ de la colonne Description. Je veux déplacer ces quatre champs vers la droite, vers leur propre colonne, et l'étiquette de description pour être centré verticalement entre ces quatre valeurs à leur gauche. [Comment est-ce possible?

Répondre

2

Essayez de changer la mise en page de votre table avec

pivotTable.RowAxisLayout xlTabularRow 
pivotTable.MergeLabels = True 

c'est le résultat:

enter image description here

Un petit script en C# avec Interop.Excel. Inclus l'utilisation de;)

using Microsoft.Office.Interop.Excel; 
using System.Runtime.InteropServices; 
using Excel = Microsoft.Office.Interop.Excel; 

var excelApp = new Excel.Application(); 
Excel.Workbook wb = excelApp.Workbooks.Open(@"e:\42\TestSO.xlsx"); 
Worksheet ws = wb.Worksheets["SheetName"]; 
PivotTable pt = ws.PivotTables("DynamicTableName"); 
pt.RowAxisLayout(XlLayoutRowType.xlTabularRow); 
pt.MergeLabels = true; 
wb.Save(); 
wb.Close(); 
Marshal.ReleaseComObject(ws); 
+0

ajouté le code de fusion étiquettes de description. – Salvador

+0

En raison d'autres choses qui ne fonctionnent pas vraiment dans EPPlus, j'aurai probablement besoin de l'implémenter dans Excel Interop à la place; le code est-il le même pour ça? –

+0

Je pense que c'est, ne l'ai pas encore essayé: https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.pivottable.aspx – Salvador

1

Il est tout au sujet de la mise en page de tableau croisé dynamique/design ... voici la façon manuelle - Salvador a comme VBA:) ...

PivotTable Design