Creazione di grafici dinamici

Utilizzo delle tabelle di Excel

I ListObjects forniscono la funzionalità integrata per ordinare e filtrare i dati tramite l’interazione dell’utente. Entrambe le opzioni di ordinamento e filtraggio sono fornite tramite gli elenchi a discesa che vengono aggiunti automaticamente alla riga dell’intestazione del ListObject. Grazie a queste funzionalità (ordinamento e filtraggio), il ListObject sembra essere il candidato perfetto per servire come fonte di dati per un grafico dinamico perché quando viene modificato l’ordinamento o il filtraggio, la rappresentazione dei dati nel grafico verrà cambiata per riflettere lo stato attuale del ListObject.

Al fine di mantenere la dimostrazione semplice da comprendere, creeremo il Workbook da zero e procederemo passo dopo passo come indicato di seguito.

  1. Creare un documento di lavoro vuoto.
  2. Accedere alle celle del primo foglio di lavoro nel documento di lavoro.
  3. Inserire alcuni dati nelle celle.
  4. Creare ListObject basato sui dati inseriti.
  5. Creare un grafico basato sull’intervallo di dati di ListObject.
  6. Salvare il risultato su disco.
// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java
// The path to the documents directory.
String dataDir = Utils.getDataDir(UsingExcelTables.class);
// Create an instance of Workbook
Workbook book = new Workbook();
// Access first worksheet from the collection
Worksheet sheet = book.getWorksheets().get(0);
// Access cells collection of the first worksheet
Cells cells = sheet.getCells();
// Insert data column wise
cells.get("A1").putValue("Category");
cells.get("A2").putValue("Fruit");
cells.get("A3").putValue("Fruit");
cells.get("A4").putValue("Fruit");
cells.get("A5").putValue("Fruit");
cells.get("A6").putValue("Vegetables");
cells.get("A7").putValue("Vegetables");
cells.get("A8").putValue("Vegetables");
cells.get("A9").putValue("Vegetables");
cells.get("A10").putValue("Beverages");
cells.get("A11").putValue("Beverages");
cells.get("A12").putValue("Beverages");
cells.get("B1").putValue("Food");
cells.get("B2").putValue("Apple");
cells.get("B3").putValue("Banana");
cells.get("B4").putValue("Apricot");
cells.get("B5").putValue("Grapes");
cells.get("B6").putValue("Carrot");
cells.get("B7").putValue("Onion");
cells.get("B8").putValue("Cabage");
cells.get("B9").putValue("Potatoe");
cells.get("B10").putValue("Coke");
cells.get("B11").putValue("Coladas");
cells.get("B12").putValue("Fizz");
cells.get("C1").putValue("Cost");
cells.get("C2").putValue(2.2);
cells.get("C3").putValue(3.1);
cells.get("C4").putValue(4.1);
cells.get("C5").putValue(5.1);
cells.get("C6").putValue(4.4);
cells.get("C7").putValue(5.4);
cells.get("C8").putValue(6.5);
cells.get("C9").putValue(5.3);
cells.get("C10").putValue(3.2);
cells.get("C11").putValue(3.6);
cells.get("C12").putValue(5.2);
cells.get("D1").putValue("Profit");
cells.get("D2").putValue(0.1);
cells.get("D3").putValue(0.4);
cells.get("D4").putValue(0.5);
cells.get("D5").putValue(0.6);
cells.get("D6").putValue(0.7);
cells.get("D7").putValue(1.3);
cells.get("D8").putValue(0.8);
cells.get("D9").putValue(1.3);
cells.get("D10").putValue(2.2);
cells.get("D11").putValue(2.4);
cells.get("D12").putValue(3.3);
// Create ListObject. Get the List objects collection in the first worksheet
ListObjectCollection listObjects = sheet.getListObjects();
// Add a List based on the data source range with headers on
int index = listObjects.add(0, 0, 11, 3, true);
sheet.autoFitColumns();
// Create chart based on ListObject
index = sheet.getCharts().add(ChartType.COLUMN, 21, 1, 35, 18);
Chart chart = sheet.getCharts().get(index);
chart.setChartDataRange("A1:D12", true);
chart.getNSeries().setCategoryData("A2:B12");
// Calculate chart
chart.calculate();
// Save spreadsheet
book.save(dataDir + "output.xlsx");

Utilizzo di Formule Dinamiche

Nel caso in cui non si desideri utilizzare i ListObjects come origine dei dati per il grafico dinamico, l’altra opzione è utilizzare le funzioni Excel (o formule) per creare un intervallo dinamico di dati e un controllo (come ComboBox) per attivare la modifica dei dati. In questo scenario, useremo la funzione VLOOKUP per recuperare i valori appropriati in base alla selezione di ComboBox. Quando la selezione viene modificata, la funzione VLOOKUP aggiornerà il valore della cella. Se un intervallo di celle sta utilizzando la funzione VLOOKUP, l’intero intervallo può essere aggiornato tramite interazione dell’utente, quindi può essere utilizzato come origine per il grafico dinamico.

Al fine di mantenere la dimostrazione semplice da comprendere, creeremo il Workbook da zero e procederemo passo dopo passo come indicato di seguito.

  1. Creare un documento di lavoro vuoto.
  2. Accedere alle celle del primo foglio di lavoro nel documento di lavoro.
  3. Inserire alcuni dati nelle celle creando un Named Range. Questi dati serviranno come serie per il grafico dinamico.
  4. Creare ComboBox basato sul Named Range creato nel passo precedente.
  5. Inserire ulteriori dati nelle celle che serviranno come origine per la funzione VLOOKUP.
  6. Inserire la funzione VLOOKUP (con i parametri appropriati) in un intervallo di celle. Questo intervallo servirà come origine per il grafico dinamico.
  7. Creare un grafico basato sull’intervallo creato nel passo precedente.
  8. Salvare il risultato su disco.
// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java
// The path to the documents directory.
String dataDir = Utils.getDataDir(UsingDynamicFormulas.class);
// Create a workbook object
Workbook workbook = new Workbook();
// Get the first worksheet
Worksheet sheet = workbook.getWorksheets().get(0);
// Access cells collection of first worksheet
Cells cells = sheet.getCells();
// Create a range in the second worksheet
Range range = cells.createRange("C21", "C24");
// Name the range
range.setName("MyRange");
// Fill different cells with data in the range
range.get(0, 0).putValue("North");
range.get(1, 0).putValue("South");
range.get(2, 0).putValue("East");
range.get(3, 0).putValue("West");
ComboBox comboBox = (ComboBox) sheet.getShapes().addShape(MsoDrawingType.COMBO_BOX, 15, 0, 2, 0, 17, 64);
comboBox.setInputRange("=MyRange");
comboBox.setLinkedCell("=B16");
comboBox.setSelectedIndex(0);
Cell cell = cells.get("B16");
Style style = cell.getStyle();
style.getFont().setColor(Color.getWhite());
cell.setStyle(style);
cells.get("C16").setFormula("=INDEX(Sheet1!$C$21:$C$24,$B$16,1)");
// Put some data for chart source
// Data Headers
cells.get("D15").putValue("Jan");
cells.get("D20").putValue("Jan");
cells.get("E15").putValue("Feb");
cells.get("E20").putValue("Feb");
cells.get("F15").putValue("Mar");
cells.get("F20").putValue("Mar");
cells.get("G15").putValue("Apr");
cells.get("G20").putValue("Apr");
cells.get("H15").putValue("May");
cells.get("H20").putValue("May");
cells.get("I15").putValue("Jun");
cells.get("I20").putValue("Jun");
// Data
cells.get("D21").putValue(304);
cells.get("D22").putValue(402);
cells.get("D23").putValue(321);
cells.get("D24").putValue(123);
cells.get("E21").putValue(300);
cells.get("E22").putValue(500);
cells.get("E23").putValue(219);
cells.get("E24").putValue(422);
cells.get("F21").putValue(222);
cells.get("F22").putValue(331);
cells.get("F23").putValue(112);
cells.get("F24").putValue(350);
cells.get("G21").putValue(100);
cells.get("G22").putValue(200);
cells.get("G23").putValue(300);
cells.get("G24").putValue(400);
cells.get("H21").putValue(200);
cells.get("H22").putValue(300);
cells.get("H23").putValue(400);
cells.get("H24").putValue(500);
cells.get("I21").putValue(400);
cells.get("I22").putValue(200);
cells.get("I23").putValue(200);
cells.get("I24").putValue(100);
// Dynamically load data on selection of Dropdown value
cells.get("D16").setFormula("=IFERROR(VLOOKUP($C$16,$C$21:$I$24,2,FALSE),0)");
cells.get("E16").setFormula("=IFERROR(VLOOKUP($C$16,$C$21:$I$24,3,FALSE),0)");
cells.get("F16").setFormula("=IFERROR(VLOOKUP($C$16,$C$21:$I$24,4,FALSE),0)");
cells.get("G16").setFormula("=IFERROR(VLOOKUP($C$16,$C$21:$I$24,5,FALSE),0)");
cells.get("H16").setFormula("=IFERROR(VLOOKUP($C$16,$C$21:$I$24,6,FALSE),0)");
cells.get("I16").setFormula("=IFERROR(VLOOKUP($C$16,$C$21:$I$24,7,FALSE),0)");
// Create Chart
int index = sheet.getCharts().add(ChartType.COLUMN, 0, 3, 12, 9);
Chart chart = sheet.getCharts().get(index);
chart.getNSeries().add("='Sheet1'!$D$16:$I$16", false);
chart.getNSeries().get(0).setName("=C16");
chart.getNSeries().setCategoryData("=$D$15:$I$15");
// Save result on disc
workbook.save(dataDir + "output.xlsx");