在 Java 开发中,CSV(逗号分隔值)作为一种轻量级、跨平台的通用数据格式,广泛用于报表导出、数据迁移和系统间数据交互等场景。虽然看似简单,但生产级应用中往往需要处理特殊字符转义、编码适配等问题,手动实现不仅代码繁琐,还容易出现兼容性隐患。本文将介绍如何利用 Spire.XLS for Java 库,通过三种方式创建 CSV 文件:从零构建、从数组批量写入,以及将现有 Excel 文件转换为 CSV。
该库的一个特点是独立于本地安装的 Microsoft Office 环境运行,可以在服务器端或没有图形界面的 Linux 环境中部署和使用。
环境配置
在开始之前,需要在 Java 项目中引入 Spire.XLS for Java。如果使用 Maven,在 pom.xml 中添加以下配置即可:
xml
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
</repository>
</repositories>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.xls</artifactId>
<version>16.4.1</version>
</dependency>
对于非 Maven 项目,可以手动下载 JAR 包并添加到项目的构建路径中。
方式一:从零构建基础 CSV 文件
这是最基础的使用方式,适用于从头创建数据量较小的 CSV 文件。核心思路是创建一个 Workbook 实例,通过 Worksheet 向单元格写入数据,最后调用 saveToFile() 方法导出为 CSV。
java
import com.spire.xls.*;
import java.nio.charset.Charset;
public class CreateBasicCSV {
public static void main(String[] args) {
// 创建 Workbook 实例
Workbook workbook = new Workbook();
// 获取第一个工作表
Worksheet sheet = workbook.getWorksheets().get(0);
// 写入表头
sheet.getCellRange("A1").setValue("ID");
sheet.getCellRange("B1").setValue("商品名");
sheet.getCellRange("C1").setValue("价格");
sheet.getCellRange("D1").setValue("数量");
// 写入数据行
sheet.getCellRange("A2").setNumberValue(1001);
sheet.getCellRange("B2").setValue("无线鼠标");
sheet.getCellRange("C2").setNumberValue(29.99);
sheet.getCellRange("D2").setNumberValue(150);
sheet.getCellRange("A3").setNumberValue(1002);
sheet.getCellRange("B3").setValue("机械键盘");
sheet.getCellRange("C3").setNumberValue(89.99);
sheet.getCellRange("D3").setNumberValue(75);
// 将工作表另存为 CSV 文件(逗号分隔 + UTF-8 编码)
sheet.saveToFile("商品信息.csv", ",", Charset.forName("UTF-8"));
// 释放资源
workbook.dispose();
}
}
核心 API 说明:
setValue():向单元格写入文本值。setNumberValue():向单元格写入数值(支持整数和小数)。saveToFile(filename, separator, charset):将工作表导出为 CSV,可自定义分隔符和编码。
方式二:从数组批量创建结构化 CSV
在实际开发中,业务数据往往以数组或集合的形式存在。这种方式适合批量导出用户列表、订单记录等结构化数据。
java
import com.spire.xls.*;
import java.nio.charset.Charset;
public class CreateStructuredCSV {
public static void main(String[] args) {
Workbook workbook = new Workbook();
Worksheet sheet = workbook.getWorksheets().get(0);
// 定义表头
String[] headers = {"订单号", "顾客名", "订单金额", "状态"};
for (int i = 0; i < headers.length; i++) {
sheet.getCellRange(1, i + 1).setValue(headers[i]);
}
// 批量数据
String[][] orderData = {
{"ORD001", "张三", "299.99", "已完成"},
{"ORD002", "李四", "599.50", "已发货"},
{"ORD003", "王五", "129.00", "已取消"}
};
// 遍历写入
int rowNum = 2;
for (String[] rowData : orderData) {
for (int col = 0; col < rowData.length; col++) {
sheet.getCellRange(rowNum, col + 1).setValue(rowData[col]);
}
rowNum++;
}
sheet.saveToFile("订单信息.csv", ",", Charset.forName("UTF-8"));
workbook.dispose();
}
}
与逐个单元格赋值相比,遍历数组的方式更适合处理批量数据,且可以灵活适配 List<List<String>> 或其他动态数据源。
方式三:从 Excel 转换为 CSV
当已有 Excel 格式的数据需要导出为 CSV 用于数据迁移或系统导入时,可以通过 loadFromFile() 加载 Excel 文件,然后直接另存为 CSV。
java
import com.spire.xls.*;
import java.nio.charset.Charset;
public class ExcelToCSV {
public static void main(String[] args) {
// 加载 Excel 文件
Workbook workbook = new Workbook();
workbook.loadFromFile("示例.xlsx");
// 获取第一个工作表
Worksheet sheet = workbook.getWorksheets().get(0);
// 保存为 CSV
sheet.saveToFile("转换结果.csv", ",", Charset.forName("UTF-8"));
workbook.dispose();
}
}
核心流程仅三步:加载 Excel → 定位工作表 → 调用 saveToFile() 导出。该库还支持反向操作,即将 CSV 转换为 Excel 工作簿,以便对纯文本数据应用样式、公式等功能。
注意事项
- 特殊字符处理 :当数据包含逗号或双引号时,库会自动按照 RFC 4180 规范进行转义,无需手动处理。例如:
sheet.getCellRange("A1").setValue("包含,逗号与\"引号\"的文本"); - 自定义分隔符与编码:除标准逗号外,该库还支持分号(欧洲地区常用)、制表符等分隔符,以及 UTF-8、UTF-16、GB2312 等编码:
java
// 使用分号分隔 + UTF-16 编码
sheet.saveToFile("数据.csv", ";", Charset.forName("UTF-16"));
// 使用制表符生成 TSV 文件
sheet.saveToFile("数据.tsv", "\t", Charset.forName("UTF-8"));
- 资源释放 :操作完成后调用
workbook.dispose()有助于及时释放文件句柄和内存资源。 - 多工作表导出限制 :CSV 格式本质上是纯文本的单表格式,无法在一个文件中保存多个工作表。如需导出多个工作表,需要分别为每个工作表调用
saveToFile()生成独立的 CSV 文件。 - 授权说明:该库提供免费版本供开发测试使用,免费版对某些功能或文件处理规模可能存在限制。在项目集成前,建议查阅其授权条款确认是否符合使用场景。
总结
通过 Spire.XLS for Java 提供的 Worksheet 操作和 saveToFile() 方法,可以相对简洁地实现从零构建 CSV、从数组批量写入以及 Excel 转 CSV 三种场景。这种方法避免了手动处理字符串拼接、特殊字符转义和编码问题的复杂性,适合在自动化脚本或服务端应用中使用。实际使用时,可以根据数据来源和规模选择合适的方式,并留意资源释放与授权条款等细节。