@Slf4j
@Component
public class ExcelUtil {
@Value("${excel_max_rows}")
private static int excelMaxRows;
private static final int EXCEL_MAX_ROWS = excelMaxRows;
/**
* 导出Excel
*
* @param labels 表名
* @param props 表属性
* @param list 表数据
* @param fileNamePre 文件名前缀
* @param response 响应
* @param <T> 集合类型
*/
public static <T> void excelExport(String[] labels, String[] props, List<T> list, String fileNamePre,
HttpServletResponse response) {
// list数量大于Excel最大数量,返回数量超过限制
if (list.size() > EXCEL_MAX_ROWS) {
// Excel最大行数超出返回
excelRowsOverReturn(response);
return;
}
// 文档对象
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 < labels.length; i++) {
cell = row.createCell(i);
cell.setCellValue(labels[i]);
}
// 创建第二至N行,填充数据
for (int i = 0; i < list.size(); i++) {
row = sheet.createRow(i + 1);
for (int j = 0; j < labels.length; j++) {
cell = row.createCell(j);
cell.setCellValue(getFieldValueByFieldName(list.get(i), props[j]));
}
}
// 设置一个文件名
// 获取当前时间
String now = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
String fileName = fileNamePre + 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);
}
}
// Excel最大行数超出返回
private static void excelRowsOverReturn(HttpServletResponse response) {
// 输出流
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() + EXCEL_MAX_ROWS, "UTF-8"));
} 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);
}
}
}
// 根据属性名获取属性值
private static 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;
}
}
// 关闭流
private static 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);
}
}
}
通用导出Excel
最新推荐文章于 2024-08-22 17:36:28 发布