谷歌浏览器导出excel失败问题解决
问题描述:
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代码
- <dependency>
- <groupId>org.apache.poi</groupId>
- <artifactId>poi</artifactId>
- <version>3.13</version>
- </dependency>
第二步:jsp页面使用from表单请求
Html代码
- <form id="form_stock" action="${contextPath}/stock/toExportExcel">
- ...............
- </form>
第三步:设计controller
Java代码
- @RequestMapping("toExportExcel")
- public void exportExcel(StockExt stockExt,HttpServletRequest request, HttpServletResponse response) {
- List<Stock> list = stockService.queryList(stockExt);
- String[] rowsName = new String[] {"序号","货号","品名","规格","颜色","单位","批号","库存量","仓库","库位","单类型","所属客户","入库时间","实际库存量"};
- List<Object[]> dataList = new ArrayList<Object[]>();
- for (int i = 0; i < list.size(); i++) {
- Object[] objs = new Object[rowsName.length];// 创建13个数组长度
- StockVo sto = listVo.get(i);
- objs[0] = i;
- objs[1] = sto.getCargoNum();// 货号
- objs[2] = sto.getCargoName();// 品名
- objs[3] = sto.getCargoSpecifications();// 规格
- objs[4] = sto.getCargoColor();// 颜色
- objs[5] = sto.getUnitsName();// 单位
- objs[6] = TimeUtil.getTime(sto.getManufactureDate(), "yyyyMMdd");// 批号
- objs[7] = sto.getStockAmount();
- objs[8] = sto.getStorageName();// 仓库
- objs[9] = sto.getDepotName();// 库位
- objs[10] = (sto.getIsLoss() == 1) ? "库存单" : "报损单";
- objs[11] = sto.getNickName();// 所属客户
- objs[12] = sto.getModifyDate();
- objs[13] = "";// 留给仓管员导出人员任意填写
- dataList.add(objs);
- }
- String fileName = "库存单";
- //执行导出
- ExportExcel.exportExcel(request,response,fileName, rowsName, dataList, "yyyy-MM-dd HH:mm:ss");
- }
上面代码中,我们只要生成exportExcel方法里对应的3个参数就可以了,这个根据你代码灵活配置。
第四步:实现exportExcel方法
Java代码
- package com.honsend.common.jsp.poi;
- import java.io.BufferedInputStream;
- import java.io.BufferedOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.URLEncoder;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.Iterator;
- import java.util.List;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.poi.hssf.usermodel.HSSFCell;
- import org.apache.poi.hssf.usermodel.HSSFCellStyle;
- import org.apache.poi.hssf.usermodel.HSSFFont;
- import org.apache.poi.hssf.usermodel.HSSFRichTextString;
- import org.apache.poi.hssf.usermodel.HSSFRow;
- import org.apache.poi.hssf.usermodel.HSSFSheet;
- import org.apache.poi.hssf.usermodel.HSSFWorkbook;
- import org.apache.poi.hssf.util.HSSFColor;
- import com.honsend.common.NumberUtil;
- import com.honsend.common.TimeUtil;
- /**
- * 利用开源组件POI3.13动态导出EXCEL文档
- *
- * @version v1.0
- * @param
- * */
- public class ExportExcel {
- public static final String FILE_SEPARATOR = System.getProperties().getProperty("file.separator");
- /**
- * 这是一个通用的方法
- * @param fileName 文件名
- * @param headers 表格属性列名数组
- * @param dataset 需要显示的数据集合
- * @param pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
- */
- @SuppressWarnings("deprecation")
- public static HSSFWorkbook exportExcel(HttpServletRequest request,HttpServletResponse response,String fileName, String[] headers, List<Object[]> dataset, String pattern) {
- String docsPath = request.getSession().getServletContext().getRealPath("docs");//docs文件夹目录
- String filePath = docsPath + FILE_SEPARATOR + fileName+"-任意名.xls";
- // 声明一个工作薄
- HSSFWorkbook workbook = new HSSFWorkbook();
- // 生成一个表格
- HSSFSheet sheet = workbook.createSheet("Excel");
- // 设置表格默认列宽度为15个字节
- //sheet.setDefaultColumnWidth((short) 15);
- // 生成一个表格标题行样式
- HSSFCellStyle style = getColumnTopStyle(workbook);
- // 生成非标题样式
- HSSFCellStyle style2 = getColumnStyle(workbook);
- // 产生表格标题行
- HSSFRow row = sheet.createRow(0);
- for (short i = 0; i < headers.length; i++) {
- HSSFCell cell = row.createCell(i);
- cell.setCellStyle(style);
- HSSFRichTextString text = new HSSFRichTextString(headers[i]);
- cell.setCellValue(text);
- }
- // 遍历集合数据,产生数据行
- Iterator<Object[]> it = dataset.iterator();
- int index = 0;
- while (it.hasNext()) {
- index++;
- row = sheet.createRow(index);//从第1行开始创建
- Object[] obj = (Object[]) it.next();
- for (short i = 0; i < obj.length; i++) {
- HSSFCell cell = row.createCell(i);
- cell.setCellStyle(style2);
- Object value = obj[i];
- String textValue = null;
- if (!"".equals(value) && value != null) {
- if (value instanceof Integer) {
- int intValue = (Integer) value;
- cell.setCellValue(intValue);
- } else if (value instanceof Float) {
- float fValue = (Float) value;
- cell.setCellValue(fValue);
- } else if (value instanceof Double) {
- double dValue = (Double) value;
- cell.setCellValue(dValue);
- } else if (value instanceof Long) {
- long longValue = (Long) value;
- cell.setCellValue(longValue);
- } else if (value instanceof Date) {
- Date date = (Date) value;
- if(null==pattern||pattern.equals("")){
- pattern="yyyy-MM-dd";
- }
- SimpleDateFormat sdf = new SimpleDateFormat(pattern);
- textValue = sdf.format(date);
- cell.setCellValue(textValue);
- } else {
- // 其它数据类型都当作字符串简单处理
- textValue = value.toString();
- cell.setCellValue(textValue); // 设置单元格的值
- }
- } else {
- cell.setCellValue("");
- }
- }
- }
- //让列宽随着导出的列长自动适应
- for (int colNum = 0; colNum < headers.length; colNum++) {
- int columnWidth = sheet.getColumnWidth(colNum) / 256;
- for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
- HSSFRow currentRow;
- // 当前行未被使用过
- if (sheet.getRow(rowNum) == null) {
- currentRow = sheet.createRow(rowNum);
- } else {
- currentRow = sheet.getRow(rowNum);
- }
- if (currentRow.getCell(colNum) != null) {
- HSSFCell currentCell = currentRow.getCell(colNum);
- if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
- int length = currentCell.getStringCellValue() != null
- ? currentCell.getStringCellValue().getBytes().length : 10;
- if (columnWidth < length) {
- columnWidth = length;
- }
- }
- }
- }
- if (colNum == 0) {
- sheet.setColumnWidth(colNum, (columnWidth - 2) * 256);
- } else {
- sheet.setColumnWidth(colNum, (columnWidth + 4) * 256);
- }
- }
- try {
- if (createDir(docsPath)) {
- OutputStream out = new FileOutputStream(filePath);
- workbook.write(out);
- out.close();
- download(filePath, response);// 执行下载
- cleanFile(filePath);// 删除已完成下载的文件
- }
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }catch (IOException e) {
- e.printStackTrace();
- }
- return workbook;
- }
- /**
- * 导出下载,弹出下载框
- * @param path 文件下载路径
- * @param response
- */
- public static void download(String path, HttpServletResponse response) {
- try {
- // path是指欲下载的文件的路径。
- File file = new File(path);
- // 取得文件名。
- String filename = file.getName();
- // 以流的形式下载文件。
- InputStream fis = new BufferedInputStream(new FileInputStream(path));
- byte[] buffer = new byte[fis.available()];
- fis.read(buffer);
- fis.close();
- // 清空response
- response.reset();
- // 设置response的Header
- response.addHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(filename, "UTF-8"));
- response.addHeader("Content-Length", "" + file.length());
- OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
- response.setContentType("application/vnd.ms-excel;charset=gb2312");
- toClient.write(buffer);
- toClient.flush();
- toClient.close();
- } catch (IOException ex) {
- ex.printStackTrace();
- }
- }
- /**
- * 清除文件
- * @param filePath 文件路径
- */
- public static void cleanFile(String docsPath) {
- File file = new File(docsPath);
- file.delete();
- }
- /*
- * 列头单元格样式
- */
- public static HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) {
- // 设置样式;
- HSSFCellStyle style = workbook.createCellStyle();
- // 设置底边框;
- style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
- // 设置底边框颜色;
- style.setBottomBorderColor(HSSFColor.BLACK.index);
- // 设置左边框;
- style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
- // 设置左边框颜色;
- style.setLeftBorderColor(HSSFColor.BLACK.index);
- // 设置右边框;
- style.setBorderRight(HSSFCellStyle.BORDER_THIN);
- // 设置右边框颜色;
- style.setRightBorderColor(HSSFColor.BLACK.index);
- // 设置顶边框;
- style.setBorderTop(HSSFCellStyle.BORDER_THIN);
- // 设置顶边框颜色;
- style.setTopBorderColor(HSSFColor.BLACK.index);
- // 设置自动换行;
- style.setWrapText(false);
- // 设置水平对齐的样式为居中对齐;
- style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
- // 设置垂直对齐的样式为居中对齐;
- style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
- // 设置字体
- HSSFFont font = workbook.createFont();
- // 设置字体颜色
- font.setColor(HSSFColor.VIOLET.index);
- // 设置字体大小
- font.setFontHeightInPoints((short) 12);
- // 字体加粗
- font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
- // 设置字体名字
- font.setFontName("Courier New");
- // 在样式用应用设置的字体;
- style.setFont(font);
- return style;
- }
- /*
- * 列数据信息单元格样式
- */
- public static HSSFCellStyle getColumnStyle(HSSFWorkbook workbook) {
- // 设置样式;
- HSSFCellStyle style = workbook.createCellStyle();
- // 设置底边框;
- style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
- // 设置底边框颜色;
- style.setBottomBorderColor(HSSFColor.BLACK.index);
- // 设置左边框;
- style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
- // 设置左边框颜色;
- style.setLeftBorderColor(HSSFColor.BLACK.index);
- // 设置右边框;
- style.setBorderRight(HSSFCellStyle.BORDER_THIN);
- // 设置右边框颜色;
- style.setRightBorderColor(HSSFColor.BLACK.index);
- // 设置顶边框;
- style.setBorderTop(HSSFCellStyle.BORDER_THIN);
- // 设置顶边框颜色;
- style.setTopBorderColor(HSSFColor.BLACK.index);
- // 设置自动换行;
- style.setWrapText(false);
- // 设置水平对齐的样式为居中对齐;
- style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
- // 设置垂直对齐的样式为居中对齐;
- style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
- // 设置字体
- HSSFFont font = workbook.createFont();
- // 设置字体大小
- font.setFontHeightInPoints((short) 10);
- font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
- // 设置字体名字
- font.setFontName("Courier New");
- // 在样式用应用设置的字体;
- style.setFont(font);
- return style;
- }
- /**
- * 创建目录
- * @param destDirName
- * @return true 存在目录 false 不存在目录
- */
- public static boolean createDir(String destDirName) {
- File dir = new File(destDirName);
- if (dir.exists()) {
- return true;
- }
- if (!destDirName.endsWith(File.separator)) {
- destDirName = destDirName + File.separator;
- }
- // 创建目录
- if (dir.mkdirs()) {
- System.out.println("创建目录" + destDirName + "成功!");
- return true;
- } else {
- System.out.println("创建目录" + destDirName + "失败!");
- return false;
- }
- }
- }
谷歌浏览器导出excel失败问题解决相关推荐
- php导出excel失败原因,PHPExcel中导出Excel出错的一种可能原因
PHPExcel是PHP中功能最强大的导入.导出.操作Microsoft Excel的开源项目. 虽然,目前有很多方法能够在PHP页面上导出csv文件,但是经过测试发现使用通常方式在PHP中导出的Ex ...
- php导出excel失败原因,PHPExcel导出Excel文件报找不到该文件错误
本文主要讲解关于PHPExcel兼容PHP版本和操作execl知识 目前解决问题:兼容PHP版本问题. 阐述下:小伙子我改bug的过程,如下:线下将代码写好(无错误),本地Apache服务器测试--& ...
- 导出excel失败,提示提示加载类型库/DDL出错
首先,这里提供的解决办法仅适用于出现如下异常的情况: 无法将类型为"Microsoft.Office.Interop.Excel.ApplicationClass"的 COM 对象 ...
- HTTPS下导出excel失败解决办法
要在导出文件名前加HttpUtility.UrlEncode 如下例 Response.AddHeader("Content-Disposition", "attachm ...
- 若依管理系统源码分析-导出Excel时怎样通过注解中readConverterExp实现格式化导出列的显示格式(0和1格式化为是否)
场景 在数据库中存储某些个是否的字段时,有时会使用tinint进行存储 这样会在实体类中生成布尔类型的变量 private Boolean sfkt; 有时也会用int进行存储是否 那么在实体类中就可 ...
- Java导入导出Excel工具类ExcelUtil
前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA(底层用hiberna ...
- springboot使用jxls导出excel___(万能通用模板)--- SpringBoot导入、导出Excel文件___SpringBoot整合EasyExcel模板导出Excel
springboot使用jxls导出excel 实现思路: 首先在springBoot(或者SpringCloud)项目的默认templates目录放入提前定义好的Excel模板,然后在具体的导出接口 ...
- JAVA导入导出Excel
导出就是将List转化为Excel(listToExcel) 导入就是将Excel转化为List(excelToList) 导入导出中会出现各种各样的问题,比如:数据源为空.有重复行等,所以自定义了一 ...
- ruoyi导入导出Excel
导入导出excel:使用若依自带的工具ExcelUtil:(例子:SysUserController) 导入之前需要生成一个excel模板给用户填写(前端通过接口获取模板名字,再调用下载接口commo ...
最新文章
- 基于注解的 IOC 配置
- 2021-02-21 Python Easyocr 图片文字识别
- 博客园的博客终于开通了
- Notepad++ 快捷键 大全
- 用FastDFS一步步搭建文件管理系统
- (三十)java版spring cloud+spring boot+redis多租户社交电子商务平台- gateway限流
- [Python] 进制转换
- iphone编程,使用代码结束程序
- 网页设计html5实训心得,网页设计实习心得
- 化学实验中计算机技术的应用,数字化实验在化学教学中的应用
- 轨迹跟踪—线性 MPC 控制算法
- Image Enhancement
- python win32con_Python笔记_第二篇_面向过程_第二部分_4.常用模块的简单使用_窗体控制模块(win32con、win32gui)...
- 深圳店小秘Java后端面试
- 版本 3.1(最终版)
- Rk3326 Android8.0HAL服务添加
- Linux下的启动oracle服务 启动监听 开放端口操作
- web方向是.NET好还是java好_C#和.NET向JAVA好转吗?
- 动脉自旋标记磁共振成像在灌注和侧支循环检测的研究进展
- c语言--n的k次方
热门文章
- 程序员你不懂爱,博客园就要倒下来。。
- 云效知识库 Thoughts,企业文档管理工具
- 【线程池】自行准备linux环境,带你手写线程池,只需仅仅150行代码
- [Struts]学习日记2 - 增加一些验证
- 【3DSmax】3DSmax9基础建模教程—读书笔记3(第三课)
- 每个程序员应该彻底掌握的多线程编程(Linux C)
- 《Pragmatic Unit Testing In Java with JUnit》—单元测试之道读后感
- 您的服务器没有安装这个php扩展:curl ... failed,您的服务器没有安装这个PHP扩展:curl ... Failed...
- mysql的min函数的使用方法_MySQL中MIN()函数的使用教程_MySQL
- 外贸B2B 平台汇集