问题描述:

java poi 操作excel ,浏览器提交表单下载导出excel, 用火狐可以正常导出,用chrome一直无响应。

解决经过:

度娘了一堆答案,得到 靠谱的方案是需要设置response的Content-Length来解决,但是无法通过 excel的Workbook获取 length,于是又参照了 https://qieyi28.iteye.com/blog/2274852 的提示,先生成临时文件,再 file.length() 塞到 response的Content-Length里,最终解决。

以下是参照的文章原文(避免原作者删除,我还是copy一份)

第一步:导入poi   jar包。因为是使用maven ,如下方式引入jar

Xml代码

  1. <dependency>
  2. <groupId>org.apache.poi</groupId>
  3. <artifactId>poi</artifactId>
  4. <version>3.13</version>
  5. </dependency>

第二步:jsp页面使用from表单请求

Html代码

  1. <form id="form_stock" action="${contextPath}/stock/toExportExcel">
  2. ...............
  3. </form>

第三步:设计controller

Java代码

  1. @RequestMapping("toExportExcel")
  2. public void exportExcel(StockExt stockExt,HttpServletRequest request, HttpServletResponse response) {
  3. List<Stock> list = stockService.queryList(stockExt);
  4. String[] rowsName = new String[] {"序号","货号","品名","规格","颜色","单位","批号","库存量","仓库","库位","单类型","所属客户","入库时间","实际库存量"};
  5. List<Object[]> dataList = new ArrayList<Object[]>();
  6. for (int i = 0; i < list.size(); i++) {
  7. Object[] objs = new Object[rowsName.length];// 创建13个数组长度
  8. StockVo sto = listVo.get(i);
  9. objs[0] = i;
  10. objs[1] = sto.getCargoNum();// 货号
  11. objs[2] = sto.getCargoName();// 品名
  12. objs[3] = sto.getCargoSpecifications();// 规格
  13. objs[4] = sto.getCargoColor();// 颜色
  14. objs[5] = sto.getUnitsName();// 单位
  15. objs[6] = TimeUtil.getTime(sto.getManufactureDate(), "yyyyMMdd");// 批号
  16. objs[7] = sto.getStockAmount();
  17. objs[8] = sto.getStorageName();// 仓库
  18. objs[9] = sto.getDepotName();// 库位
  19. objs[10] = (sto.getIsLoss() == 1) ? "库存单" : "报损单";
  20. objs[11] = sto.getNickName();// 所属客户
  21. objs[12] = sto.getModifyDate();
  22. objs[13] = "";// 留给仓管员导出人员任意填写
  23. dataList.add(objs);
  24. }
  25. String fileName = "库存单";
  26. //执行导出
  27. ExportExcel.exportExcel(request,response,fileName, rowsName, dataList, "yyyy-MM-dd HH:mm:ss");
  28. }

上面代码中,我们只要生成exportExcel方法里对应的3个参数就可以了,这个根据你代码灵活配置。

第四步:实现exportExcel方法

