Java CSV 转 XLS 实现
在 Java 中将 CSV 文件转换为 XLS (Excel 97-2003 格式) 文件,可以使用 Apache POI 库,以下是完整的实现步骤和代码示例。
添加依赖
确保你的项目中包含 Apache POI 依赖,如果你使用 Maven,在 pom.xml 中添加:
<dependencies>
<!-- Apache POI for Excel operations -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
</dependencies>
CSV 转 XLS 实现代码
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import java.io.*;
import java.nio.charset.StandardCharsets;
public class CsvToXlsConverter {
public static void convertCsvToXls(String csvFilePath, String xlsFilePath) throws IOException {
// 1. 创建新的 Excel 工作簿
Workbook workbook = new HSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");
// 2. 读取 CSV 文件
try (BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(csvFilePath), StandardCharsets.UTF_8))) {
String line;
int rowNum = 0;
// 3. 逐行处理 CSV 数据
while ((line = br.readLine()) != null) {
String[] values = line.split(",");
Row row = sheet.createRow(rowNum++);
for (int i = 0; i < values.length; i++) {
Cell cell = row.createCell(i);
cell.setCellValue(values[i]);
}
}
}
// 4. 自动调整列宽
for (int i = 0; i < sheet.getRow(0).getPhysicalNumberOfCells(); i++) {
sheet.autoSizeColumn(i);
}
// 5. 写入 XLS 文件
try (FileOutputStream fos = new FileOutputStream(xlsFilePath)) {
workbook.write(fos);
}
// 6. 关闭工作簿
workbook.close();
}
public static void main(String[] args) {
String csvFile = "input.csv";
String xlsFile = "output.xls";
try {
convertCsvToXls(csvFile, xlsFile);
System.out.println("CSV 文件已成功转换为 XLS 文件: " + xlsFile);
} catch (IOException e) {
System.err.println("转换过程中发生错误: " + e.getMessage());
e.printStackTrace();
}
}
}
代码说明
- 创建 Excel 工作簿:使用
HSSFWorkbook创建一个 Excel 97-2003 格式的工作簿。 - 读取 CSV 文件:使用
BufferedReader逐行读取 CSV 文件。 - 处理 CSV 数据:
- 使用
split(",")分割每行的 CSV 数据 - 为每个值创建 Excel 单元格
- 使用
- 格式调整:
自动调整列宽以适应内容
- 写入文件:将工作簿写入输出文件
- 资源清理:确保所有流和资源正确关闭
高级功能扩展
如果需要更复杂的功能,可以考虑以下扩展:
处理包含逗号的 CSV 字段
CSV 文件中的字段可能包含逗号(用引号括起来),可以使用正则表达式改进分割逻辑:
String[] values = line.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
设置单元格样式
// 创建单元格样式
CellStyle style = workbook.createCellStyle();
Font font = workbook.createFont();
font.setBold(true);
style.setFont(font);
// 应用样式到单元格
Cell cell = row.createCell(0);
cell.setCellValue("Header");
cell.setCellStyle(style);
处理大文件
对于非常大的 CSV 文件,可以考虑使用 SXSSFWorkbook (流式 API) 来避免内存问题:
// 替换 HSSFWorkbook 为 SXSSFWorkbook Workbook workbook = new SXSSFWorkbook(100); // 在内存中保留100行
注意事项
- 编码问题:确保 CSV 文件使用正确的编码(如 UTF-8)读取
- 路径问题:处理文件路径时注意跨平台兼容性
- 内存使用:对于非常大的文件,考虑分批处理或使用流式 API
- 异常处理:添加适当的异常处理以确保程序健壮性
代码提供了基本的 CSV 转 XLS 功能,你可以根据实际需求进行扩展和优化。
