Java 创建 CSV 文件的三种实用方法:从零构建、数组写入与 Excel 转换

在 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 三种场景。这种方法避免了手动处理字符串拼接、特殊字符转义和编码问题的复杂性,适合在自动化脚本或服务端应用中使用。实际使用时,可以根据数据来源和规模选择合适的方式,并留意资源释放与授权条款等细节。

相关推荐
阿祖zu1 小时前
芝士就是力量!开源私有化部署与 GitHub 双向同步的个人知识笔记 App
前端·后端·ios
松仔log1 小时前
Java中级——组合和继承
android·java·开发语言
不才不才不不才1 小时前
Spring 源码系列(16): doDispatch 全流程——一次请求的主干链路
java·后端·spring
IT_陈寒1 小时前
SpringBoot自动配置失效?这个隐藏配置坑了我一整晚
前端·人工智能·后端
搜狐技术产品小编20232 小时前
告别“黑盒”与误判:如何用“多智能体对抗辩论”重构内容安全审核系统
后端·多agent
snow@li2 小时前
HikariCP:高性能数据库连接池全景深入梳理
java·数据库
DantyWei2 小时前
controller注册及调用时机
后端
edwarddamon2 小时前
Spring Cloud 配置热更新与 Bean 代理机制梳理
java·后端
码事漫谈3 小时前
我用 Seed Evolving 做了个 AI 小说写作工具
后端
Raas1003 小时前
MAIGateway,魔芋企业级AI网关的FinAPI成本竞争力设计
java·后端·网关·api网关·魔芋ai·finapi·mai gateway