网站首页 > java教程 正文
1、pom.xml中引入相关依赖
<!-- jxls导出导入读取excel报表 -->
<!-- https://mvnrepository.com/artifact/org.jxls/jxls -->
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls</artifactId>
<version>2.8.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jxls/jxls-poi -->
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>2.8.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jxls/jxls-jexcel -->
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-jexcel</artifactId>
<version>1.0.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jxls/jxls-reader -->
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-reader</artifactId>
<version>2.0.6</version>
</dependency>
2、Excel导入导出工具类
import cn.hutool.core.io.FileUtil;
import com.zhengqing.demo.Constants;
import com.zhengqing.demo.enums.ExcelExportFileTypeEnum;
import com.zhengqing.demo.enums.ExcelImportFileTypeEnum;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.jxls.common.Context;
import org.jxls.reader.ReaderBuilder;
import org.jxls.reader.XLSReadStatus;
import org.jxls.reader.XLSReader;
import org.jxls.transform.poi.PoiTransformer;
import org.jxls.util.JxlsHelper;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.multipart.MultipartFile;
/**
* <p>
* 导入导出Excel报表工具类
* </p>
*
* @author : zhengqing
* @description :
* @date : 2020/9/7 14:26
*/
@Slf4j
public class ExcelUtil {
/**
* 读取上传文件数据
*
* @param dataList:
* 数据
* @param excelImportFileTypeEnum:
* 导入报表模板类型
* @param file:
* 上传文件数据
* @param isThrowException:
* 遇到错误是否抛出异常信息 true:抛出 false:不抛,继续处理数据
* @return: 装满数据的dataList
* @author : zhengqing
* @date : 2020/9/7 13:59
*/
@SneakyThrows(Exception.class)
public static <E, T> List<T> read(List<T> dataList, ExcelImportFileTypeEnum excelImportFileTypeEnum,
MultipartFile file, boolean isThrowException) {
String fileName = file.getName();
InputStream inputXLS = null;
InputStream inputXML = null;
try {
Resource resource =
new ClassPathResource(Constants.DEFAULT_REPORT_IMPORT_FOLDER + excelImportFileTypeEnum.getMappingXml());
// 上传文件流
inputXLS = file.getInputStream();
// xml配置文件流
inputXML = resource.getInputStream();
// 执行解析
XLSReader mainReader = ReaderBuilder.buildFromXML(inputXML);
Map<String, Object> beans = new HashMap<>(1);
beans.put("dataList", dataList);
XLSReadStatus readStatus = mainReader.read(inputXLS, beans);
if (readStatus.isStatusOK()) {
log.debug("读取excel文件成功: 【{}】", fileName);
}
} catch (Exception e) {
// ① 记录错误位置
String errorCell = e.getMessage().split(" ")[3];
// ② 记录错误原因
String errorMsg = e.getCause().toString();
String[] causeMsgArray = errorMsg.split(":");
errorMsg = errorMsg.substring(causeMsgArray[0].length() + 2).split(":")[0];
switch (errorMsg) {
case "For input string":
errorMsg = "时间格式不正确";
break;
case "Error converting from 'String' to 'Integer' For input string":
errorMsg = "请填写数字类型";
break;
default:
break;
}
errorMsg = "读取" + fileName + "文件异常: " + errorCell + errorMsg;
if (isThrowException) {
throw new Exception(errorMsg);
} else {
log.error(errorMsg);
}
} finally {
try {
if (inputXLS != null) {
inputXLS.close();
}
if (inputXML != null) {
inputXML.close();
}
} catch (IOException e) {
log.error("parse excel error : 【{}】", e.getMessage());
}
}
return dataList;
}
/**
* 导出EXCEL到指定路径
*
* @param dataList:
* 数据
* @param excelExportFileTypeEnum:
* 导出报表模板类型
* @param exportPath:
* 导出路径
* @return: 文件下载地址信息
* @author : zhengqing
* @date : 2020/9/7 13:59
*/
@SneakyThrows(Exception.class)
public static String export(List<Map<String, Object>> dataList, ExcelExportFileTypeEnum excelExportFileTypeEnum,
String exportPath) {
// 处理导出
File exportFile = handleExport(dataList, excelExportFileTypeEnum, exportPath);
String fileName = excelExportFileTypeEnum.getSheetName() + ".xls";
// TODO 这里可以对`exportFile`做文件上传处理,然后返回一个文件下载地址 或其它业务处理...
return exportFile.getAbsolutePath();
}
/**
* 导出EXCEL给前端直接下载
*
* @param dataList:
* 数据
* @param excelExportFileTypeEnum:
* 导出报表模板类型
* @param exportPath:
* 导出路径
* @param response:
* @return: void
* @author : zhengqing
* @date : 2020/9/8 14:59
*/
@SneakyThrows(Exception.class)
public static void export(List<Map<String, Object>> dataList, ExcelExportFileTypeEnum excelExportFileTypeEnum,
String exportPath, HttpServletResponse response) {
// 处理导出
handleExport(dataList, excelExportFileTypeEnum, exportPath);
// ======================= ↓↓↓↓↓↓ 响应给前端 ↓↓↓↓↓↓ =======================
// 文件名 - 解决中文乱码问题
String filename = URLEncoder.encode(excelExportFileTypeEnum.getTemplateFile().substring(1), "UTF-8");
// 设置响应编码
response.setCharacterEncoding("UTF-8");
response.setContentType("application/x-download");
response.setHeader("Content-Disposition", "attachment;filename=" + filename);
OutputStream outputStream = response.getOutputStream();
InputStream inputStream = new FileInputStream(exportPath);
byte[] buffer = new byte[1024];
int i = -1;
while ((i = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, i);
}
outputStream.flush();
outputStream.close();
inputStream.close();
}
/**
* 处理导出数据逻辑
*
* @param dataList:
* 数据
* @param excelExportFileTypeEnum:
* 导出报表模板类型
* @param exportPath:
* 导出路径
* @return: 导出数据文件
* @author : zhengqing
* @date : 2020/9/8 15:49
*/
@SneakyThrows(Exception.class)
private static File handleExport(List<Map<String, Object>> dataList,
ExcelExportFileTypeEnum excelExportFileTypeEnum, String exportPath) {
Resource resource =
new ClassPathResource(Constants.DEFAULT_REPORT_EXPORT_FOLDER + excelExportFileTypeEnum.getTemplateFile());
InputStream templateInputStream = resource.getInputStream();
log.debug("导出文件地址为:{}", exportPath);
// 创建文件
File exportFile = FileUtil.touch(exportPath);
// 列表数据将存储到指定的excel文件路径
OutputStream out = new FileOutputStream(exportPath);
// 这里的context是jxls框架上的context内容
Context context = PoiTransformer.createInitialContext();
// 将列表参数放入context中
context.putVar("dataList", dataList);
Workbook workbook = WorkbookFactory.create(templateInputStream);
// Changing name of the first sheet
workbook.setSheetName(0, excelExportFileTypeEnum.getSheetName());
PoiTransformer transformer = PoiTransformer.createTransformer(workbook);
transformer.setOutputStream(out);
// 将列表数据按照模板文件中的格式生成
JxlsHelper.getInstance().processTemplate(context, transformer);
templateInputStream.close();
out.close();
return exportFile;
}
}
、其中全局常用变量+导入导出所需枚举类+测试业务数据类
public class Constants {
/**
* 导入导出文件相关
*/
public static String DEFAULT_REPORT_IMPORT_FOLDER = "/report/import";
public static String DEFAULT_REPORT_EXPORT_FOLDER = "/report/export";
/**
* 系统分隔符
*/
public static String SYSTEM_SEPARATOR = "/";
/**
* 获取项目根目录
*/
public static String PROJECT_ROOT_DIRECTORY = System.getProperty("user.dir").replaceAll("\\\\", SYSTEM_SEPARATOR);
/**
* excel导出测试临时存储路径
*/
public static String FILE_PATH_TEST_EXPORT_EXCEL = PROJECT_ROOT_DIRECTORY + "/excel.xls";
}
@Getter
@AllArgsConstructor
public enum ExcelImportFileTypeEnum {
测试("/测试.xml");
/**
* 导入映射文件XML
*/
private String mappingXml;
}
@Getter
@AllArgsConstructor
public enum ExcelExportFileTypeEnum {
测试("/测试导出模板.xls", "测试");
/**
* 导出模板文件
*/
private String templateFile;
/**
* 导出表格名
*/
private String sheetName;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserInfoBO {
private String id;
private String name;
private String age;
}
4、导出Excel模板配置
① jx:area标识区域最后一个单元格的引用
② jx:each标识数据循环处理
猜你喜欢
- 2024-09-21 如何把excel表格处理成json数据(jason转excel)
- 2024-09-21 一个读Excel数据的小例子,提供给爱学习的Java后端开发
- 2024-09-21 快速将Excel、CSV等格式文件数据转换到java对象
- 2024-09-21 GitHub Star 8800+ 的阿里开源的 Java 解析 Excel 工具
- 2024-09-21 还在重复劳动?不如用Python自动生成Excel以邮件发送
- 2024-09-21 Java8如何让Excel的读写变得更加简单高效
- 2024-09-21 java打印Excel表格(java输出excel表格)
- 2024-09-21 整理关于java写入内容到excel的例子供大家参考
- 2024-09-21 JavaAPI开发(3)POI——如何将List转换为excel文件
- 2024-09-21 【Java程序】读取指定路径下文件夹中的文件名,生成Excel表格!
你 发表评论:
欢迎- 最近发表
-
- class版本不兼容错误原因分析(class更新)
- 甲骨文Oracle公司为Java的最新LTS版本做出改进
- 「版本发布」Minecraft Java开发版 1.19.4-pre1 发布
- java svn版本管理工具(svn软件版本管理)
- 我的世界1.8.10钻石在第几层(我的世界1.7.2钻石在哪层)
- Java开发高手必备:在电脑上轻松切换多个JDK版本
- 2022 年 Java 开发报告:Java 8 八年不到,开发者都在用什么?
- 开发java项目,选择哪个版本的JDK比较合适?
- Java版本选型终极指南:8 vs 17 vs 21特性对决!大龄程序员踩坑总结
- POI Excel导入(poi excel导入附件)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)