Ändra sidfältslayout i pivottabell

Inledning

En pivottabell i Microsoft Excel har ett särskilt sidfältsområde som sitter ovanför tabellens rad-/kolumn-/datakropp. Det här området renderas som en remsa med rullgardinsfilterkontroller (en per sidfält) och det är vad slutanvändare klickar på för att skära pivoten efter kriterier som år eller region. Aspose.Cells modellerar detta område genom samlingen PivotTable.PageFields och exponerar tre egenskaper som styr hur remsan visas visuellt:

  • PivotTable.PageFieldOrder (ett Aspose.Cells.PrintOrderType-värde) avgör om ytterligare sidfält placeras bredvid de befintliga eller under dem.
  • PivotTable.PageFieldWrapCount anger hur många sidfält som placeras per rad eller kolumn innan radbrytning sker.
  • PivotTable.PageFields.Move(currIndex, destIndex) omordnar sidfälten utan att ändra ordningsläget. Den här artikeln går igenom tre kodexempel som visar vart och ett av dessa operationer på en delad datamängd, så att du kan jämföra de resulterande layouterna sida vid sida.

Källdata

Alla tre exempel nedan läser in dessa åtta rader försäljningsdata i ett kalkylblad med namnet PivotData. Datan innehåller två sidfältskandidater (Year, Region), en radfältskandidat (Fruit) och ett mått (Amount), vilket gör sidfältsremsan meningsfull att inspektera.

Fruit Year Region Amount
Apple 2022 North 150
Apple 2023 North 180
Banana 2022 South 120
Banana 2023 South 140
Cherry 2022 East 200
Cherry 2023 East 220
Grape 2022 West 90
Grape 2023 West 110
Alla åtta rader fylls i i varje kodexempel, i identisk ordning, så att källdatan aldrig skiljer sig åt mellan scenarierna — det är bara sidfältslayoutens egenskaper som gör det.

Exempel 1: Över sedan ned

I det första scenariot konfigurerar vi de två sidfälten (Year, Region) så att de visas sida vid sida i en enda rad överst i pivottabellen. Vi tilldelar Fruit till radaxeln, placerar Year först och Region sedan på sidaxeln (ordningen på anropen till addFieldToArea bestämmer startindexet), lägger till Amount (Summa) som datafält, och ställer sedan in PageFieldOrderPrintOrderType.OVER_THEN_DOWN med PageFieldWrapCount = 2. Med OVER_THEN_DOWN och ett radbrytningsantal på 2 läggs de två sidfälten ut horisontellt sida vid sida i en enda rad överst i pivottabellen, så att remsan upptar en rad med bredden två.

