// Excel导出
public void xxx(xxVo xxVo, HttpServletResponse response) {
// 第一步:获取当前全部的查询结果
// 动态查询全部
List list = xxx;
// list数量大于Excel最大数量,返回数量超过限制
if (list.size() > excelMaxRows) {
// 输出流
OutputStream os = null;
try {
os = response.getOutputStream();
// 下面几行是为了解决文件名乱码的问题
response.setHeader("code", ResultCode.EXCEL_MAX_ROWS_FAIL.code().toString());
response.setHeader("message", URLEncoder.encode(ResultCode.EXCEL_MAX_ROWS_FAIL.message() + excelMaxRows, "UTF-8"));
return;
} catch (Exception e) {
log.error(ResultCode.IO_FAIL.message(), e);
} finally {
try {
if (os != null) {
os.close();
}
} catch (IOException e) {
log.error(ResultCode.IO_FAIL.message(), e);
}
}
}
// 第二步:将标题和值填充入Excel中
excelExport(xxVo.getHeaders(), list, response);
}
// 导出Excel
private void excelExport(List headers, List list,
HttpServletResponse response) {
// 文档对象
SXSSFWorkbook wb = null;
// 表单
Sheet sheet = null;
// 行
Row row = null;
// 单元格
Cell cell = null;
// 输出流
OutputStream os = null;
try {
// 默认100行,超100行将写入临时文件:后面可以自定义内存中写入的行数
wb = new SXSSFWorkbook();
// 是否压缩临时文件,否则写入速度更快,但更占磁盘,但程序最后是会将临时文件删掉的
wb.setCompressTempFiles(true);
// 创建表单:后面可以自定义名字
sheet = wb.createSheet();
// 创建第一行,填充表头
row = sheet.createRow(0);
// 遍历表头
for (int i = 0; i < headers.size(); i++) {
cell = row.createCell(i);
cell.setCellValue(headers.get(i).getLabel());
}
// 创建第二至N行,填充数据
for (int i = 0; i < list.size(); i++) {
row = sheet.createRow(i + 1);
for (int j = 0; j < headers.size(); j++) {
cell = row.createCell(j);
cell.setCellValue(getFieldValueByFieldName(list.get(i), headers.get(j).getProp()));
}
}
// 设置一个文件名
// 获取当前时间
String now = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
String fileName = "dfs" + now + ".xlsx";
// 输出Excel文件
os = response.getOutputStream();
// 下面几行是为了解决文件名乱码的问题
response.setHeader("Content-Disposition", "attachment;filename="
+ URLEncoder.encode(fileName, "UTF-8"));
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
// 关闭缓存
response.setHeader("Pragma", "no-cache");
// 关闭缓存
response.setHeader("Cache-Control", "no-cache");
// 为了让浏览器不要缓存页面,也可以利用Expires实体报关域,设置为0
response.setDateHeader("Expires", 0);
wb.write(os);
os.flush();
} catch (Exception e) {
log.error(ResultCode.IO_FAIL.message(), e);
} finally {
closeIO(wb, os);
}
}
// 关闭流
private void closeIO(SXSSFWorkbook wb, OutputStream os) {
if (wb != null) {
// 删除临时文件,很重要,否则磁盘可能会被写满
wb.dispose();
}
try {
if (os != null) {
os.close();
}
} catch (IOException e) {
log.error(ResultCode.IO_FAIL.message(), e);
}
try {
if (wb != null) {
wb.close();
}
} catch (IOException e) {
log.error(ResultCode.IO_FAIL.message(), e);
}
}
// 根据属性名获取属性值
private String getFieldValueByFieldName(Object object, String fieldName) {
String fieldValue = null;
try {
Field field = object.getClass().getDeclaredField(fieldName);
// 设置对象的访问权限,保证对private的属性的访问
field.setAccessible(true);
return field.get(object).toString();
} catch (Exception e) {
return fieldValue;
}
}
导出Excel
最新推荐文章于 2025-06-13 12:42:08 发布