Java使用POI导出文件受损打不开

最近项目里涉及到了一个功能需要将数据库的表定时转换为Excel表格并发送给公司的对应负责人,作为开发者这种事情肯定要想一个一劳永逸的方法,所以这项功能的开发也就随之开展了

第一部分:Java使用POI生成Excel并保存本地

遇到问题:Java使用POI导出文件受损打不开

在本地测试和发送邮件全都没有问题,测试完成后上线到Linux服务器,中间遇到了路径变换的问题,简单的更改路径解决;上线后发送邮件成功,附件添加成功,邮箱中预览失败,下载到本地打开失败,错误提示文件受损。

解决方案:在网上找了很多解决方法,以下一一例举

1.IO流并不是每次都能读到1024个字节,所有用len作为每次读取数据的长度,否则会出现文件损坏的错误(不是这个)
2.设置扩展头,当Content-Type 的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型。HttpServletResponse 的res.setHeader(“Content-Disposition”, “attachment;filename=” + name);(没用到网络下载,也不是这个)
还有Linux目录没有读写权限等等~等等…

找了一圈发现网上没有处理方法,于是自己找原因解决,
首先考虑的是发送邮件中文件读取出现问题,但之前看了运行日志没有错误信息;
再看目录下POI生成的文件,使用连接工具打开失败,在Linux用vim命令可以打开,排除文件本身的损坏问题。
然后怀疑编码格式,因为文件名是根据表数据生成的,包含了中文,使用URLEncoder.encode(filePath,"UTF-8")编码后文件损坏问题得以解决,但之后我把文件名改成了时间戳,但邮件发送的文件名可以单独设置。
接下来上代码:

 /*** 生成Excel表格** @param id 榜单id* @return*/
