Java使用POI导出文件受损打不开
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导出文件受损打不开相关推荐
- Java使用Poi填充Word表格模板(图片和文字)
Java使用Poi填充Word表格模板(图片和文字) **** 由于个人需求需要对表格模板进行操作,所以本文章只对表格进行替换数据操作,没有段落,没有循环遍历,没有延伸!!!!!(后续补充!!!) * ...
- 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 ...
- Java使用POI读取和写入Excel指南
Java使用POI读取和写入Excel指南 做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求: 网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃 ...
- Java结合POI清洗Excel
Java结合POI清洗Excel 下文是Java结合POI清洗Excel的示例代码,详细内容如下: ShipEntry.java package com.liang.bi.excelmodel;pub ...
- java通过poi读取excel中的日期类型数据或自定义类型日期
java通过poi读取excel中的日期类型数据或自定义类型日期 Java 读取Excel表格日期类型数据的时候,读出来的是这样的 12-十月-2019,而Excel中输入的是 2019/10/12 ...
- Java面试poi中excel版本大小_java 中 poi解析Excel文件版本问题解决办法
java 中 poi解析Excel文件版本问题解决办法 发布时间:2020-10-02 03:46:15 来源:脚本之家 阅读:91 作者:程诺 poi解析Excel文件版本问题解决办法 poi解析E ...
- java文件无法导出excel文件,【excel表格文件格式无效】java导出excel,excel打不开,报文件格式无效,怎么解决!...
excel提示 打开的文件.xls的格式与文件扩展名不一致怎么办 如果打开文件的格式与文件的扩展名不一致,只要能够打开就不用去管他. java导出excel,excel打不开,报文件格式无效,怎么解决 ...
- java的poi技术读取Excel[2003-2007,2010]
这篇blog主要是讲述java中poi读取excel,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为:xls和xlsx. 读取excel和MySQL相关: ja ...
- java使用poi.xssf 写入内容到excel表格中 和 读取 表格里面的数据
一.java使用poi.xssf 写入内容到excel表格中 public class TestExcel {//创建一个excel工作簿public static String outputFile ...
最新文章
- 开源!北大研究生把《统计学习方法》书中全部算法都实现了!
- Android 关于获取摄像头帧数据解码
- VS中的 MD/MT设置 【转】
- UA MATH565C 随机微分方程III Ito积分简介
- 10分钟让你明白什么是ERP
- 关于js 中call()和 apply()方法的解释
- Acwing 216. Rainbow的信号
- 天津科技大学计算机网络,计算机网络PPT(天津科技大学讲稿-张强)第一章英文对照...
- 可穿戴在线展持续升温:聚焦产业热点 畅谈核心技术发展
- 重新学习c++--理解引用、智能指针、虚函数、模板、容器
- 剑指offer (01):赋值运算符函数 (C++ 实现)
- Linux\Unix线程的互斥锁和条件变量
- SURF C++代码 详细阅读(二)—— 极值点检测 确定极值点精确位置
- 暗黑 pvpgn mysql 架设_暗黑破坏神2战网架设图文教程
- 前端模拟自动解析手机号姓名地址
- 搞个服务器安装黑群晖系统,牛人闲置电脑大改造!超低成本组建家用黑群晖NAS...
- python解椭圆方程的例题_椭圆标准方程典型例题及练习题
- scons构建mdk工程
- 2022-2028年中国银行IT行业市场发展前景及投资风险评估报告
- (三十)AO和GO剖析