POI-Excel导出:发现xxx.xlsx中的部分内容有问题

2023-11-16

问题场景

新项目上需要用到页面上Excel导出下载,于是把老项目中用了很久的一个Excel工具类拿了过来,因为老项目导出的是 xls文件,新项目需要导出 xlsx,就对着改了下,改完之后导出文件,发现会弹出提示

在这里插入图片描述

点击是之后,文件能正常查看,文件内容也没问题。

问题原因

开始以为是新旧Excel类型的样式不兼容,最后检查发现是导出的文件流处理有问题。

工具类中处理文件用的是字节流写入,其实不该这么做,特别是导出文件多半是有中文的情况,但是在xls文件中并没有产生问题

    public static void ioWriteForSheets(HttpServletRequest request, XSSFWorkbook workbook, HttpServletResponse response, String excelName) {
        try {
            String agent = request.getHeader("USER-AGENT");
            boolean isIe = null != agent && agent.contains("MSIE") || null != agent
                    && agent.contains("Trident") || null != agent && agent.contains("Edge");
            if (isIe) {
                // ie
                String fileName = java.net.URLEncoder.encode(excelName, "UTF8");
                response.addHeader("Content-Disposition", "attachment;filename="
                        + fileName + ".xlsx");
            } else if (null != agent && agent.contains("Mozilla")) {
                // 火狐,chrome等
                String fileName = new String(excelName.getBytes(StandardCharsets.UTF_8), "ISO8859-1");
                response.addHeader("Content-Disposition", "attachment;filename="
                        + fileName + ".xlsx");
            }
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            workbook.write(baos);
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

            OutputStream os = response.getOutputStream();
            ByteArrayInputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
            byte[] b = new byte[1024];
            while ((inputStream.read(b)) > 0) {
                os.write(b);
            }
            inputStream.close();
            os.flush();
            os.close();

        } catch (IOException e) {
            exceptionHandle(e);
        }
    }

其实不该这么绕,可以直接将workbook 的流写入response中,并且解决了问题 修改之后的代码:

    public static void ioWriteForSheets(HttpServletRequest request, XSSFWorkbook workbook, HttpServletResponse response, String excelName) {
        try {
            String agent = request.getHeader("USER-AGENT");
            boolean isIe = null != agent && agent.contains("MSIE") || null != agent
                    && agent.contains("Trident") || null != agent && agent.contains("Edge");
            if (isIe) {
                // ie
                String fileName = java.net.URLEncoder.encode(excelName, "UTF8");
                response.addHeader("Content-Disposition", "attachment;filename="
                        + fileName + ".xlsx");
            } else if (null != agent && agent.contains("Mozilla")) {
                // 火狐,chrome等
                String fileName = new String(excelName.getBytes(StandardCharsets.UTF_8), "ISO8859-1");
                response.addHeader("Content-Disposition", "attachment;filename="
                        + fileName + ".xlsx");
            }
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

            // 直接写入response的输出流
            workbook.write(response.getOutputStream());

        } catch (IOException e) {
            exceptionHandle(e);
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

POI-Excel导出:发现xxx.xlsx中的部分内容有问题 的相关文章

  • HashMap不写入数据库

    我尝试在我的数据库中写入 但只写入发件人和消息 我不明白为什么会发生这种情况 我认为问题出在我使用 sendMessage 的地方 我认为问题是我没有什么可以做的读 写其他用户的主键 我在数据库中写入消息的活动 public class M
  • 添加动态数量的监听器(Spring JMS)

    我需要添加多个侦听器 如中所述application properties文件 就像下面这样 InTopics Sample QUT4 Sample T05 Sample T01 Sample JT7 注意 这个数字可以多一些 也可以少一些
  • 禁用 Eclipse Java 调试器的热代码替换 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Eclipse 中禁用热代码替换 https stackoverflow com questions 2594408 how do i disable hot code replace in
  • 使用cameltestsupport进行Camel单元测试,模板始终为空

    我正在用 Camel 做一个简单的单元测试 我想做的就是从文件 在资源下 读取 JSON 内容 将其发送到 Java 类进行验证 这是我试图测试的路线 无论我做什么 模板 我用来发送正文 json 始终为空 这是我的代码 public cl
  • Grails 2.3.0 自动重新加载不起作用

    我最近将我们的项目升级到 grails 2 3 0 一切工作正常 除了每当我更改代码时自动重新加载都无法工作的问题 这包括所有项目工件 控制器 域 服务 gsps css 和 javascript 文件 我的旧版本 grails 可以正常工
  • 使用 RecyclerView 适配器在运行时更改布局屏幕

    我有两个布局文件 如下所示 如果列表中存在数据 则我显示此布局 当列表为空时 我会显示此布局 现在我想在运行时更改布局 当用户从列表中删除最后一项时 我想将布局更改为第二张图片中显示的 空购物车布局 In getItemCount Recy
  • 如果使用的 JVM 是 x86 或 x64,则以不同的方式解决 Maven 依赖关系?

    我设置了一个 Maven 存储库来托管一些 dll 但我需要我的 Maven 项目根据使用的 JVM 是 x86 还是 x64 下载不同的 dll 例如 在运行 x86 版本 JVM 的计算机上 我需要从存储库下载 ABC dll 作为依赖
  • Java 8 中函数式接口的使用

    这是来自的后续问题Java 8 中的 双冒号 运算符 https stackoverflow com questions 20001427 double colon operator in java 8其中 Java 允许您使用以下方式引用
  • 隐式超级构造函数 Person() 未定义。必须显式调用另一个构造函数?

    我正在开发一个项目 但收到错误 隐式超级构造函数 Person 未定义 必须显式调用另一个构造函数 我不太明白它 这是我的人物课程 public class Person public Person String name double D
  • Java 数组的最大维数

    出于好奇 在 Java 中数组可以有多少维 爪哇language不限制维数 但是JavaVM规范将维度数限制为 255 例如 以下代码将无法编译 class Main public static void main String args
  • 如何将 Jfreechart(饼图)添加到 netbeans 的面板中

    我正在使用 netbeans gui 编辑器 并且正在尝试添加一个本身位于内部框架中的 Jfreechart 并且这个内部框架我想将其添加到面板中 正如您在此图中看到的那样 抱歉 我无法直接发布图像 因为我新手 http www flick
  • Java - 返回值是否会中断循环?

    我正在编写一些基本上遵循以下格式的代码 public static boolean isIncluded E element Node
  • 如何记录来自 Akka (Java) 的所有传入消息

    在 Scala 中 您可以使用 LoggingReceive 包装接收函数 如何通过 Java API 实现相同的目标 def receive LoggingReceive case x do something Scala API 有Lo
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • Espresso 和 Proguard 的 Java.lang.NoClassDefFoundError

    我对 Espresso 不太有经验 但我终于成功地运行了它 我有一个应用程序需要通过 Proguard 缩小才能处于 56K 方法之下 该应用程序以 3 秒的动画开始 因此我需要等到该动画结束才能继续 这就是我尝试用该方法做的事情waitF
  • 无法捕获 Spring Batch 的 ItemWriter 中的异常

    我正在编写一个 Spring Batch 流程来将数据集从一个系统迁移到另一个系统 在这种情况下 这就像使用RowMapper实现在传递给查询之前从查询构建对象ItemWriter The ItemWriter称为save我的 DAO 上的
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • Java &= 运算符应用 & 或 && 吗?

    Assuming boolean a false 我想知道是否这样做 a b 相当于 a a b logical AND a is false hence b is not evaluated 或者另一方面 这意味着 a a b Bitwi
  • 嵌入式 Jetty - 以编程方式添加基于表单的身份验证

    有没有一种方法可以按如下方式以编程方式添加基于表单的身份验证 我用的是我自己的LdapLoginModule 最初我使用基本身份验证并且工作正常 但现在我想在登录页面上进行更多控制 例如显示徽标等 有没有好的样品 我正在使用嵌入式 jett
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false

随机推荐

  • Texture::getSourceFileType()

    Texture getSourceFileType
  • 滑动窗口最大值——单调队列的实践

    一 单调队列的介绍 单调队列 即单调递减或单调递增的队列 而且 队首和队尾都可以进行出队操作 但只有队尾可以进行入队操作 它类似于下面这幅图 二 239 滑动窗口最大值 给你一个整数数组 nums 有一个大小为 k 的滑动窗口从数组的最左侧
  • vscode批量注释快捷键

    光标选中想要注释的所有代码 ctrl 取消同理
  • 如何在多线程异步的情况下保证事务?

    在Spring环境下 如果使用了 Transactional 注解 那么当你的 inert 操作时异步的话 则会不在当前事务里面 那么后续的回滚操作 不会将这次异步操作的插入进行回滚 那么我们有方式来保证多线程异步场景下的事务吗 Servi
  • React中的组件的渲染函数(Render Function)是什么?什么是React中的函数组件和类组件?如何在React中进行状态管理?

    1 请解释一下React中的组件的渲染函数 Render Function 是什么 以及如何使用和实现渲染函数 React中的组件可以有多种形式的渲染函数 包括传统的render 方法 以及近年来兴起的函数组件和Hooks中的useStat
  • vue封装组件

    在 Vue 中 封装组件可以使代码更加模块化和灵活 提高代码的复用性和可维护性 下面是一个简单的封装组件的示例 1 创建组件
  • Linux系统编程之信号

    本篇博客所回顾的知识 学习目标 一 信号介绍 从图中可以看出 信号的优先级是高于普通操作的 出现信号就一定要先执行完才能继续做之前的事情 注意 如何查看信号都有哪些呢 答 用命令 kill l 来do 注意 每一个进程都有一个唯一的定时器a
  • rabbitmq整合springboot:ChannelAwareMessageListener和@RabbitListener的使用

    Springboot中使用Rabbimq监听队列中有两种方式 一种是 RabbitListener注解的方式 一种是实现springboot ChannelAwareMessageListener接口的方式 前者使用如下 消费者 Compo
  • Windows 10版本business_editions和consumer_editions的区别?

    Windows 10版本business editions和consumer editions的区别 答1 二者都内置专业版 不同之处在于 consumer editions 版本包含 Home 家庭版 Education 教育版 Prof
  • websocket封装

    封装 class SocketPlugin constructor param this websocket null this isConnect false this timeoutNum null this isActivelyClo
  • 动态多光源 Light-Pre-Pass Lighting 实现

    辛苦数天 终于有所突破 在rendermonkey里用glsl实现的代码请去这里下载 关于渲染器结构设计可参见 http www cnblogs com cloudffx archive 2011 08 31 2160208 html 关于
  • java三种实现文件上传方法

    文章转载自点击看原文 前言 因自己负责的项目 jetty内嵌启动的SpringMvc 中需要实现文件上传 而自己对java文件上传这一块未接触过 且对 Http 协议较模糊 故这次采用渐进的方式来学习文件上传的原理与实践 该博客重在实践 一
  • 房屋租赁

    作者主页 编程指南针 作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智
  • Android静态注册内部类广播BroadcastReceiver

    用静态注册内部类广播出现异常 09 14 11 31 25 576 E AndroidRuntime 3391 FATAL EXCEPTION main 09 14 11 31 25 576 E AndroidRuntime 3391 ja
  • Kettle下载Redisinput插件查询Redis数据

    Kettle下载Redisinput插件查询Redis数据 安装插件 1 下载Redisinput插件 https download csdn net download ispringmw 12909650 2 将完整插件包复制到Kettl
  • CGI之C语言篇

    为什么要进行CGI编程 在HTML中 当客户填写了表单 并按下了发送 submit 按钮后 表单的内容被发送到了服务器端 一般的 这时就需要有一个服务器端脚本来对表单的内容进行一些处理 或者是把它们保存起来 或者是按内容进行一些查询 或者是
  • Kubernetes笔记 (1) - 系统概述

    Kubernetes概述 Kubernetes由google开源 它的开发和设计都深受Google内部久负盛名的系统Borg的影响 而且 它的许多顶级贡献者之前也是Borg系统的开发者 Borg是Google内部使用的大规模集群管理系统 K
  • 分布式-zookeeper

    Zookeeper的Leader选举
  • 解决The number of method references in a .dex file cannot exceed 64K的问题

    需要分包build只需要 在build gradle defaultConfig中加入 multiDexEnabled true defaultConfig multiDexEnabled true
  • POI-Excel导出:发现xxx.xlsx中的部分内容有问题

    问题场景 新项目上需要用到页面上Excel导出下载 于是把老项目中用了很久的一个Excel工具类拿了过来 因为老项目导出的是 xls文件 新项目需要导出 xlsx 就对着改了下 改完之后导出文件 发现会弹出提示 点击是之后 文件能正常查看