public Map<String, String> putExcel(String id) {List<Star> starList = new ArrayList<>();Connection connection = DBUtil.getConnection();try {Statement statement = connection.createStatement();ResultSet rs = statement.executeQuery("select 查询字段 from 表 where id in (select 中间表字段 from 中间表 where 中间表字段 = " + id + ") order by 排序字段 desc");while (rs.next()) {Xx xx= new Xx();xx.setId(rs.getLong("id"));starList.add(xx);}// starList.forEach(System.out::println);} catch (SQLException throwables) {log.error(throwables.getMessage());throwables.printStackTrace();}try {StringBuilder header = new StringBuilder();// 查询出表头并拼接Statement statement = connection.createStatement();ResultSet rs = statement.executeQuery("select 字段 from 表名 where id = " + id);while (rs.next()) {header.append("用于发送邮件时指定邮件附件名称");}HSSFWorkbook workbook = new HSSFWorkbook();//创建Excel文件(Workbook)HSSFSheet sheet = workbook.createSheet("sheet1");//创建工作表(Sheet)// 设置表头HSSFRow row = sheet.createRow(0);HSSFCell cell = row.createCell(0);cell.setCellValue(header.toString());CellRangeAddress region = new CellRangeAddress(0, 0, 0, 4);sheet.addMergedRegion(region);// 首行合并5格单元格并设置表名// 设置首行内容row = sheet.createRow(1);row.createCell(0).setCellValue("id");row.createCell(1).setCellValue("排名");row.createCell(2).setCellValue("姓名");row.createCell(3).setCellValue("票数");row.createCell(4).setCellValue("生日");// 设置第一行每列标题栏for (int i = 0; i < starList.size(); i++) {// 循环设置表内容Star star = starList.get(i);row = sheet.createRow(i + 2);row.createCell(0).setCellValue(xx.getId());row.createCell(1).setCellValue(i + 1); // 名次row.createCell(2).setCellValue(xx.getName());row.createCell(3).setCellValue(xx.getVotes());row.createCell(4).setCellValue(xx.getBirthday());}String filePath = "/usr/local/emailHistory/" + new Date().getTime() + ".xls";//文件路径FileOutputStream out = new FileOutputStream(filePath);workbook.write(out);//保存Excel文件out.close();//关闭文件流System.out.println("OK,榜单输出成功!");Map<String, String> map = new HashMap();map.put("filePath", filePath);map.put("fileName", header.toString());return map;} catch (Exception e) {log.error(e.getMessage());e.printStackTrace();}return null;}

至此,查询数据生成Excel表并保存到本地已完成

.
POI的Maven依赖

     <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.0</version></dependency>

发邮件的功能链接https://blog.csdn.net/weixin_45952509/article/details/108963478

Java使用POI导出文件受损打不开相关推荐

  1. Java使用Poi填充Word表格模板(图片和文字)

    Java使用Poi填充Word表格模板(图片和文字) **** 由于个人需求需要对表格模板进行操作,所以本文章只对表格进行替换数据操作,没有段落,没有循环遍历,没有延伸!!!!!(后续补充!!!) * ...

  2. easyExcel/poi导出文件Can not close IO,This archive contains unclosed entries

    easyExcel或poi导出文件时发生com.alibaba.excel.exception.ExcelGenerateException: Can not close IO,或者java.io.I ...

  3. Java使用POI读取和写入Excel指南

    Java使用POI读取和写入Excel指南 做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求: 网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃 ...

  4. Java结合POI清洗Excel

    Java结合POI清洗Excel 下文是Java结合POI清洗Excel的示例代码,详细内容如下: ShipEntry.java package com.liang.bi.excelmodel;pub ...

  5. java通过poi读取excel中的日期类型数据或自定义类型日期

    java通过poi读取excel中的日期类型数据或自定义类型日期 Java 读取Excel表格日期类型数据的时候,读出来的是这样的  12-十月-2019,而Excel中输入的是 2019/10/12 ...

  6. Java面试poi中excel版本大小_java 中 poi解析Excel文件版本问题解决办法

    java 中 poi解析Excel文件版本问题解决办法 发布时间:2020-10-02 03:46:15 来源:脚本之家 阅读:91 作者:程诺 poi解析Excel文件版本问题解决办法 poi解析E ...

  7. java文件无法导出excel文件,【excel表格文件格式无效】java导出excel,excel打不开,报文件格式无效,怎么解决!...

    excel提示 打开的文件.xls的格式与文件扩展名不一致怎么办 如果打开文件的格式与文件的扩展名不一致,只要能够打开就不用去管他. java导出excel,excel打不开,报文件格式无效,怎么解决 ...

  8. java的poi技术读取Excel[2003-2007,2010]

    这篇blog主要是讲述java中poi读取excel,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为:xls和xlsx. 读取excel和MySQL相关: ja ...

  9. java使用poi.xssf 写入内容到excel表格中 和 读取 表格里面的数据

    一.java使用poi.xssf 写入内容到excel表格中 public class TestExcel {//创建一个excel工作簿public static String outputFile ...

最新文章

  1. 开源!北大研究生把《统计学习方法》书中全部算法都实现了!
  2. Android 关于获取摄像头帧数据解码
  3. VS中的 MD/MT设置 【转】
  4. UA MATH565C 随机微分方程III Ito积分简介
  5. 10分钟让你明白什么是ERP
  6. 关于js 中call()和 apply()方法的解释
  7. Acwing 216. Rainbow的信号
  8. 天津科技大学计算机网络,计算机网络PPT(天津科技大学讲稿-张强)第一章英文对照...
  9. 可穿戴在线展持续升温:聚焦产业热点 畅谈核心技术发展
  10. 重新学习c++--理解引用、智能指针、虚函数、模板、容器
  11. 剑指offer (01):赋值运算符函数 (C++ 实现)
  12. Linux\Unix线程的互斥锁和条件变量
  13. SURF C++代码 详细阅读(二)—— 极值点检测 确定极值点精确位置
  14. 暗黑 pvpgn mysql 架设_暗黑破坏神2战网架设图文教程
  15. 前端模拟自动解析手机号姓名地址
  16. 搞个服务器安装黑群晖系统,牛人闲置电脑大改造!超低成本组建家用黑群晖NAS...
  17. python解椭圆方程的例题_椭圆标准方程典型例题及练习题
  18. scons构建mdk工程
  19. 2022-2028年中国银行IT行业市场发展前景及投资风险评估报告
  20. (三十)AO和GO剖析

热门文章

  1. 用于检测浏览器以及系统环境的js
  2. 【renice】调整进程的nice值,即调整进程的优先级别
  3. IBM资深顾问刘运霞 ERP实施三哭换一笑 (转)
  4. 【FI模块】外包业务科目配置
  5. 教你如何变得魅力四射
  6. BigDecimal.ROUND_UP和BigDecimal.ROUND_DOWN
  7. 少一些计较多_少一些计较多一些包容的说说
  8. java面试-内存溢出的原因及解决办法
  9. Xcode: 运行卡顿处理
  10. 码支付彩虹易支付对接银联前置插件-申请银联进件-银联对接易支付接口程序搭建-制作自己的支付系统(2)