首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java Excel API深度實戰:從入門到精通的完整指南

     編輯:Java 程式設計入門

Java Excel API全景實戰指南

在企業級應用開發中,Excel作為數據交換的通用格式,其重要性不言而喻。Java Excel API(JXL/Apache POI等)為Java開發者提供了強大的Excel操作能力。本文將深度解析Java Excel API的核心功能、最佳實踐、性能優化及常見坑點,助你快速構建高性能的Excel處理應用。

主流Java Excel庫對比

庫優點缺點適用場景
Apache POI功能最全、社區活躍、支援.xls/.xlsx記憶體佔用大、API複雜企業級應用、複雜報表
JXL輕量、API簡單、支援.xls不支援.xlsx、不再維護簡單.xls處理、舊項目維護
EasyExcel記憶體優化、流式讀寫、易用功能相對較少大數據導入導出、Web導出
FastExcel極速、低記憶體、現代API生態較新高性能場景

核心操作實戰:以Apache POI為例

環境依賴

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version>
</dependency>

核心操作實戰

創建工作簿

// 創建.xlsx (XSSF)
Workbook workbook = new XSSFWorkbook();

// 創建.xls (HSSF)
Workbook workbook = new HSSFWorkbook();

// 從文件/流讀取
Workbook workbook = WorkbookFactory.create(new FileInputStream("file.xlsx"));

Sheet操作


// 創建/獲取Sheet
Sheet sheet = workbook.createSheet("Sheet1");
Sheet sheet = workbook.getSheet("Sheet1");
Sheet sheet = workbook.getSheetAt(0);

// 設置列寬
sheet.setColumnWidth(0, 20 * 256); // 20字符寬度

// 凍結窗格
sheet.createFreezePane(0, 1, 0, 1); // 凍結首行

行/列/單元格操作


// 創建行
Row row = sheet.createRow(rowIndex);

// 創建單元格
Cell cell = row.createCell(colIndex);

// 設置值
cell.setCellValue("文本");
cell.setCellValue(123.45);
cell.setCellValue(true);
cell.setCellValue(new Date());
cell.setCellValue(richTextString);
cell.setCellFormula("SUM(A1:A10)");

// 獲取值
String str = cell.getStringCellValue();
double num = cell.getNumericCellValue();
Date date = cell.getDateCellValue();
boolean bool = cell.getBooleanCellValue();

樣式設置


CellStyle style = workbook.createCellStyle();

// 字體
Font font = workbook.createFont();
font.setBold(true);
font.setFontHeightInPoints((short)12);
font.setColor(IndexedColors.RED.index);
style.setFont(font);

// 對齊
style.setAlignment(HorizontalAlignment.CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER);

// 邊框
style.setBorderTop(BorderStyle.THIN);
style.setTopBorderColor(IndexedColors.BLACK.index);

// 背景色
style.setFillForegroundColor(IndexedColors.YELLOW.index);
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);

// 數據格式
DataFormat format = workbook.createDataFormat();
style.setDataFormat(format.getFormat("#,##0.00"));

// 應用樣式
cell.setCellStyle(style);

合併單元格


// 合併區域
CellRangeAddress region = new CellRangeAddress(firstRow, lastRow, firstCol, lastCol);
sheet.addMergedRegion(region);

// 設置合併區域樣式需單獨設置每個單元格

公式計算


// 設置公式
cell.setCellFormula("SUM(A1:A10)");

// 強制重新計算
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
evaluator.evaluateFormulaCell(cell);

// 或評估整個工作簿
evaluator.evaluateAll();

圖表生成


// 創建圖表
Drawing drawing = sheet.createDrawingPatriarch();
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 0, 10, 20);
Chart chart = drawing.createChart(anchor);
ChartLegend legend = chart.getOrCreateLegend();
legend.setPosition(LegendPosition.BOTTOM_RIGHT);

// 數據源
ChartDataFactory dataFactory = chart.getChartDataFactory();
ChartDataSource<Number> xs = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(1, 10, 0, 0));
ChartDataSource<Number> ys = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(1, 10, 1, 1));

LineChartData data = dataFactory.createLineChartData();
data.addSeries(xs, ys);
chart.plot(data);

數據驗證


DataValidationHelper helper = sheet.getDataValidationHelper();

// 下拉列表
DataValidationConstraint constraint = helper.createExplicitListConstraint(new String[]{"選項1", "選項2", "選項3"});
DataValidation validation = helper.createValidation(constraint, new CellRangeAddressList(1, 10, 0, 0));
validation.setShowErrorBox(true);
validation.createErrorBox("錯誤", "請選擇有效選項");
sheet.addValidationData(validation);

// 數字範圍
DataValidationConstraint numConstraint = helper.createNumericConstraint(
    DataValidationConstraint.OperatorType.BETWEEN, "1", "100");

流式讀寫(大文件處理)


// SXSSF - 流式寫入大文件
SXSSFWorkbook workbook = new SXSSFWorkbook(100); // 保持100行在內存
Sheet sheet = workbook.createSheet();
for (int i = 0; i < 100000; i++) {
    Row row = sheet.createRow(i);
    row.createCell(0).setCellValue("Row " + i);
}
workbook.write(outputStream);
workbook.dispose(); // 釋放臨時文件

流式讀取(大文件讀取)


// XSSF事件驅動讀取
OPCPackage pkg = OPCPackage.open("large.xlsx");
XSSFReader reader = new XSSFReader(pkg);
SharedStringsTable sst = reader.getSharedStringsTable();
XMLReader parser = XMLReaderFactory.createXMLReader();
parser.setContentHandler(new SheetHandler(sst));
parser.parse(new InputSource(reader.getSheet("rId1").getInputStream()));

樣式優化最佳實踐

  • 樣式復用:創建樣式對象後復用,避免重複創建
  • 使用CellStyle而非HSSFCellStyle/XSSFCellStyle
  • 字體對象復用:Font font = workbook.createFont()
  • 批量設置樣式:row.setRowStyle(style)(POI 5.0+)

性能優化清單

  • 使用SXSSF處理大文件寫入(>10萬行)
  • 使用事件驅動API讀取大文件
  • 合理設置SXSSFWorkbook窗口大小
  • 及時調用workbook.dispose()釋放臨時文件
  • 批量操作優於單元格級操作
  • 避免重複創建CellStyle/Font對象

常見問題排查

問題原因解決方案
OOM大文件全量加載使用SXSSF/事件驅動API
日期顯示異常格式未設置設置DataFormat
公式不計算未調用evaluate調用FormulaEvaluator
中文亂碼字體不支持設置支持中文的字體
文件打開報錯流未關閉確保workbook.close()/dispose()

最佳實踐總結

  • 選擇合適的庫:POI功能全、JXL輕量、EasyExcel大文件
  • 樣式復用,避免重複創建CellStyle/Font
  • 大文件使用SXSSF/事件驅動API
  • 及時關閉Workbook/InputStream
  • 公式計算需顯式調用evaluate
  • 設置合適的字體支持中文
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved