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

相关推荐
玉宇夕落1 小时前
Cheerio虚拟DOM原理
后端
geovindu1 小时前
go: Recursion Algorithm
开发语言·后端·算法·golang·递归算法
Cry丶1 小时前
一次 FTP 上传引发 504 Gateway Timeout 的排查复盘
java·nginx·ftp·openresty·被动模式·504 gateway·生产问题排查
用户2930750976691 小时前
深入理解 RAG 文档切割:从知识库到向量数据库的关键一步
后端
geovindu1 小时前
CSharp: Composite Pattern
开发语言·后端·c#·组合模式·结构型模式
码农进化录1 小时前
Java 程序员的 AI 进化论 | AI 辅助 CI/CD,让 AI 帮你做代码审查和部署决策
java·spring boot·openai
zyplayer-doc1 小时前
企业文档的进化:网盘和在线文档的下一个升级方向—知识库系统
java·大数据·数据库·人工智能·ocr
吃饱了得干活1 小时前
从零设计一个高并发点赞系统:缓存+MQ异步持久化实战
java·架构
宇图SHARE1 小时前
别再用 Python 写 Agent 前端了!Vue3 + NestJS + TypeScript 全栈方案,开发效率翻倍
前端·后端