Java代码

  1. package com.honsend.common.jsp.poi;
  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileNotFoundException;
  7. import java.io.FileOutputStream;
  8. import java.io.IOException;
  9. import java.io.InputStream;
  10. import java.io.OutputStream;
  11. import java.net.URLEncoder;
  12. import java.text.SimpleDateFormat;
  13. import java.util.Date;
  14. import java.util.Iterator;
  15. import java.util.List;
  16. import javax.servlet.http.HttpServletRequest;
  17. import javax.servlet.http.HttpServletResponse;
  18. import org.apache.poi.hssf.usermodel.HSSFCell;
  19. import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  20. import org.apache.poi.hssf.usermodel.HSSFFont;
  21. import org.apache.poi.hssf.usermodel.HSSFRichTextString;
  22. import org.apache.poi.hssf.usermodel.HSSFRow;
  23. import org.apache.poi.hssf.usermodel.HSSFSheet;
  24. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  25. import org.apache.poi.hssf.util.HSSFColor;
  26. import com.honsend.common.NumberUtil;
  27. import com.honsend.common.TimeUtil;
  28. /**
  29. * 利用开源组件POI3.13动态导出EXCEL文档
  30. *
  31. * @version v1.0
  32. * @param
  33. *  */
  34. public class ExportExcel {
  35. public static final String FILE_SEPARATOR = System.getProperties().getProperty("file.separator");
  36. /**
  37. * 这是一个通用的方法
  38. * @param fileName 文件名
  39. * @param headers  表格属性列名数组
  40. * @param dataset  需要显示的数据集合
  41. * @param pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
  42. */
  43. @SuppressWarnings("deprecation")
  44. public static HSSFWorkbook exportExcel(HttpServletRequest request,HttpServletResponse response,String fileName, String[] headers, List<Object[]> dataset,  String pattern) {
  45. String docsPath = request.getSession().getServletContext().getRealPath("docs");//docs文件夹目录
  46. String filePath = docsPath + FILE_SEPARATOR + fileName+"-任意名.xls";
  47. // 声明一个工作薄
  48. HSSFWorkbook workbook = new HSSFWorkbook();
  49. // 生成一个表格
  50. HSSFSheet sheet = workbook.createSheet("Excel");
  51. // 设置表格默认列宽度为15个字节
  52. //sheet.setDefaultColumnWidth((short) 15);
  53. // 生成一个表格标题行样式
  54. HSSFCellStyle style = getColumnTopStyle(workbook);
  55. // 生成非标题样式
  56. HSSFCellStyle style2 = getColumnStyle(workbook);
  57. // 产生表格标题行
  58. HSSFRow row = sheet.createRow(0);
  59. for (short i = 0; i < headers.length; i++) {
  60. HSSFCell cell = row.createCell(i);
  61. cell.setCellStyle(style);
  62. HSSFRichTextString text = new HSSFRichTextString(headers[i]);
  63. cell.setCellValue(text);
  64. }
  65. // 遍历集合数据,产生数据行
  66. Iterator<Object[]> it = dataset.iterator();
  67. int index = 0;
  68. while (it.hasNext()) {
  69. index++;
  70. row = sheet.createRow(index);//从第1行开始创建
  71. Object[] obj = (Object[]) it.next();
  72. for (short i = 0; i < obj.length; i++) {
  73. HSSFCell cell = row.createCell(i);
  74. cell.setCellStyle(style2);
  75. Object value = obj[i];
  76. String textValue = null;
  77. if (!"".equals(value) && value != null) {
  78. if (value instanceof Integer) {
  79. int intValue = (Integer) value;
  80. cell.setCellValue(intValue);
  81. } else if (value instanceof Float) {
  82. float fValue = (Float) value;
  83. cell.setCellValue(fValue);
  84. } else if (value instanceof Double) {
  85. double dValue = (Double) value;
  86. cell.setCellValue(dValue);
  87. } else if (value instanceof Long) {
  88. long longValue = (Long) value;
  89. cell.setCellValue(longValue);
  90. } else if (value instanceof Date) {
  91. Date date = (Date) value;
  92. if(null==pattern||pattern.equals("")){
  93. pattern="yyyy-MM-dd";
  94. }
  95. SimpleDateFormat sdf = new SimpleDateFormat(pattern);
  96. textValue = sdf.format(date);
  97. cell.setCellValue(textValue);
  98. } else {
  99. // 其它数据类型都当作字符串简单处理
  100. textValue = value.toString();
  101. cell.setCellValue(textValue); // 设置单元格的值
  102. }
  103. } else {
  104. cell.setCellValue("");
  105. }
  106. }
  107. }
  108. //让列宽随着导出的列长自动适应
  109. for (int colNum = 0; colNum < headers.length; colNum++) {
  110. int columnWidth = sheet.getColumnWidth(colNum) / 256;
  111. for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
  112. HSSFRow currentRow;
  113. // 当前行未被使用过
  114. if (sheet.getRow(rowNum) == null) {
  115. currentRow = sheet.createRow(rowNum);
  116. } else {
  117. currentRow = sheet.getRow(rowNum);
  118. }
  119. if (currentRow.getCell(colNum) != null) {
  120. HSSFCell currentCell = currentRow.getCell(colNum);
  121. if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
  122. int length = currentCell.getStringCellValue() != null
  123. ? currentCell.getStringCellValue().getBytes().length : 10;
  124. if (columnWidth < length) {
  125. columnWidth = length;
  126. }
  127. }
  128. }
  129. }
  130. if (colNum == 0) {
  131. sheet.setColumnWidth(colNum, (columnWidth - 2) * 256);
  132. } else {
  133. sheet.setColumnWidth(colNum, (columnWidth + 4) * 256);
  134. }
  135. }
  136. try {
  137. if (createDir(docsPath)) {
  138. OutputStream out = new FileOutputStream(filePath);
  139. workbook.write(out);
  140. out.close();
  141. download(filePath, response);// 执行下载
  142. cleanFile(filePath);// 删除已完成下载的文件
  143. }
  144. }  catch (FileNotFoundException e) {
  145. e.printStackTrace();
  146. }catch (IOException e) {
  147. e.printStackTrace();
  148. }
  149. return workbook;
  150. }
  151. /**
  152. * 导出下载,弹出下载框
  153. * @param path  文件下载路径
  154. * @param response
  155. */
  156. public static void download(String path, HttpServletResponse response) {
  157. try {
  158. // path是指欲下载的文件的路径。
  159. File file = new File(path);
  160. // 取得文件名。
  161. String filename = file.getName();
  162. // 以流的形式下载文件。
  163. InputStream fis = new BufferedInputStream(new FileInputStream(path));
  164. byte[] buffer = new byte[fis.available()];
  165. fis.read(buffer);
  166. fis.close();
  167. // 清空response
  168. response.reset();
  169. // 设置response的Header
  170. response.addHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(filename, "UTF-8"));
  171. response.addHeader("Content-Length", "" + file.length());
  172. OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
  173. response.setContentType("application/vnd.ms-excel;charset=gb2312");
  174. toClient.write(buffer);
  175. toClient.flush();
  176. toClient.close();
  177. } catch (IOException ex) {
  178. ex.printStackTrace();
  179. }
  180. }
  181. /**
  182. * 清除文件
  183. * @param filePath  文件路径
  184. */
  185. public static  void cleanFile(String docsPath) {
  186. File file = new File(docsPath);
  187. file.delete();
  188. }
  189. /*
  190. * 列头单元格样式
  191. */
  192. public static HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) {
  193. // 设置样式;
  194. HSSFCellStyle style = workbook.createCellStyle();
  195. // 设置底边框;
  196. style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  197. // 设置底边框颜色;
  198. style.setBottomBorderColor(HSSFColor.BLACK.index);
  199. // 设置左边框;
  200. style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  201. // 设置左边框颜色;
  202. style.setLeftBorderColor(HSSFColor.BLACK.index);
  203. // 设置右边框;
  204. style.setBorderRight(HSSFCellStyle.BORDER_THIN);
  205. // 设置右边框颜色;
  206. style.setRightBorderColor(HSSFColor.BLACK.index);
  207. // 设置顶边框;
  208. style.setBorderTop(HSSFCellStyle.BORDER_THIN);
  209. // 设置顶边框颜色;
  210. style.setTopBorderColor(HSSFColor.BLACK.index);
  211. // 设置自动换行;
  212. style.setWrapText(false);
  213. // 设置水平对齐的样式为居中对齐;
  214. style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  215. // 设置垂直对齐的样式为居中对齐;
  216. style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
  217. // 设置字体
  218. HSSFFont font = workbook.createFont();
  219. // 设置字体颜色
  220. font.setColor(HSSFColor.VIOLET.index);
  221. // 设置字体大小
  222. font.setFontHeightInPoints((short) 12);
  223. // 字体加粗
  224. font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
  225. // 设置字体名字
  226. font.setFontName("Courier New");
  227. // 在样式用应用设置的字体;
  228. style.setFont(font);
  229. return style;
  230. }
  231. /*
  232. * 列数据信息单元格样式
  233. */
  234. public static HSSFCellStyle getColumnStyle(HSSFWorkbook workbook) {
  235. // 设置样式;
  236. HSSFCellStyle style = workbook.createCellStyle();
  237. // 设置底边框;
  238. style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  239. // 设置底边框颜色;
  240. style.setBottomBorderColor(HSSFColor.BLACK.index);
  241. // 设置左边框;
  242. style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  243. // 设置左边框颜色;
  244. style.setLeftBorderColor(HSSFColor.BLACK.index);
  245. // 设置右边框;
  246. style.setBorderRight(HSSFCellStyle.BORDER_THIN);
  247. // 设置右边框颜色;
  248. style.setRightBorderColor(HSSFColor.BLACK.index);
  249. // 设置顶边框;
  250. style.setBorderTop(HSSFCellStyle.BORDER_THIN);
  251. // 设置顶边框颜色;
  252. style.setTopBorderColor(HSSFColor.BLACK.index);
  253. // 设置自动换行;
  254. style.setWrapText(false);
  255. // 设置水平对齐的样式为居中对齐;
  256. style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  257. // 设置垂直对齐的样式为居中对齐;
  258. style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
  259. // 设置字体
  260. HSSFFont font = workbook.createFont();
  261. // 设置字体大小
  262. font.setFontHeightInPoints((short) 10);
  263. font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
  264. // 设置字体名字
  265. font.setFontName("Courier New");
  266. // 在样式用应用设置的字体;
  267. style.setFont(font);
  268. return style;
  269. }
  270. /**
  271. * 创建目录
  272. * @param destDirName
  273. * @return  true 存在目录  false 不存在目录
  274. */
  275. public static boolean createDir(String destDirName) {
  276. File dir = new File(destDirName);
  277. if (dir.exists()) {
  278. return true;
  279. }
  280. if (!destDirName.endsWith(File.separator)) {
  281. destDirName = destDirName + File.separator;
  282. }
  283. // 创建目录
  284. if (dir.mkdirs()) {
  285. System.out.println("创建目录" + destDirName + "成功!");
  286. return true;
  287. } else {
  288. System.out.println("创建目录" + destDirName + "失败!");
  289. return false;
  290. }
  291. }
  292. }

谷歌浏览器导出excel失败问题解决相关推荐

  1. php导出excel失败原因,PHPExcel中导出Excel出错的一种可能原因

    PHPExcel是PHP中功能最强大的导入.导出.操作Microsoft Excel的开源项目. 虽然,目前有很多方法能够在PHP页面上导出csv文件,但是经过测试发现使用通常方式在PHP中导出的Ex ...

  2. php导出excel失败原因,PHPExcel导出Excel文件报找不到该文件错误

    本文主要讲解关于PHPExcel兼容PHP版本和操作execl知识 目前解决问题:兼容PHP版本问题. 阐述下:小伙子我改bug的过程,如下:线下将代码写好(无错误),本地Apache服务器测试--& ...

  3. 导出excel失败,提示提示加载类型库/DDL出错

    首先,这里提供的解决办法仅适用于出现如下异常的情况: 无法将类型为"Microsoft.Office.Interop.Excel.ApplicationClass"的 COM 对象 ...

  4. HTTPS下导出excel失败解决办法

    要在导出文件名前加HttpUtility.UrlEncode 如下例 Response.AddHeader("Content-Disposition", "attachm ...

  5. 若依管理系统源码分析-导出Excel时怎样通过注解中readConverterExp实现格式化导出列的显示格式(0和1格式化为是否)

    场景 在数据库中存储某些个是否的字段时,有时会使用tinint进行存储 这样会在实体类中生成布尔类型的变量 private Boolean sfkt; 有时也会用int进行存储是否 那么在实体类中就可 ...

  6. Java导入导出Excel工具类ExcelUtil

    前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA(底层用hiberna ...

  7. springboot使用jxls导出excel___(万能通用模板)--- SpringBoot导入、导出Excel文件___SpringBoot整合EasyExcel模板导出Excel

    springboot使用jxls导出excel 实现思路: 首先在springBoot(或者SpringCloud)项目的默认templates目录放入提前定义好的Excel模板,然后在具体的导出接口 ...

  8. JAVA导入导出Excel

    导出就是将List转化为Excel(listToExcel) 导入就是将Excel转化为List(excelToList) 导入导出中会出现各种各样的问题,比如:数据源为空.有重复行等,所以自定义了一 ...

  9. ruoyi导入导出Excel

    导入导出excel:使用若依自带的工具ExcelUtil:(例子:SysUserController) 导入之前需要生成一个excel模板给用户填写(前端通过接口获取模板名字,再调用下载接口commo ...

最新文章

  1. 基于注解的 IOC 配置
  2. 2021-02-21 Python Easyocr 图片文字识别
  3. 博客园的博客终于开通了
  4. Notepad++ 快捷键 大全
  5. 用FastDFS一步步搭建文件管理系统
  6. (三十)java版spring cloud+spring boot+redis多租户社交电子商务平台- gateway限流
  7. [Python] 进制转换
  8. iphone编程,使用代码结束程序
  9. 网页设计html5实训心得,网页设计实习心得
  10. 化学实验中计算机技术的应用,数字化实验在化学教学中的应用
  11. 轨迹跟踪—线性 MPC 控制算法
  12. Image Enhancement
  13. python win32con_Python笔记_第二篇_面向过程_第二部分_4.常用模块的简单使用_窗体控制模块(win32con、win32gui)...
  14. 深圳店小秘Java后端面试
  15. 版本 3.1(最终版)
  16. Rk3326 Android8.0HAL服务添加
  17. Linux下的启动oracle服务 启动监听 开放端口操作
  18. web方向是.NET好还是java好_C#和.NET向JAVA好转吗?
  19. 动脉自旋标记磁共振成像在灌注和侧支循环检测的研究进展
  20. c语言--n的k次方

热门文章

  1. 程序员你不懂爱,博客园就要倒下来。。
  2. 云效知识库 Thoughts,企业文档管理工具
  3. 【线程池】自行准备linux环境,带你手写线程池,只需仅仅150行代码
  4. [Struts]学习日记2 - 增加一些验证
  5. 【3DSmax】3DSmax9基础建模教程—读书笔记3(第三课)
  6. 每个程序员应该彻底掌握的多线程编程(Linux C)
  7. 《Pragmatic Unit Testing In Java with JUnit》—单元测试之道读后感
  8. 您的服务器没有安装这个php扩展:curl ... failed,您的服务器没有安装这个PHP扩展:curl ... Failed...
  9. mysql的min函数的使用方法_MySQL中MIN()函数的使用教程_MySQL
  10. 外贸B2B 平台汇集