阿里巴巴Easyexcel无法追加写入Csv文件的问题

2023-10-30

版本为当前最新版本3.2.1

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>easyexcel</artifactId>
  <version>3.2.1</version>
</dependency>

刚开始网上搜了一下,全是复制粘贴的使用什么模板withTemplate的,去尝试导出csv的时候,报如下异常:

com.alibaba.excel.exception.ExcelGenerateException: csv cannot use template.
    at com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder.copyTemplate(WriteWorkbookHolder.java:239)
    at com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder.<init>(WriteWorkbookHolder.java:207)
    at com.alibaba.excel.context.WriteContextImpl.initCurrentWorkbookHolder(WriteContextImpl.java:107)
    at com.alibaba.excel.context.WriteContextImpl.<init>(WriteContextImpl.java:90)
    at com.alibaba.excel.write.ExcelBuilderImpl.<init>(ExcelBuilderImpl.java:36)
    at com.alibaba.excel.ExcelWriter.<init>(ExcelWriter.java:39)
    at com.alibaba.excel.write.builder.ExcelWriterBuilder.build(ExcelWriterBuilder.java:104)

github上有一个一模一样问题的issues是22年提的https://github.com/alibaba/easyexcel/issues/2860

.csv根本不支持使用模板,具体 .xls 或者 .xlsx能不能用我也没去试,无法追加写入的具体原因如下:

测试代码

//写csv
EasyExcel.write(file, CheckAccount.class)
                    .excelType(ExcelTypeEnum.CSV)
                    .sheet("特约商户统一对账单明细清单")
                    .doWrite(rtList);

//使用的实体类
@Data
public static class CheckAccount{
    @ExcelProperty(value = "序列号", index = 0)
    private Long serialNumber;

    @ExcelProperty(value = "对账单日期",index = 1)
    private String checkDate;

    @ExcelProperty(value = "集团编号",index = 2)
    private String groupNumber;

    @ExcelProperty(value = "集团名称",index = 3)
    private String groupName;
}

首次运行

可以看到导出一个573字节的8条数据的.csv文件,后续每次执行都是一样的数据,无法追加写入。
在这里插入图片描述

最终通过一行一行代码debug定位,最终确定为 com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder类的构造器中,代码如下:
在这里插入图片描述

file存在时,会执行this.outputStream = new FileOutputStream(this.file);

new FileOutputStream(file) 如果目标文件已经存在,会先清空目标文件的内容,然后再写入新的数据, 如果想追加写入的话,需要额外传入参数 append = true

解决办法

项目下创建同路径的com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder类。

this.outputStream = new FileOutputStream(this.file); 改为 this.outputStream = new FileOutputStream(this.file, true);

在这里插入图片描述

测试结果

在这里插入图片描述
可以追加写入,但是表头会每次都新加一个,将写csv的代码改为如下逻辑:

File file = new File("/Users/wangsaichao/Downloads/newnew.csv");
if (file.exists()){
  // 第二次按照原有格式,不需要表头
  EasyExcel.write(file, CheckAccount.class)
          .needHead(false)
          .excelType(ExcelTypeEnum.CSV)
          .sheet("特约商户统一对账单明细清单")
          .doWrite(rtList);
}else {
  // 第一次写入需要表头
  EasyExcel.write(file, CheckAccount.class)
          .excelType(ExcelTypeEnum.CSV)
          .sheet("特约商户统一对账单明细清单")
          .doWrite(rtList);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

阿里巴巴Easyexcel无法追加写入Csv文件的问题 的相关文章

  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 为什么 JTables 使 TableModel 在呈现时不可序列化?

    所以最近我正在开发一个工具 供我们配置某些应用程序 它不需要是什么真正令人敬畏的东西 只是一个具有一些 SQL 脚本生成功能并创建几个 XML 文件的基本工具 在此期间 我使用自己的 AbstractTableModel 实现创建了一系列
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • 像 Java 这样的静态类型语言中动态方法解析背后的原因是什么

    我对 Java 中引用变量的动态 静态类型和动态方法解析的概念有点困惑 考虑 public class Types Override public boolean equals Object obj System out println i
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 为什么 csv.DictReader 给我一个无属性错误?

    我的 CSV 文件是 200 Service 我放入解释器的代码是 snav csv DictReader open screennavigation csv delimiter print snav fieldnames 200 for
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url

随机推荐

  • MacOS提示【您没有权限来打开应用程序“XXX”。】的完美解决办法

    前言 在 macOS Big Sur 系统下运行一些注册机类的应用程序 大概率会提示 您没有权限来打开应用程序 XXX 请联系您的电脑或网络管理员以获得帮助 信息 具体如下图 下面给出解决办法 说明 本人电脑为新款 MacBook Pro
  • vuex内容及使用详解

    Vuex是什么 Vuex 是一个专为 Vue js 应用程序开发的状态管理模式 它采用集中式存储管理应用的所有组件的状态 并以相应的规则保证状态以一种可预测的方式发生变化 说起状态管理模式 就不得不提起一个名词 单向数据流 单向数据流 在V
  • ubuntu vi/vim退出文件

    要退出 但是不保存 按esc先 然后输入 q 回车键即可退出 无法退出 则在 q 加入一个叹号回车键就行了 要退出保存的 则输入 wq 强制保存退出 则输入 wq 看到此时已经退出 在等待命令状态 以nano开头编辑文件的 则要退出 按 C
  • SQL Server学习之复合索引

    概要什么是单一索引 什么又是复合索引呢 何时新建复合索引 复合索引又需要注意些什么呢 本篇文章主要是对网上一些讨论的总结 一 概念单一索引是指索引列为一列的情况 即新建索引的语句只实施在一列上 用户可以在多个列上建立索引 这种索引叫做复合索
  • GPT系列模型技术路径演进

    目录 前言 Transformer GPT 1 BERT GPT 2 GPT 3 InstructGPT ChatGPT GPT 4 类ChatGPT产品 Google Bard 诗人 facebook LLaMA 羊驼 复旦 MOSS 清
  • 源码安装ODOO12

    要从源码安装 Odoo 我们首先要从 GitHub 上克隆一套 Odoo 源代码 mkdir home tderp conda envs odoo12 odoo dev 在odoo12虚环境下创建工作目录 cd home tderp con
  • linux怎么打开.o文件,Linux下文件I/O操作的相关知识

    Linux文件I O主要指的是文件的输入输出 很多初学者对文件的I O不是很了解 Linux文件I O的操作较多 下面小编就给大家详细介绍下Linux文件I O linux 文件I O教程 1 一 文件描述符 对内核而言 所以打开的文件都通
  • Android UI架构(十)--App请求切换帧率(1).md

    文章目录 参考资料 前言 背景 查看设备可支持的刷新率和分辨率 App设置设备帧率 Android Q及以下版本 Android R 参考资料 https zhuanlan zhihu com p 142212769 from voters
  • CC00041.bigdatajava——

    一 逻辑运算符概念使用 逻辑运算短路特性 逻辑运算符概念 gt 表示逻辑与运算符 相当于 并且 同真为真 一假为假 gt 表示逻辑或运算符 相当于 或者 一真为真 同假为假 gt 表示逻辑非运算符 相当于 取反 真为假 假为真 gt 逻辑运
  • ES(四)ES使用(基本查询、聚合查询)

    基本操作 操作索引 1 新建索引 curl XPUT localhost 9200 index01 2 查看索引 curl XGET http 192 168 168 101 9200 index01 settings curl XGET
  • Session和Cookie的用法及区别

    Session Cookie是什么 1 1 概念理解 要了解session和cookie是什么 先要了解以下几个概念 1 1 1 无状态的HTTP协议 协议 是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则 超文本传输协
  • 独立服务器和虚拟主机,浅谈独立服务器、云服务器、虚拟主机的区别

    当代的生活离不开网络的使用 不管是电商 游戏 还是视频行业 很多业务都需要依赖网络才得以开展 包括海外市场的推广与后期的联系巩固 真是巨大的市场需求 也使网络根据一些特性与使用衍生出了不同的类型 包括服务器 云服务器 虚拟主机等 那么 小编
  • 解决 k8s 集群1.26.3使用nfs时nfs provider selfLink was empty

    背景 1 使用1 26 3版本的集群 2 搭建nfs服务器 3 使用storageclass创建pvc时 一直pending 4 尝试修改vim etc kubernetes manifests kube apiserver yaml 文件
  • makefile工具的使用,编写一个或多个文件!(简单易上手)

    一 make 和 makefile 是什么 1 make 是一个 命令 2 makefile 是一个 文件 可以自动化的构建项目 3 编写 makefile 需要 1 依赖关系 2 依赖方法 二 什么是依赖关系 什么是依赖方法 下面我简单写
  • JUC学习系列五(ThreadLocal)

    该类提供了线程局部 thread local 变量 这些变量不同于它们的普通对应物 因为访问某个变量 通过其 get 或 set 方法 的每个线程都有自己的局部变量 它独立于变量的初始化副本 ThreadLocal 实例通常是类中的 pri
  • 删除oracle数据库用户

    如果在drop 后还提示ORA 01940 无法删除当前已链接的用户 说明还有连接的session 可以通过查看session的状态来确定该session是否被kill 了 用如下语句查看 select saddr sid serial p
  • selenium官方文档——2.入门

    2 1 简单用法 如果你已经安装了Selenium Python绑定 你可以像这样从Python开始使用它 from selenium import webdriver from selenium webdriver common keys
  • 新闻资讯CMS内容管理系统的设计与实现(一)

    新闻资讯CMS内容管理系统的设计与实现 一 目录 1 项目背景 2 项目规划 3 系统结构图 4 系统架构图 5 系统用例图 6 业务流程图 7 E R图 8 领域模型 9 数据字典 10 DDL建表语句 11 数据流图 1 项目背景 如标
  • 2021-1-9 吴恩达-C5 序列模型-w2 自然语言处理与词嵌(课后编程1-Operations on word vectors 词向量运算-含UnicodeDecodeError解决)

    原文链接 如果打不开 也可以复制链接到https nbviewer jupyter org中打开 自然语言处理与词嵌 Operations on word vectors 词向量运算 1 余弦相似度 2 词语类比任务 3 去除词向量中的偏见
  • 阿里巴巴Easyexcel无法追加写入Csv文件的问题

    版本为当前最新版本3 2 1