研究了好几天,一开始使用工具类在本地可以导出,部署到服务器上就没有文件,真是醉了.我把过程写出来,希望可以让小伙伴们增加个思路.
导入导出都可以用,如果嫌少的话,可以去别的小伙伴文章多沾点哈哈
同一的版本
3.15
org.apache.poi
poi
${poi.version}
org.apache.poi
poi-ooxml
${poi.version}
org.apache.poi
poi-ooxml-schemas
${poi.version}
stax-api
stax
org.apache.poi
poi-ooxml
${poi.version}
org.apache.xmlbeans
xmlbeans
2.6.0
stax-api
stax
我把整个工具类的代码都放在里面了,别闲多,粘贴过去你就能用,我保你的哈哈,实在用不了那也没辙了哈哈
package com.platform.utils.excel;
import com.platform.utils.RRException;
import com.platform.utils.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.util.*;
/**
* 导出EXCEL功能包主类
* 使用POI进行EXCEL导出的功能类。
* 目前简单处理,未设置内存优化。 数据量偏大,出现性能问题时再处理。
*
* @author lipengjun
* @email [email protected]
* @date 2017年10月28日 13:11:27
*/
public class ExcelExport {
/**
* EXCEL 2003 扩展名
*/
public static final String EXCEL03_EXTENSION = ".xls";
/**
* EXCEL 2007 扩展名
*/
public static final String EXCEL07_EXTENSION = ".xls";
/**
* 工作表
*/
private Workbook workBook;
/**
* 导出文件名
*/
private String exportFileName;
/**
* 日志
*/
private Log logger = LogFactory.getLog(ExcelExport.class);
/**
* 默认构造方法。
* 自动生成工作表。
*/
public ExcelExport() {
this("workbook.xlsx");
}
/**
* 指定导出文件名的构造方法
* 指定导出文件名。 同时根据指定文件名的扩展名确定导出格式是03或是07 。
* 不带扩展名默认为07格式。(POI 07格式支持内存优化)
*
* @param exportFileName 要导出的文件名(带扩展名。不带扩展名默认为07)
*/
public ExcelExport(String exportFileName) {
if (StringUtils.isNullOrEmpty(exportFileName)) {
exportFileName = "workbook.xlsx";
}
String fileName = exportFileName.toLowerCase();
// 根据文件名扩展名生成EXCEL格式。
if (fileName.endsWith(ExcelExport.EXCEL03_EXTENSION)) {
workBook = new HSSFWorkbook();
} else if (exportFileName.endsWith(ExcelExport.EXCEL07_EXTENSION)) {
workBook = new XSSFWorkbook();
} else {
workBook = new XSSFWorkbook();
fileName += ".xlsx";
// 按正则替换? 处理文件名最后一个字符为“.” 的问题
// fileName = fileName.replaceAll("..", ".");
}
// 最后按小写文件名输出
this.exportFileName = fileName;
}
/**
* 主要功能: 导出EXCEL到response
* 注意事项:无
*
* @param response HttpServletResponse
*/
public void export(HttpServletResponse response) {
// response.setHeader("Content-Disposition","attachment;filename=totalExcel.xls");
response.reset();
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
// response.setContentType("text/html;charset=UTF-8");
// response.setContentType("APPLICATION/*");
String fileName = null;
// 处理编码
try {
//modify by ld 2017年4月10日19:04:37 根据浏览器编码文件名
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String userAgent = request.getHeader("User-Agent");
//针对IE或者以IE为内核的浏览器:
if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
fileName = URLEncoder.encode(exportFileName, "UTF-8");
} else {
//非IE浏览器的处理:
fileName = new String(exportFileName.getBytes("UTF-8"), "ISO-8859-1");
}
} catch (UnsupportedEncodingException e) {
fileName = "export.xls";
}
response.setHeader("Content-Disposition", "attachment;filename="
+ fileName);
ServletOutputStream output;
try {
output = response.getOutputStream();
workBook.write(output);
output.flush();
output.close();
} catch (IOException e) {
logger.error("导出文件出错了", e);
throw new RRException("文件导出错误");
}
}
/**
* 主要功能: 在EXCEL中添加一个Sheet
* 注意事项:添加Sheet 并将List
这个就是比较折磨了,刚开始查阅资料,有用异步的,有用跳转的,我也用了异步发现这个下载框就是弹不出来,改进后,后端代码也不用返回值,改成跳转的了,上代码
导出Excel
这是我后端需要的参数,使用vue做的,你们正常拼接你们定义的参数就行
submit: function () {
location.href = "../black/export?carNo=" + vm.q.carNo + "&createTime=" + vm.q.createTime + "&stopTime=" + vm.q.stopTime
+ "&createMoney=" + vm.q.createMoney + "&stopMoney=" + vm.q.stopMoney + "&num=" + vm.q.num + "&mobile=" + vm.q.mobile;
}
体类改成你自己的就ok了
/**
* 黑名单导出功能
*/
@RequestMapping("/export")
public void exportStudent(HttpServletResponse response, HttpServletRequest request) {
Map params = new HashMap<>();
params.put("carNo",request.getParameter("carNo"));
params.put("createTime",request.getParameter("createTime"));
params.put("stopTime",request.getParameter("stopTime"));
params.put("createMoney",request.getParameter("createMoney"));
params.put("stopMoney",request.getParameter("stopMoney"));
params.put("num",request.getParameter("num"));
params.put("mobile",request.getParameter("mobile"));
String filename = "黑名单列表";
List blackList = blackService.queryAllList(params);
ExcelExport ee1 = new ExcelExport();
List list1 = new ArrayList();
List obj = new ArrayList();
for (CarBlack carBlack : blackList) {
obj.add(carBlack.getId());
obj.add(carBlack.getCarNo());
obj.add(carBlack.getDebtSum() / 100);
obj.add(carBlack.getDebtCount());
obj.add(carBlack.getCreateTime());
obj.add(carBlack.getUserName());
obj.add(carBlack.getMobile());
list1.add(obj.toArray());
obj.clear();
}
String[] header = new String[]{"编号", "车牌号", "欠费金额(元)", "欠费次数", "欠费生成时间", "车主姓名",
"手机号码"};
ee1.addSheetByArray("黑名单列表", list1, header);
ee1.export(response);