|
@@ -0,0 +1,323 @@
|
|
|
+package com.itheima.file.util;
|
|
|
+
|
|
|
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
|
|
|
+import cn.afterturn.easypoi.excel.ExcelImportUtil;
|
|
|
+import cn.afterturn.easypoi.excel.entity.ExportParams;
|
|
|
+import cn.afterturn.easypoi.excel.entity.ImportParams;
|
|
|
+import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
|
|
|
+import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.apache.poi.ss.formula.functions.T;
|
|
|
+import org.apache.poi.ss.usermodel.Workbook;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
+
|
|
|
+import javax.servlet.ServletOutputStream;
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
+import java.io.File;
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.InputStream;
|
|
|
+import java.net.URLEncoder;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.NoSuchElementException;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author XuPengFei
|
|
|
+ */
|
|
|
+public class ExcelUtils {
|
|
|
+ /**
|
|
|
+ * excel 导出
|
|
|
+ *
|
|
|
+ * @param list 数据
|
|
|
+ * @param title 标题
|
|
|
+ * @param sheetName sheet名称
|
|
|
+ * @param pojoClass pojo类型
|
|
|
+ * @param fileName 文件名称
|
|
|
+ * @param isCreateHeader 是否创建表头
|
|
|
+ * @param response
|
|
|
+ */
|
|
|
+ public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response) throws IOException {
|
|
|
+ ExportParams exportParams = new ExportParams(title, sheetName, ExcelType.XSSF);
|
|
|
+ exportParams.setCreateHeadRows(isCreateHeader);
|
|
|
+ defaultExport(list, pojoClass, fileName, response, exportParams);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * excel 导出
|
|
|
+ *
|
|
|
+ * @param list 数据
|
|
|
+ * @param title 标题
|
|
|
+ * @param sheetName sheet名称
|
|
|
+ * @param pojoClass pojo类型
|
|
|
+ * @param fileName 文件名称
|
|
|
+ * @param response
|
|
|
+ */
|
|
|
+ public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, HttpServletResponse response) throws IOException {
|
|
|
+ ExportParams params = new ExportParams(title, sheetName, ExcelType.XSSF);
|
|
|
+
|
|
|
+ defaultExport(list, pojoClass, fileName, response, params);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * excel 导出
|
|
|
+ *
|
|
|
+ * @param list 数据
|
|
|
+ * @param pojoClass pojo类型
|
|
|
+ * @param fileName 文件名称
|
|
|
+ * @param response
|
|
|
+ * @param exportParams 导出参数
|
|
|
+ */
|
|
|
+ public static void exportExcel(List<?> list, Class<?> pojoClass, String fileName, ExportParams exportParams, HttpServletResponse response) throws IOException {
|
|
|
+ defaultExport(list, pojoClass, fileName, response, exportParams);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * excel 导出
|
|
|
+ *
|
|
|
+ * @param list 数据
|
|
|
+ * @param fileName 文件名称
|
|
|
+ * @param response
|
|
|
+ */
|
|
|
+ public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response) throws IOException {
|
|
|
+ defaultExport(list, fileName, response);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认的 excel 导出
|
|
|
+ *
|
|
|
+ * @param list 数据
|
|
|
+ * @param pojoClass pojo类型
|
|
|
+ * @param fileName 文件名称
|
|
|
+ * @param response
|
|
|
+ * @param exportParams 导出参数
|
|
|
+ */
|
|
|
+ private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) throws IOException {
|
|
|
+ Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
|
|
|
+ downLoadExcel(fileName, response, workbook);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认的 excel 导出
|
|
|
+ *
|
|
|
+ * @param list 数据
|
|
|
+ * @param fileName 文件名称
|
|
|
+ * @param response
|
|
|
+ */
|
|
|
+ private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) throws IOException {
|
|
|
+ Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
|
|
|
+ downLoadExcel(fileName, response, workbook);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 下载
|
|
|
+ *
|
|
|
+ * @param fileName 文件名称
|
|
|
+ * @param response
|
|
|
+ * @param workbook excel数据
|
|
|
+ */
|
|
|
+ public static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) throws IOException {
|
|
|
+ try {
|
|
|
+ response.setCharacterEncoding("UTF-8");
|
|
|
+ response.setHeader("content-Type", "application/vnd.ms-excel");
|
|
|
+ response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + "." + ExcelTypeEnum.XLSX.getValue(), "UTF-8"));
|
|
|
+ workbook.write(response.getOutputStream());
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new IOException(e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * excel 导入
|
|
|
+ *
|
|
|
+ * @param filePath excel文件路径
|
|
|
+ * @param titleRows 标题行
|
|
|
+ * @param headerRows 表头行
|
|
|
+ * @param pojoClass pojo类型
|
|
|
+ * @param <T>
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> pojoClass) throws IOException {
|
|
|
+ if (StringUtils.isBlank(filePath)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ ImportParams params = new ImportParams();
|
|
|
+ params.setTitleRows(titleRows);
|
|
|
+ params.setHeadRows(headerRows);
|
|
|
+ params.setNeedSave(true);
|
|
|
+ params.setSaveUrl("/excel/");
|
|
|
+ try {
|
|
|
+ return ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);
|
|
|
+ } catch (NoSuchElementException e) {
|
|
|
+ throw new IOException("模板不能为空");
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new IOException(e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * excel 导入
|
|
|
+ *
|
|
|
+ * @param file excel文件
|
|
|
+ * @param pojoClass pojo类型
|
|
|
+ * @param <T>
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static <T> List<T> importExcel(MultipartFile file, Class<T> pojoClass) throws IOException {
|
|
|
+ return importExcel(file, 1, 1, pojoClass);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * excel 导入
|
|
|
+ *
|
|
|
+ * @param file excel文件
|
|
|
+ * @param titleRows 标题行
|
|
|
+ * @param headerRows 表头行
|
|
|
+ * @param pojoClass pojo类型
|
|
|
+ * @param <T>
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass) throws IOException {
|
|
|
+ return importExcel(file, titleRows, headerRows, false, pojoClass);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * excel 导入
|
|
|
+ *
|
|
|
+ * @param file 上传的文件
|
|
|
+ * @param titleRows 标题行
|
|
|
+ * @param headerRows 表头行
|
|
|
+ * @param needVerfiy 是否检验excel内容
|
|
|
+ * @param pojoClass pojo类型
|
|
|
+ * @param <T>
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, boolean needVerfiy, Class<T> pojoClass) throws IOException {
|
|
|
+ if (file == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ return importExcel(file.getInputStream(), titleRows, headerRows, needVerfiy, pojoClass);
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new IOException(e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * excel 导入
|
|
|
+ *
|
|
|
+ * @param inputStream 文件输入流
|
|
|
+ * @param titleRows 标题行
|
|
|
+ * @param headerRows 表头行
|
|
|
+ * @param needVerfiy 是否检验excel内容
|
|
|
+ * @param pojoClass pojo类型
|
|
|
+ * @param <T>
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static <T> List<T> importExcel(InputStream inputStream, Integer titleRows, Integer headerRows, boolean needVerfiy, Class<T> pojoClass) throws IOException {
|
|
|
+ if (inputStream == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ ImportParams params = new ImportParams();
|
|
|
+ params.setTitleRows(titleRows);
|
|
|
+ params.setHeadRows(headerRows);
|
|
|
+ params.setSaveUrl("/excel/");
|
|
|
+ params.setNeedSave(true);
|
|
|
+ try {
|
|
|
+ return ExcelImportUtil.importExcel(inputStream, pojoClass, params);
|
|
|
+ } catch (NoSuchElementException e) {
|
|
|
+ throw new IOException("excel文件不能为空");
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new IOException(e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static <T> List<T> importExcel111(InputStream inputStream, Integer titleRows, Integer headerRows, boolean needVerfiy, Class<T> pojoClass) throws IOException {
|
|
|
+ if (inputStream == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ ImportParams params = new ImportParams();
|
|
|
+ params.setTitleRows(titleRows);
|
|
|
+ params.setHeadRows(headerRows);
|
|
|
+ params.setSaveUrl("/excel/");
|
|
|
+ params.setNeedSave(true);
|
|
|
+ try {
|
|
|
+ return ExcelImportUtil.importExcel(inputStream, pojoClass, params);
|
|
|
+ } catch (NoSuchElementException e) {
|
|
|
+ throw new IOException("excel文件不能为空");
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new IOException(e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Excel 类型枚举
|
|
|
+ */
|
|
|
+ enum ExcelTypeEnum {
|
|
|
+ /**
|
|
|
+ * XLS格式
|
|
|
+ */
|
|
|
+ XLS("xls"), XLSX("xlsx");
|
|
|
+ private String value;
|
|
|
+
|
|
|
+ ExcelTypeEnum(String value) {
|
|
|
+ this.value = value;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getValue() {
|
|
|
+ return value;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setValue(String value) {
|
|
|
+ this.value = value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 小雨: 导入后返回失败的数据
|
|
|
+ */
|
|
|
+ public static <T> void downLoadFailExcel(ExcelImportResult<T> result, HttpServletResponse response) throws IOException {
|
|
|
+ /**
|
|
|
+ * 验证失败的就返回给前端用户,并且带有错误消息提示内容
|
|
|
+ */
|
|
|
+ if (result.isVerifyFail()) {
|
|
|
+ /**
|
|
|
+ * 验证是否有失败,文件下载功能:将验证失败的数据放入excel文件中,让用户下载
|
|
|
+ */
|
|
|
+ response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
|
|
+ response.setHeader("Content-disposition", "attachment;filename=errors.xlsx");
|
|
|
+ response.setHeader("Pragma", "No-cache");
|
|
|
+ ServletOutputStream fos = null;
|
|
|
+ try {
|
|
|
+ fos = response.getOutputStream();
|
|
|
+ //直接获取验证失败的那个Workbook对象
|
|
|
+ result.getFailWorkbook().write(fos);
|
|
|
+ fos.close();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static <T> void downLoadVolFailExcel(ExcelImportResult<T> result, HttpServletResponse response, Class<T> pojoClass) throws IOException {
|
|
|
+ /**
|
|
|
+ * 验证失败的就返回给前端用户,并且带有错误消息提示内容,文件下载功能:将验证失败的数据放入excel文件中,让用户下载
|
|
|
+ */
|
|
|
+ if (result.isVerifyFail()) {
|
|
|
+ response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
|
|
+ response.setHeader("Content-disposition", "attachment;filename=errors.xlsx");
|
|
|
+ response.setHeader("Pragma", "No-cache");
|
|
|
+ ServletOutputStream fos = null;
|
|
|
+ try {
|
|
|
+ fos = response.getOutputStream();
|
|
|
+ /**
|
|
|
+ * 直接获取验证失败的那个Workbook对象
|
|
|
+ */
|
|
|
+ result.getFailWorkbook().write(fos);
|
|
|
+ fos.close();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|