Java识别Excel的方法包括:Apache POI、JExcelApi、EasyExcel、Aspose Cells。其中最常用和推荐的是Apache POI,因为它功能强大、文档丰富且开源。下面将详细介绍如何使用Apache POI来处理Excel文件。
一、Apache POI简介
Apache POI是一个开源的Java库,专用于操作Microsoft Office文档。POI的全称是“Poor Obfuscation Implementation”,它可以读取和写入Excel、Word、PowerPoint等Office文件格式。POI库分为不同的模块,其中HSSF
用于处理Excel 97-2003文件(.xls),XSSF
用于处理Excel 2007及以后的文件(.xlsx)。
优点:
- 功能强大:支持读取和写入复杂的Excel文件,包括公式、图表、图片等。
- 开源免费:完全免费,可以自由使用和修改。
- 社区活跃:有丰富的文档和示例,社区支持活跃。
二、Apache POI的基本用法
1、导入POI依赖
在Maven项目中,可以通过添加以下依赖来引入Apache POI库:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.0.0</version>
</dependency>
2、读取Excel文件
以下是一个简单的示例代码,用于读取一个Excel文件:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class ExcelReader {
public static void main(String[] args) throws IOException {
FileInputStream file = new FileInputStream(new File("path_to_your_excel_file.xlsx"));
Workbook workbook = new XSSFWorkbook(file);
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
switch (cell.getCellType()) {
case STRING:
System.out.print(cell.getStringCellValue() + "t");
break;
case NUMERIC:
System.out.print(cell.getNumericCellValue() + "t");
break;
case BOOLEAN:
System.out.print(cell.getBooleanCellValue() + "t");
break;
default:
System.out.print("Unknown Cell Typet");
}
}
System.out.println();
}
workbook.close();
file.close();
}
}
3、写入Excel文件
以下是一个简单的示例代码,用于写入一个Excel文件:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class ExcelWriter {
public static void main(String[] args) throws IOException {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("Hello, World!");
FileOutputStream fileOut = new FileOutputStream(new File("path_to_your_excel_file.xlsx"));
workbook.write(fileOut);
fileOut.close();
workbook.close();
}
}
三、高级用法
1、处理公式
Apache POI不仅可以读取和写入基本的单元格数据,还可以处理Excel中的公式。以下是一个示例,展示如何在Excel中设置和计算公式:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class ExcelFormula {
public static void main(String[] args) throws IOException {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");
Row row = sheet.createRow(0);
Cell cell1 = row.createCell(0);
Cell cell2 = row.createCell(1);
Cell cell3 = row.createCell(2);
cell1.setCellValue(10);
cell2.setCellValue(20);
cell3.setCellFormula("A1+B1");
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
evaluator.evaluateFormulaCell(cell3);
FileOutputStream fileOut = new FileOutputStream(new File("path_to_your_excel_file.xlsx"));
workbook.write(fileOut);
fileOut.close();
workbook.close();
}
}
2、处理图表
Apache POI还支持在Excel中创建和操作图表。以下是一个示例,展示如何在Excel中创建一个简单的柱状图:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.charts.XSSFChart;
import org.apache.poi.xssf.usermodel.charts.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.charts.XSSFScatterChartData;
import org.apache.poi.xssf.usermodel.charts.XSSFScatterChartData.Series;
import org.apache.poi.xssf.usermodel.charts.XSSFValueAxis;
import org.apache.poi.xssf.usermodel.charts.XSSFValueAxis.Position;
import org.apache.poi.xssf.usermodel.charts.XSSFValueAxis.CrossBetween;
import org.apache.poi.xssf.usermodel.drawing.XSSFDrawing;
import org.apache.poi.xssf.usermodel.drawing.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.charts.XSSFChartLegend;
import org.apache.poi.xssf.usermodel.charts.XSSFChartLegend.LegendPosition;
import org.apache.poi.ss.usermodel.charts.ChartLegend;
import org.apache.poi.ss.usermodel.charts.ChartDataFactory;
import org.apache.poi.ss.usermodel.charts.ChartDataSource;
import org.apache.poi.ss.usermodel.charts.ChartAxisFactory;
import org.apache.poi.ss.usermodel.charts.ChartData;
import org.apache.poi.ss.usermodel.charts.ChartAxis;
import org.apache.poi.ss.usermodel.charts.ChartLegend;
import org.apache.poi.ss.usermodel.charts.ChartDataSource;
import org.apache.poi.ss.usermodel.charts.ChartDataFactory;
import org.apache.poi.ss.usermodel.charts.ChartType;
import org.apache.poi.ss.usermodel.charts.ChartAxis;
import org.apache.poi.ss.usermodel.charts.ChartAxisFactory;
import org.apache.poi.ss.usermodel.charts.ValueAxis;
import org.apache.poi.ss.usermodel.charts.CategoryAxis;
import org.apache.poi.ss.usermodel.charts.ChartLegend;
import org.apache.poi.ss.usermodel.charts.ChartData;
import org.apache.poi.ss.usermodel.charts.ScatterChartData;
import org.apache.poi.ss.usermodel.charts.ChartDataFactory;
import org.apache.poi.ss.usermodel.charts.ChartDataSource;
import org.apache.poi.ss.usermodel.charts.ChartAxis;
import org.apache.poi.ss.usermodel.charts.ChartAxisFactory;
import org.apache.poi.ss.usermodel.charts.ScatterChartSeries;
import org.apache.poi.ss.usermodel.charts.ValueAxis;
import org.apache.poi.ss.usermodel.charts.CategoryAxis;
import org.apache.poi.ss.usermodel.drawing.ClientAnchor;
import org.apache.poi.ss.usermodel.drawing.Drawing;
import org.apache.poi.ss.usermodel.drawing.ClientAnchor.AnchorType;
import java.io.FileOutputStream;
import java.io.IOException;
public class ExcelChart {
public static void main(String[] args) throws IOException {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");
// Create data for the chart
for (int rowNum = 0; rowNum < 10; rowNum++) {
Row row = sheet.createRow(rowNum);
for (int colNum = 0; colNum < 2; colNum++) {
Cell cell = row.createCell(colNum);
cell.setCellValue((rowNum + 1) * (colNum + 1));
}
}
// Create drawing and anchor for the chart
Drawing<?> drawing = sheet.createDrawingPatriarch();
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 3, 1, 8, 10);
// Create the chart
XSSFChart chart = (XSSFChart) drawing.createChart(anchor);
ChartLegend legend = chart.getOrCreateLegend();
legend.setPosition(LegendPosition.RIGHT);
// Create data for the chart
ChartDataFactory dataFactory = chart.getChartDataFactory();
ChartAxisFactory axisFactory = chart.getChartAxisFactory();
ChartDataSource<Number> xs = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(0, 9, 0, 0));
ChartDataSource<Number> ys = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(0, 9, 1, 1));
ScatterChartData data = dataFactory.createScatterChartData();
ScatterChartSeries series = data.addSerie(xs, ys);
series.setTitle("Sample Data");
chart.plot(data);
// Create axes for the chart
ValueAxis xAxis = axisFactory.createValueAxis(AxisPosition.BOTTOM);
ValueAxis yAxis = axisFactory.createValueAxis(AxisPosition.LEFT);
yAxis.setCrossBetween(CrossBetween.BETWEEN);
// Save the workbook
FileOutputStream fileOut = new FileOutputStream("path_to_your_excel_file.xlsx");
workbook.write(fileOut);
fileOut.close();
workbook.close();
}
}
四、处理大数据量的Excel文件
当处理大数据量的Excel文件时,传统的方法可能会导致内存不足的问题。为了解决这个问题,可以使用Apache POI的SXSSF
(Streaming Usermodel API)模式。SXSSF
允许在处理较大的.xlsx文件时使用较少的内存,适合写入大数据量的Excel文件。以下是一个示例:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class LargeExcelFileWriter {
public static void main(String[] args) throws IOException {
SXSSFWorkbook workbook = new SXSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");
for (int rowNum = 0; rowNum < 100000; rowNum++) {
Row row = sheet.createRow(rowNum);
for (int colNum = 0; colNum < 10; colNum++) {
Cell cell = row.createCell(colNum);
cell.setCellValue("Cell " + rowNum + "," + colNum);
}
}
FileOutputStream fileOut = new FileOutputStream("large_excel_file.xlsx");
workbook.write(fileOut);
fileOut.close();
workbook.dispose();
}
}
五、处理不同格式的Excel文件
1、处理.xls文件
对于Excel 97-2003格式的文件(.xls),需要使用Apache POI的HSSF
模块。以下是一个示例,展示如何读取一个.xls文件:
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import java.io.FileInputStream;
import java.io.IOException;
public class XLSReader {
public static void main(String[] args) throws IOException {
FileInputStream file = new FileInputStream("path_to_your_excel_file.xls");
Workbook workbook = new HSSFWorkbook(file);
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
switch (cell.getCellType()) {
case STRING:
System.out.print(cell.getStringCellValue() + "t");
break;
case NUMERIC:
System.out.print(cell.getNumericCellValue() + "t");
break;
case BOOLEAN:
System.out.print(cell.getBooleanCellValue() + "t");
break;
default:
System.out.print("Unknown Cell Typet");
}
}
System.out.println();
}
workbook.close();
file.close();
}
}
2、处理.xlsx文件
对于Excel 2007及以后的格式文件(.xlsx),需要使用Apache POI的XSSF
模块。以下是一个示例,展示如何读取一个.xlsx文件:
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import java.io.FileInputStream;
import java.io.IOException;
public class XLSXReader {
public static void main(String[] args) throws IOException {
FileInputStream file = new FileInputStream("path_to_your_excel_file.xlsx");
Workbook workbook = new XSSFWorkbook(file);
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
switch (cell.getCellType()) {
case STRING:
System.out.print(cell.getStringCellValue() + "t");
break;
case NUMERIC:
System.out.print(cell.getNumericCellValue() + "t");
break;
case BOOLEAN:
System.out.print(cell.getBooleanCellValue() + "t");
break;
default:
System.out.print("Unknown Cell Typet");
}
}
System.out.println();
}
workbook.close();
file.close();
}
}
六、总结
在Java中识别和处理Excel文件可以通过多种方式实现,但Apache POI是最常用的工具。它支持读取和写入Excel文件的各种操作,包括处理公式、图表以及大数据量文件。通过上述的示例代码,可以看到Apache POI的强大功能和灵活性,使得处理Excel文件变得简单而高效。无论是初学者还是经验丰富的开发者,都可以轻松上手并利用这个工具提升工作效率。
相关问答FAQs:
1. 什么是Java中的异常(Exception)?
Java中的异常(Exception)是指在程序运行过程中可能发生的错误或异常情况。它们可以分为受检异常(checked exception)和非受检异常(unchecked exception)两种类型。
2. Java中如何识别异常(Exception)?
在Java中,异常通常通过try-catch语句块来进行识别和处理。你可以将可能抛出异常的代码放在try块中,然后使用catch块来捕获和处理异常。
3. 如何处理Java中的异常(Exception)?
当Java程序抛出异常时,你可以使用try-catch块来捕获和处理异常。在catch块中,你可以编写代码来处理异常情况,比如打印错误信息或采取其他适当的措施来处理异常。同时,你也可以选择使用throws关键字将异常向上抛出,让调用者处理异常。
原创文章,作者:Edit2,如若转载,请注明出处:https://docs.pingcode.com/baike/416359