摘要:本文由葡萄城技術團隊於部落格園原創並首發。轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。
前一段時間淘寶出了一個「淘寶人生」的模組,可以看從註冊淘寶賬號至今的消費記錄,仔細想了想,現在微信、淘寶這些APP好像都喜歡出這種記錄使用者的支付、消費情況的功能。不過這個顯示消費記錄的功能的確讓人覺得方便很多。這樣大家就可以隨時隨地的檢視以前的消費記錄,有時候需要查賬,翻一翻手機就能看見錢都去哪裡了,而且每一筆錢的流向都可以看得非常清楚。既然這個東西這麼好用,那可不可以我也搞一個類似的分析工具,這樣就可以用它來記錄生活中的點點滴滴。由於本人的工作性質,對Excel比較熟悉,首先想到的就是可不可以用一個表格視覺化工具來實現這個功能。
說幹就幹,先上網找了找了一些Excel中視覺化工具的樣式,看了看在Excel中比較流行就是圖表(柱形圖、條形圖等)和資料透檢視了。因為圖表是平時用的比較多的工具,所以在好奇心的驅使下,百度了一下「如何用程式碼在表格中搞一個資料透檢視」!
,瀏覽著看了看,發現有很多種語言都可以實現(Python、Java、JavaScript、.net等)。鑑於自己對Java語言比較熟悉,所以便繼續百度「如何用Java在Excel中搞一個資料透視表」。發現可以使用Apache POI庫來實現:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;
public class PivotTableExample {
public static void main(String[] args) throws IOException {
// 建立工作簿
Workbook workbook = new XSSFWorkbook();
// 建立工作表
Sheet sheet = workbook.createSheet("Data");
// 輸入資料
Row headingRow = sheet.createRow(0);
headingRow.createCell(0).setCellValue("Category");
headingRow.createCell(1).setCellValue("Value");
Row dataRow1 = sheet.createRow(1);
dataRow1.createCell(0).setCellValue("A");
dataRow1.createCell(1).setCellValue(10);
Row dataRow2 = sheet.createRow(2);
dataRow2.createCell(0).setCellValue("B");
dataRow2.createCell(1).setCellValue(20);
Row dataRow3 = sheet.createRow(3);
dataRow3.createCell(0).setCellValue("A");
dataRow3.createCell(1).setCellValue(15);
// 建立資料透視表
XSSFPivotTable pivotTable = ((XSSFSheet) sheet).createPivotTable(new AreaReference("A1:B3", SpreadsheetVersion.EXCEL2007), new CellReference("D5"));
// 設定行標籤
pivotTable.addRowLabel(0);
// 設定值欄位
pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 1, "Sum of Value");
// 儲存Excel檔案
FileOutputStream fileOut = new FileOutputStream("pivotTable.xlsx");
workbook.write(fileOut);
fileOut.close();
System.*out*.println("資料透視表已建立並儲存到檔案!");
}
}
除了使用Apache POI庫,還發現了一款商業軟體GcExcel,由於不太不瞭解這個東西,所以簡單的ChatGpt了一下GcExcel,
查完之後發現,和Apache POI庫類似,GcExcel同樣也是一個基於Java的表格操作庫,於是懷著好奇的心態,又百度了一下「Java實現GcExcel資料透視表」。找到了一個GcExcel的學習指南,裡面有一些原始碼和程式碼講解,根據裡面的入門教學自己寫了一個小的實現資料透視表的Demo(由於完整程式碼太長,只擷取了部分):
public class Main {
public static void main(String[] args){
Workbook workbook = new Workbook();
//建立一個WorkSheet的物件
IWorksheet worksheet = workbook.getWorksheets().get(0);
//-----------------------------設定資料值------------------------------
worksheet.getRange("B3:C7").setValue(new Object[][]{
{"ITEM", "AMOUNT"},
{"Income 1", 2500},
{"Income 2", 1000},
{"Income 3", 250},
{"Other", 250},
});
worksheet.getRange("B10:C23").setValue(new Object[][]{
{"ITEM", "AMOUNT"},
{"Rent/mortgage", 800},
{"Electric", 120},
{"Gas", 50},
{"Cell phone", 45},
{"Groceries", 500},
{"Car payment", 273},
{"Auto expenses", 120},
{"Student loans", 50},
{"Credit cards", 100},
{"Auto Insurance", 78},
{"Personal care", 50},
{"Entertainment", 100},
{"Miscellaneous", 50},
});
//合併單元格
worksheet.getRange("B2:C2").merge();
worksheet.getRange("B2").setValue("MONTHLY INCOME");
worksheet.getRange("B9:C9").merge();
worksheet.getRange("B9").setValue("MONTHLY EXPENSES");
worksheet.getRange("E2:G2").merge();
worksheet.getRange("E2").setValue("PERCENTAGE OF INCOME SPENT");
worksheet.getRange("E5:G5").merge();
worksheet.getRange("E5").setValue("SUMMARY");
worksheet.getRange("E3:F3").merge();
worksheet.getRange("E9").setValue("BALANCE");
worksheet.getRange("E6").setValue("Total Monthly Income");
worksheet.getRange("E7").setValue("Total Monthly Expenses");
//--------------------------------設定形狀--------------------------------
IShape shape = worksheet.getShapes().addChart(ChartType.*ColumnClustered*, 339, 247, 316.5, 346);
shape.getChart().getChartArea().getFormat().getLine().setTransparency(1);
shape.getChart().getColumnGroups().get(0).setOverlap(0);
shape.getChart().getColumnGroups().get(0).setGapWidth(37);
IAxis category_axis = shape.getChart().getAxes().item(AxisType.*Category*);
category_axis.getFormat().getLine().getColor().setRGB(Color.*GetBlack*());
category_axis.getTickLabels().getFont().setSize(11);
category_axis.getTickLabels().getFont().getColor().setRGB(Color.*GetBlack*());
IAxis series_axis = shape.getChart().getAxes().item(AxisType.*Value*);
series_axis.getFormat().getLine().setWeight(1);
series_axis.getFormat().getLine().getColor().setRGB(Color.*GetBlack*());
series_axis.getTickLabels().setNumberFormat("\$\#\#\#0");
series_axis.getTickLabels().getFont().setSize(11);
series_axis.getTickLabels().getFont().getColor().setRGB(Color.*GetBlack*());
ISeries chartSeries = shape.getChart().getSeriesCollection().newSeries();
chartSeries.setFormula("=SERIES(\"Simple Budget\",{"Income\","Expenses\"},'Sheet1'!$G$6:$G$7,1)");
chartSeries.getPoints().get(0).getFormat().getFill().getColor().setRGB(Color.*FromArgb*(176, 21, 19));
chartSeries.getPoints().get(1).getFormat().getFill().getColor().setRGB(Color.*FromArgb*(234, 99, 18));
chartSeries.getDataLabels().getFont().setSize(11);
chartSeries.getDataLabels().getFont().getColor().setRGB(Color.*GetBlack*());
chartSeries.getDataLabels().setShowValue(true);
chartSeries.getDataLabels().setPosition(DataLabelPosition.*OutsideEnd*);
workbook.save("tutorial.xlsx");
}
}
最終的Excel樣式:
通過以上的實驗,使用Apache POI和GcExcel都可以在Excel中實現資料透視表,您可以根據您專案或工程的需要選擇合適的方法。
擴充套件連結: