如何用Java操控Excel
使用Java操控Excel的方法有:Apache POI、JExcelApi、Aspose.Cells。 本文将重点介绍 Apache POI,因为它是目前最流行的开源库之一,功能强大且不断更新。Apache POI 可以处理 Microsoft 的 OLE2 文档格式,包括 Excel 工作簿(.xls 和 .xlsx 格式)。接下来,我们将详细介绍如何使用 Apache POI 来创建、读取和修改 Excel 文件。
一、Apache POI 简介
Apache POI 是一个开源库,专门用于处理 Microsoft Office 文档。它由多个组件组成,主要包括:
- HSSF (Horrible Spreadsheet Format):用于处理 Excel 97-2003 文件(.xls 格式)。
- XSSF (XML Spreadsheet Format):用于处理 Excel 2007 及以后的文件(.xlsx 格式)。
- HWPF (Horrible Word Processor Format):用于处理 Word 97-2003 文件(.doc 格式)。
- XWPF (XML Word Processor Format):用于处理 Word 2007 及以后的文件(.docx 格式)。
- HSLF (Horrible Slide Layout Format):用于处理 PowerPoint 97-2003 文件(.ppt 格式)。
- XSLF (XML Slide Layout Format):用于处理 PowerPoint 2007 及以后的文件(.pptx 格式)。
本文将主要集中在 HSSF 和 XSSF 上,讲解如何使用这两个组件来操控 Excel 文件。
二、环境准备
在开始之前,需要确保已经配置好开发环境。以下是所需的步骤:
-
下载并添加 Apache POI 依赖:如果使用 Maven,可以在
pom.xml
文件中添加以下依赖:<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
</dependency>
-
导入相关包:在 Java 类中导入需要使用的 Apache POI 包,例如:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.io.*;
三、创建 Excel 文件
1. 创建一个简单的 Excel 文件
创建一个简单的 Excel 文件非常容易。以下是一个基本的示例代码:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class CreateExcel {
public static void main(String[] args) {
Workbook workbook = new XSSFWorkbook(); // 创建一个工作簿
Sheet sheet = workbook.createSheet("Sheet1"); // 创建一个工作表
Row row = sheet.createRow(0); // 创建一行
Cell cell = row.createCell(0); // 创建一个单元格
cell.setCellValue("Hello, Excel!"); // 设置单元格内容
try (FileOutputStream fileOut = new FileOutputStream("example.xlsx")) {
workbook.write(fileOut); // 将工作簿写入文件
} catch (IOException e) {
e.printStackTrace();
}
try {
workbook.close(); // 关闭工作簿
} catch (IOException e) {
e.printStackTrace();
}
}
}
四、读取 Excel 文件
1. 读取一个简单的 Excel 文件
要读取一个 Excel 文件,可以使用以下代码:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.IOException;
public class ReadExcel {
public static void main(String[] args) {
try (FileInputStream fileIn = new FileInputStream("example.xlsx")) {
Workbook workbook = new XSSFWorkbook(fileIn); // 打开工作簿
Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表
Row row = sheet.getRow(0); // 获取第一行
Cell cell = row.getCell(0); // 获取第一个单元格
System.out.println(cell.getStringCellValue()); // 输出单元格内容
workbook.close(); // 关闭工作簿
} catch (IOException e) {
e.printStackTrace();
}
}
}
五、修改 Excel 文件
1. 修改现有的 Excel 文件
以下是一个修改 Excel 文件的示例代码:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ModifyExcel {
public static void main(String[] args) {
try (FileInputStream fileIn = new FileInputStream("example.xlsx")) {
Workbook workbook = new XSSFWorkbook(fileIn); // 打开工作簿
Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表
Row row = sheet.getRow(0); // 获取第一行
Cell cell = row.getCell(0); // 获取第一个单元格
cell.setCellValue("Hello, Modified Excel!"); // 修改单元格内容
try (FileOutputStream fileOut = new FileOutputStream("example.xlsx")) {
workbook.write(fileOut); // 将修改后的工作簿写入文件
}
workbook.close(); // 关闭工作簿
} catch (IOException e) {
e.printStackTrace();
}
}
}
六、处理复杂的 Excel 操作
1. 创建多张工作表
可以使用以下代码创建一个包含多张工作表的 Excel 文件:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class CreateMultiSheetExcel {
public static void main(String[] args) {
Workbook workbook = new XSSFWorkbook(); // 创建一个工作簿
Sheet sheet1 = workbook.createSheet("Sheet1"); // 创建第一张工作表
Sheet sheet2 = workbook.createSheet("Sheet2"); // 创建第二张工作表
Row row1 = sheet1.createRow(0); // 创建第一张工作表的第一行
Cell cell1 = row1.createCell(0); // 创建单元格
cell1.setCellValue("Sheet1, Cell1");
Row row2 = sheet2.createRow(0); // 创建第二张工作表的第一行
Cell cell2 = row2.createCell(0); // 创建单元格
cell2.setCellValue("Sheet2, Cell1");
try (FileOutputStream fileOut = new FileOutputStream("multi_sheet.xlsx")) {
workbook.write(fileOut); // 将工作簿写入文件
} catch (IOException e) {
e.printStackTrace();
}
try {
workbook.close(); // 关闭工作簿
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. 设置单元格样式
可以通过以下代码设置单元格样式,如字体、颜色和对齐方式等:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class SetCellStyle {
public static void main(String[] args) {
Workbook workbook = new XSSFWorkbook(); // 创建一个工作簿
Sheet sheet = workbook.createSheet("Sheet1"); // 创建一个工作表
Row row = sheet.createRow(0); // 创建一行
Cell cell = row.createCell(0); // 创建一个单元格
cell.setCellValue("Styled Cell");
CellStyle cellStyle = workbook.createCellStyle(); // 创建单元格样式
Font font = workbook.createFont(); // 创建字体
font.setBold(true); // 设置字体加粗
font.setColor(IndexedColors.RED.getIndex()); // 设置字体颜色
cellStyle.setFont(font); // 将字体应用到单元格样式
cellStyle.setAlignment(HorizontalAlignment.CENTER); // 设置水平对齐
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 设置垂直对齐
cell.setCellStyle(cellStyle); // 将样式应用到单元格
try (FileOutputStream fileOut = new FileOutputStream("styled_cell.xlsx")) {
workbook.write(fileOut); // 将工作簿写入文件
} catch (IOException e) {
e.printStackTrace();
}
try {
workbook.close(); // 关闭工作簿
} catch (IOException e) {
e.printStackTrace();
}
}
}
七、处理大数据量的 Excel 文件
处理大数据量的 Excel 文件时,需要特别注意内存的使用。以下是一些优化技巧:
1. 使用 SXSSF 处理大数据量的 .xlsx 文件
SXSSF (Streaming Usermodel API) 是 Apache POI 提供的一个 API,用于处理大数据量的 .xlsx 文件。它以流的方式写入数据,减少内存占用。
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class HandleLargeData {
public static void main(String[] args) {
SXSSFWorkbook workbook = new SXSSFWorkbook(); // 使用 SXSSFWorkbook 创建工作簿
Sheet sheet = workbook.createSheet("Sheet1"); // 创建一个工作表
for (int rowNum = 0; rowNum < 100000; rowNum++) { // 创建 100000 行数据
Row row = sheet.createRow(rowNum);
for (int cellNum = 0; cellNum < 10; cellNum++) { // 每行创建 10 个单元格
Cell cell = row.createCell(cellNum);
cell.setCellValue("Row " + rowNum + ", Cell " + cellNum);
}
}
try (FileOutputStream fileOut = new FileOutputStream("large_data.xlsx")) {
workbook.write(fileOut); // 将工作簿写入文件
} catch (IOException e) {
e.printStackTrace();
}
workbook.dispose(); // 释放内存
}
}
2. 使用流读取大数据量的 .xlsx 文件
import org.apache.poi.xssf.eventusermodel.XSSFReader;
import org.apache.poi.xssf.model.SharedStringsTable;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
import java.io.InputStream;
import java.util.Iterator;
public class ReadLargeData {
public static void main(String[] args) throws Exception {
try (InputStream fileIn = new FileInputStream("large_data.xlsx")) {
XSSFReader reader = new XSSFReader(OPCPackage.open(fileIn));
SharedStringsTable sst = reader.getSharedStringsTable();
XMLReader parser = XMLReaderFactory.createXMLReader();
ContentHandler handler = new SheetHandler(sst);
parser.setContentHandler(handler);
Iterator<InputStream> sheets = reader.getSheetsData();
while (sheets.hasNext()) {
InputStream sheet = sheets.next();
InputSource sheetSource = new InputSource(sheet);
parser.parse(sheetSource);
sheet.close();
}
}
}
private static class SheetHandler extends DefaultHandler {
private SharedStringsTable sst;
private String lastContents;
private boolean nextIsString;
private SheetHandler(SharedStringsTable sst) {
this.sst = sst;
}
public void startElement(String uri, String localName, String name, Attributes attributes) {
if (name.equals("c")) {
String cellType = attributes.getValue("t");
nextIsString = cellType != null && cellType.equals("s");
}
lastContents = "";
}
public void endElement(String uri, String localName, String name) {
if (nextIsString && name.equals("v")) {
int idx = Integer.parseInt(lastContents);
lastContents = new XSSFRichTextString(sst.getEntryAt(idx)).toString();
nextIsString = false;
}
if (name.equals("v")) {
System.out.println(lastContents);
}
}
public void characters(char[] ch, int start, int length) {
lastContents += new String(ch, start, length);
}
}
}
八、总结
本文详细介绍了如何使用 Java 操控 Excel 文件,主要使用了 Apache POI 库。我们讲解了如何创建、读取和修改 Excel 文件,如何处理复杂的 Excel 操作,以及如何优化内存以处理大数据量的 Excel 文件。通过这些示例代码,相信您已经掌握了基本的操作技巧,可以在实际项目中灵活应用这些知识。Apache POI 是一个功能强大的工具,建议进一步深入学习官方文档,以便更好地利用其丰富的功能。
相关问答FAQs:
1. 用Java如何打开一个Excel文件?
可以使用Apache POI库来实现Java操控Excel文件。首先,你需要添加POI库的依赖,然后使用POI的Workbook
类来打开Excel文件。你可以使用WorkbookFactory
类的create
方法来打开一个Excel文件,例如:
import org.apache.poi.ss.usermodel.*;
try {
Workbook workbook = WorkbookFactory.create(new File("path/to/your/excel.xlsx"));
// 接下来可以对workbook进行操作,如读取或写入数据
} catch (IOException e) {
e.printStackTrace();
}
2. 如何读取Excel文件中的数据?
一旦你成功打开了Excel文件,你可以使用POI的Sheet
和Row
类来读取数据。首先,你需要获取要读取的Sheet,然后遍历每一行,获取每一行的单元格数据。例如:
Sheet sheet = workbook.getSheetAt(0); // 获取第一个Sheet
for (Row row : sheet) {
for (Cell cell : row) {
String cellValue = cell.getStringCellValue();
// 对每个单元格的数据进行处理
}
}
3. 如何向Excel文件中写入数据?
要向Excel文件中写入数据,你需要创建一个新的Sheet
对象并创建Row
和Cell
,然后设置单元格的值。最后,将更改保存到文件中。例如:
Sheet sheet = workbook.createSheet("Sheet1"); // 创建一个名为Sheet1的Sheet
Row row = sheet.createRow(0); // 创建第一行
Cell cell = row.createCell(0); // 创建第一个单元格
cell.setCellValue("Hello, World!"); // 设置单元格的值
// 保存更改到文件中
try (FileOutputStream outputStream = new FileOutputStream("path/to/your/excel.xlsx")) {
workbook.write(outputStream);
} catch (IOException e) {
e.printStackTrace();
}
这些是使用Java操控Excel的基本步骤,你可以根据具体需求进一步扩展和优化代码。
原创文章,作者:Edit1,如若转载,请注明出处:https://docs.pingcode.com/baike/386110