let dataDir = "output";
if (!fs.existsSync(dataDir)) fs.mkdirSync(dataDir, { recursive: true });
let workbook = new AsposeCells.Workbook();
let worksheets = workbook.getWorksheets();
let pivotDataIdx = worksheets.add("PivotData");
let pivotDataSheet = worksheets.get(pivotDataIdx);
let pivotDataCells = pivotDataSheet.getCells();
// Rubriker (rad 0)
pivotDataCells.get(0, 0).putValue("Fruit");
pivotDataCells.get(0, 1).putValue("Year");
pivotDataCells.get(0, 2).putValue("Region");
pivotDataCells.get(0, 3).putValue("Amount");
// Rad 1: Äpple, 2022, Norr, 150
pivotDataCells.get(1, 0).putValue("Apple");
pivotDataCells.get(1, 1).putValue(2022);
pivotDataCells.get(1, 2).putValue("North");
pivotDataCells.get(1, 3).putValue(150);
// Rad 2: Äpple, 2023, Norr, 180
pivotDataCells.get(2, 0).putValue("Apple");
pivotDataCells.get(2, 1).putValue(2023);
pivotDataCells.get(2, 2).putValue("North");
pivotDataCells.get(2, 3).putValue(180);
// Rad 3: Banan, 2022, Söder, 120
pivotDataCells.get(3, 0).putValue("Banana");
pivotDataCells.get(3, 1).putValue(2022);
pivotDataCells.get(3, 2).putValue("South");
pivotDataCells.get(3, 3).putValue(120);
// Rad 4: Banan, 2023, Söder, 140
pivotDataCells.get(4, 0).putValue("Banana");
pivotDataCells.get(4, 1).putValue(2023);
pivotDataCells.get(4, 2).putValue("South");
pivotDataCells.get(4, 3).putValue(140);
// Rad 5: Körsbär, 2022, Öst, 200
pivotDataCells.get(5, 0).putValue("Cherry");
pivotDataCells.get(5, 1).putValue(2022);
pivotDataCells.get(5, 2).putValue("East");
pivotDataCells.get(5, 3).putValue(200);
// Rad 6: Körsbär, 2023, Öst, 220
pivotDataCells.get(6, 0).putValue("Cherry");
pivotDataCells.get(6, 1).putValue(2023);
pivotDataCells.get(6, 2).putValue("East");
pivotDataCells.get(6, 3).putValue(220);
// Rad 7: Druva, 2022, Väst, 90
pivotDataCells.get(7, 0).putValue("Grape");
pivotDataCells.get(7, 1).putValue(2022);
pivotDataCells.get(7, 2).putValue("West");
pivotDataCells.get(7, 3).putValue(90);
// Rad 8: Druva, 2023, Väst, 110
pivotDataCells.get(8, 0).putValue("Grape");
pivotDataCells.get(8, 1).putValue(2023);
pivotDataCells.get(8, 2).putValue("West");
pivotDataCells.get(8, 3).putValue(110);
// Lägg till PivotTableReport-arket
let pivotTableSheetIdx = worksheets.add("PivotTableReport");
let pivotTableSheet = worksheets.get(pivotTableSheetIdx);
let pivotTables = pivotTableSheet.getPivotTables();
// Skapa pivottabell från PivotData!A1:D9 placerad vid A1 på PivotTableReport
let pivotIndex = pivotTables.add("PivotData!A1:D9", "A1", "PivotTable1");
let pivotTable = pivotTables.get(pivotIndex);
// Lägg till fält
pivotTable.addFieldToArea(AsposeCells.PivotFieldType.Row, 0);   // Frukt
pivotTable.addFieldToArea(AsposeCells.PivotFieldType.Page, 1);  // År
pivotTable.addFieldToArea(AsposeCells.PivotFieldType.Page, 2);  // Region
pivotTable.addFieldToArea(AsposeCells.PivotFieldType.Data, 3);  // Belopp
pivotTable.getDataFields().get(0).setFunction(AsposeCells.ConsolidationFunction.Sum);
// Konfigurera layout för sidfältsområde: placera sidfält först vågrätt, radbryt efter varannan
pivotTable.setPageFieldOrder(AsposeCells.PrintOrderType.OverThenDown);
pivotTable.setPageFieldWrapCount(2);
// Uppdatera och beräkna
pivotTable.calculateData();
// Spara
workbook.save(path.join(dataDir, "pageFieldLayout_overThenDown.xlsx"));

Exempel 2: Ned sedan över

I det här exemplet placerar vi Fruit på radaxeln, Year och Region på sidaxeln (med Year först), och Amount (Summa) som datafält — precis som i Exempel 1. Vi ställer sedan in PageFieldOrderPrintOrderType.DOWN_THEN_OVER och PageFieldWrapCount2. Med DOWN_THEN_OVER och ett radbrytningsantal på 2 staplas de två sidfälten vertikalt — Year överst, Region direkt nedanför — och bildar en enda kolumn överst i pivottabellen. Remsan upptar därför två rader med bredden ett, i motsats till Exempel 1.

var workbook = new AsposeCells.Workbook();
var pivotData = workbook.getWorksheets().get(0);
pivotData.setName("PivotData");
var pivotReportIdx = workbook.getWorksheets().add("PivotTableReport");
var pivotReport = workbook.getWorksheets().get(pivotReportIdx);
var headers = ["Fruit", "Year", "Region", "Amount"];
for (var c = 0; c < headers.length; c++)
{
    pivotData.getCells().get(0, c).putValue(headers[c]);
}
var data = [
    ["Apple", 2022, "North", 150],
    ["Apple", 2023, "North", 180],
    ["Banana", 2022, "South", 120],
    ["Banana", 2023, "South", 140],
    ["Cherry", 2022, "East", 200],
    ["Cherry", 2023, "East", 220],
    ["Grape", 2022, "West", 90],
    ["Grape", 2023, "West", 110]
];
for (var r = 0; r < data.length; r++)
{
    for (var c = 0; c < data[r].length; c++)
    {
        pivotData.getCells().get(r + 1, c).putValue(data[r][c]);
    }
}
var idx = pivotReport.getPivotTables().add("PivotData!A1:D9", "A1", "PivotTable");
var pivotTable = pivotReport.getPivotTables().get(idx);
pivotTable.addFieldToArea(AsposeCells.PivotFieldType.Row, 0);
pivotTable.addFieldToArea(AsposeCells.PivotFieldType.Page, 1);
pivotTable.addFieldToArea(AsposeCells.PivotFieldType.Page, 2);
pivotTable.addFieldToArea(AsposeCells.PivotFieldType.Data, 3);
pivotTable.setPageFieldOrder(AsposeCells.PrintOrderType.DownThenOver);
pivotTable.setPageFieldWrapCount(2);
pivotTable.calculateData();
workbook.save("pageFieldLayout_downThenOver.xlsx");

