在使用 Apache POI 处理 Excel 2003 格式(即 .xls 二进制格式)时,你需要使用 HSSF 接口。
以下是关于使用 POI 操作 Excel 2003 文件的核心要点、代码示例和注意事项:
核心类对应关系
| 概念 | Excel 2003 (.xls) | Excel 2007+ (.xlsx) |
|---|---|---|
| 工作簿 | HSSFWorkbook |
XSSFWorkbook |
| 工作表 | HSSFSheet |
XSSFSheet |
| 行 | HSSFRow |
XSSFRow |
| 单元格 | HSSFCell |
XSSFCell |
| 样式 | HSSFCellStyle |
XSSFCellStyle |
注意:
HSSF代表 “Horrible SpreadSheet Format”,是 POI 中较老的技术实现,基于二进制格式。
Maven 依赖
确保你引入了正确的 POI 依赖:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version> <!-- 请使用最新稳定版 -->
</dependency>
如果你需要处理 Excel 2007+ 格式,还需要引入
poi-ooxml,但对于纯 2003 格式,只需poi即可。
完整代码示例
✅ 示例 1:创建并写入 Excel 2003 文件
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.;
import java.io.FileOutputStream;
import java.io.IOException;
public class Excel2003Writer {
public static void main(String[] args) {
// 1. 创建工作簿 (HSSFWorkbook 对应 .xls)
Workbook workbook = new HSSFWorkbook();
// 2. 创建工作表
Sheet sheet = workbook.createSheet("测试Sheet");
// 3. 创建行 (索引从0开始)
Row row = sheet.createRow(0);
// 4. 创建单元格并设置值
Cell cell = row.createCell(0);
cell.setCellValue("Hello Excel 2003");
// 5. 设置单元格样式(可选)
CellStyle style = workbook.createCellStyle();
Font font = workbook.createFont();
font.setBold(true);
font.setColor(IndexedColors.RED.getIndex());
style.setFont(font);
cell.setCellStyle(style);
// 6. 写入文件
try (FileOutputStream outputStream = new FileOutputStream("output_2003.xls")) {
workbook.write(outputStream);
System.out.println("Excel 2003 文件创建成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
✅ 示例 2:读取 Excel 2003 文件
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.; import java.io.FileInputStream; import java.io.IOException; public class Excel2003Reader { public static void main(String[] args) { String filePath = "output_2003.xls"; try (FileInputStream fis = new FileInputStream(filePath); Workbook workbook = new HSSFWorkbook(fis)) { // 使用 HSSFWorkbook 读取 .xls Sheet sheet = workbook.getSheetAt(0); Row row = sheet.getRow(0); Cell cell = row.getCell(0); // 获取单元格值 if (cell != null) { switch (cell.getCellType()) { case STRING: System.out.println("单元格值: " + cell.getStringCellValue()); break; case NUMERIC: System.out.println("单元格值: " + cell.getNumericCellValue()); break; default: System.out.println("未知类型"); } } } catch (IOException e) { e.printStackTrace(); } } }
重要限制与注意事项
⚠️ 行数限制
- Excel 2003 (.xls):最多支持 65,536 行 和 256 列。
- 如果数据量超过此限制,必须使用 Excel 2007+ 格式(
.xlsx),它支持 104 万行以上。
⚠️ 性能问题
HSSFWorkbook将整个文件加载到内存中,对于大文件(即使未超行数限制)可能导致 OutOfMemoryError。- 如果处理大文件,建议使用
SXSSFWorkbook(针对 .xlsx)或考虑流式读取(但 HSSF 本身不支持流式读取,这是其设计缺陷)。
⚠️ 格式兼容性
HSSF不支持 Excel 2007+ 的新特性(如:图表、图片、宏、数据透视表等高级功能)。- 如果你需要写入图片、图表等,必须使用
XSSFWorkbook(.xlsx 格式)。
如何自动判断文件格式?
如果你不确定用户上传的文件是 .xls 还是 .xlsx,可以使用 WorkbookFactory 自动识别:
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import java.io.FileInputStream;
public class AutoDetectWorkbook {
public static void main(String[] args) throws Exception {
String filePath = "file.xls"; // 或 .xlsx
try (FileInputStream fis = new FileInputStream(filePath)) {
// 自动识别格式并创建对应的 Workbook 对象
Workbook workbook = WorkbookFactory.create(fis);
// 后续操作...
Sheet sheet = workbook.getSheetAt(0);
System.out.println("工作表名称: " + sheet.getSheetName());
workbook.close();
}
}
}
推荐:除非有特殊需求(如兼容极老系统),否则建议优先使用
.xlsx格式,因为它的功能更强大、性能更好、更稳定。
- 使用
HSSFWorkbook处理 Excel 2003 (.xls)。 - 注意 65,536 行 的限制。
- 对于新项目,建议直接使用
.xlsx格式(XSSFWorkbook)。 - 使用
WorkbookFactory.create()可以自动兼容两种格式。
如有更多具体问题(如样式设置、合并单元格、读取大数据量等),欢迎继续提问!
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/480891.html