Exempel 3: Flytta ett sidfält

I det tredje scenariot behåller vi denna datamängd och fälttilldelning, ställer in en neutral layout (OVER_THEN_DOWN med radbrytningsantal 2), och demonstrerar sedan operationen PageFields.Move. Anropet Move(0, 1) flyttar sidfältet vid index 0 (Year) till position 1, och sidfältet som var vid position 1 (Region) flyttas till position 0. Efter detta anrop är Region det första sidfältet och Year det andra. Radbrytning och ordningsläge är oförändrade, så remsan renderas fortfarande horisontellt sida vid sida — det är bara ordningen på de två rullgardinsmenyerna som har bytts ut.

const AsposeCells = require("aspose.cells");
const workbook = new AsposeCells.Workbook();
const dataSheet = workbook.getWorksheets().get(0);
dataSheet.setName("PivotData");
dataSheet.getCells().get("A1").putValue("Fruit");
dataSheet.getCells().get("B1").putValue("Year");
dataSheet.getCells().get("C1").putValue("Region");
dataSheet.getCells().get("D1").putValue("Amount");
dataSheet.getCells().get("A2").putValue("Apple");
dataSheet.getCells().get("B2").putValue(2022);
dataSheet.getCells().get("C2").putValue("North");
dataSheet.getCells().get("D2").putValue(150);
dataSheet.getCells().get("A3").putValue("Apple");
dataSheet.getCells().get("B3").putValue(2023);
dataSheet.getCells().get("C3").putValue("North");
dataSheet.getCells().get("D3").putValue(180);
dataSheet.getCells().get("A4").putValue("Banana");
dataSheet.getCells().get("B4").putValue(2022);
dataSheet.getCells().get("C4").putValue("South");
dataSheet.getCells().get("D4").putValue(120);
dataSheet.getCells().get("A5").putValue("Banana");
dataSheet.getCells().get("B5").putValue(2023);
dataSheet.getCells().get("C5").putValue("South");
dataSheet.getCells().get("D5").putValue(140);
dataSheet.getCells().get("A6").putValue("Cherry");
dataSheet.getCells().get("B6").putValue(2022);
dataSheet.getCells().get("C6").putValue("East");
dataSheet.getCells().get("D6").putValue(200);
dataSheet.getCells().get("A7").putValue("Cherry");
dataSheet.getCells().get("B7").putValue(2023);
dataSheet.getCells().get("C7").putValue("East");
dataSheet.getCells().get("D7").putValue(220);
dataSheet.getCells().get("A8").putValue("Grape");
dataSheet.getCells().get("B8").putValue(2022);
dataSheet.getCells().get("C8").putValue("West");
dataSheet.getCells().get("D8").putValue(90);
dataSheet.getCells().get("A9").putValue("Grape");
dataSheet.getCells().get("B9").putValue(2023);
dataSheet.getCells().get("C9").putValue("West");
dataSheet.getCells().get("D9").putValue(110);
const pivotSheetIdx = workbook.getWorksheets().add("PivotTableReport");
const pivotSheet = workbook.getWorksheets().get(pivotSheetIdx);
const pivotIdx = pivotSheet.getPivotTables().add("PivotData!A1:D9", "A3", "PivotTable");
const pivotTable = pivotSheet.getPivotTables().get(pivotIdx);
pivotTable.addFieldToArea(AsposeCells.Pivot.PivotFieldType.ROW, 0);
pivotTable.addFieldToArea(AsposeCells.Pivot.PivotFieldType.PAGE, 1);
pivotTable.addFieldToArea(AsposeCells.Pivot.PivotFieldType.PAGE, 2);
pivotTable.addFieldToArea(AsposeCells.Pivot.PivotFieldType.DATA, 3);
pivotTable.setPageFieldOrder(AsposeCells.PrintOrderType.OVER_THEN_DOWN);
pivotTable.setPageFieldWrapCount(2);
pivotTable.getPageFields().move(0, 1);
pivotTable.calculateData();
workbook.save("pageFieldLayout_move.xlsx");

Relaterade artiklar