使用EasyExcel实现导入和导出

这篇具有很好参考价值的文章主要介绍了使用EasyExcel实现导入和导出。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

正文

简单实现导入和导出

导入代码

POM

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>${easyexcel.version}</version>
        </dependency>

FileUtil

/**
	 * 判断文件后缀是否为xls或xlsx
	 *
	 * @param file file
	 * @return boolean
	 */
	public static boolean isXls(MultipartFile file) {
		if (null == file || StringUtil.isBlank(file.getOriginalFilename())) {
			throw new RuntimeException("请上传文件!");
		}
		if ((!StringUtils.endsWithIgnoreCase(file.getOriginalFilename(), ".xls") &&
			!StringUtils.endsWithIgnoreCase(file.getOriginalFilename(), ".xlsx"))) {
			throw new RuntimeException("请上传正确的excel文件!");
		}
		return true;
	}

	/**
	 * 导出数据为xlsx文件
	 *
	 * @param dataList  数据源
	 * @param clazz     模板
	 * @param sheetName 标题名
	 * @param fileName  文件名
	 * @param response  response
	 * @param <T>       数据源的class
	 * @param <E>       模板的class
	 * @throws IOException
	 */
	public static <T, E> void exportToExcel(List<T> dataList, Class<E> clazz, String sheetName, String fileName, HttpServletResponse response) throws IOException {
		response.setContentType("application/vnd.ms-excel");
		response.setCharacterEncoding(org.apache.commons.codec.Charsets.UTF_8.name());

		String encodedFileName = URLEncoder.encode(fileName, org.apache.commons.codec.Charsets.UTF_8.name());
		response.setHeader("Content-disposition", "attachment;filename=" + encodedFileName + ".xlsx");

		List<E> data = CollectionUtils.isEmpty(dataList) ? Lists.newArrayList() :
			dataList.stream().map(e -> BeanUtil.copy(e, clazz)).collect(Collectors.toList());

		EasyExcel.write(response.getOutputStream(), clazz).sheet(sheetName).doWrite(data);
	}

	/**
	 * 导出模板
	 *
	 * @param clazz     模板
	 * @param sheetName 标题名
	 * @param fileName  文件名
	 * @param response  response
	 * @param <T>       数据源的class
	 * @throws IOException
	 */
	public static <T> void exportMould(Class<T> clazz, String sheetName, String fileName, HttpServletResponse response) throws IOException {
		response.setContentType("application/vnd.ms-excel");
		response.setCharacterEncoding(org.apache.commons.codec.Charsets.UTF_8.name());

		String encodedFileName = URLEncoder.encode(fileName, org.apache.commons.codec.Charsets.UTF_8.name());
		response.setHeader("Content-disposition", "attachment;filename=" + encodedFileName + ".xlsx");

		EasyExcel.write(response.getOutputStream(), clazz).sheet(sheetName).doWrite(Lists.newArrayList());
	}

	/**
	 * 读取Excel文件内容,常用于导入
	 * @param file	file
	 * @param clazz	模板
	 * @param listener	listener
	 * @param <T>	数据源的class
	 * @throws IOException
	 */
	public static <T> void readExcel(MultipartFile file, Class<T> clazz, AnalysisEventListener<T> listener) throws IOException {
		InputStream inputStream = new BufferedInputStream(file.getInputStream());
		ExcelReaderBuilder builder = EasyExcel.read(inputStream, clazz, listener);
		builder.doReadAll();
	}

controller

@SneakyThrows
	@PostMapping("/import")
	@ApiOperation(value = "导入", notes = "导入")
	public R<Map<String, Integer>> importData(MultipartFile file) {
		return iExceptionPersonService.importData(file);
	}

	@SneakyThrows
	@GetMapping("/exportMould")
	@ApiOperation(value = "异常人员模板导出", notes = "")
	public void exportMould(HttpServletResponse response) {
		iExceptionPersonService.exportMould(response);
	}
	@SneakyThrows
	@GetMapping("/export")
	@ApiOperation(value = "导出", notes = "导出")
	public void export(Query query, ExceptionPersonDTO exceptionPersonDTO, HttpServletResponse response) {
		iExceptionPersonService.export(query, exceptionPersonDTO, response);
	}

Service

/**
	 * 导入
	 *
	 * @param list 数据
	 */
	Map<String, Integer> importer(List<ExceptionPersonImportExcel> list);


	/**
	 * 导入
	 *
	 * @param file
	 * @return R<Map < String, Integer>>
	 */
	R<Map<String, Integer>> importData(MultipartFile file) throws IOException;

	/**
	 * 导出模板
	 *
	 * @param response response
	 */
	void exportMould(HttpServletResponse response) throws IOException;
	/**
	 * 导出
	 *
	 * @param query       分页条件
	 * @param exceptionPersonDTO查询条件
	 * @param response    response
	 */
	void export(Query query, ExceptionPersonDTO exceptionPersonDTO, HttpServletResponse response) throws IOException;

ServiceImpl

@Override
	public Map<String, Integer> importer(List<ExceptionPersonImportExcel> list) {
		Map<String, Integer> rstMap = new HashMap<>();
		List<ExceptionPerson> exceptionPersonList = list.stream().map(e -> {
			ExceptionPerson exceptionPerson = BeanUtil.copy(e, ExceptionPerson.class);
			exceptionPerson.setExceptionType(ExceptionPerson.ExceptionTypeEnum.IMPORT.getKey());
			return exceptionPerson;
		}).collect(Collectors.toList());
		rstMap.put("成功导入数量", exceptionPersonList.size());
		this.saveBatch(exceptionPersonList);
		return rstMap;
	}
	
@Override
	public R<Map<String, Integer>> importData(MultipartFile file) throws IOException {
		if (FileUtil.isXls(file)) {
			ExceptionPersonListener importListener = new ExceptionPersonListener(this);
			FileUtil.readExcel(file,ExceptionPersonImportExcel.class,importListener);
			return R.data(importListener.getRstMap(), "导入异常人员成功");
		}
		return R.data(null, "导入异常人员失败");
	}
	@Override
	public void exportMould(HttpServletResponse response) throws IOException {
		FileUtil.exportMould(ExceptionPersonImportExcel.class,"异常人员模板","异常人员模板",response);
	}
	@Override
		public void export(Query query, ExceptionPersonDTO exceptionPersonDTO, HttpServletResponse response) throws IOException {
			List<ExceptionPersonVO> list = exceptionPersonList(Condition.getPage(query), exceptionPersonDTO).getRecords();
			FileUtil.exportToExcel(list, ExceptionPersonExcel.class, "导入异常人员列表", "导入异常人员列表", response);
		}

ExceptionPersonListener

/**
 * 异常人员管理
 *
 * @author JunHao Huang
 * @since 2023-06-13 14:33:50
 */
@Data
@RequiredArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class ExceptionPersonListener extends AnalysisEventListener<ExceptionPersonImportExcel> {

	/**
	 * 默认每隔1000条存储数据库
	 */
	private int batchCount = 1000;
	/**
	 * 缓存的数据列表
	 */
	private List<ExceptionPersonImportExcel> list = new ArrayList<>();
	private Map<String, Integer> rstMap = new HashMap<>();

	private final IExceptionPersonService iExceptionPersonService;

	@Override
	public void invoke(ExceptionPersonImportExcel data, AnalysisContext analysisContext) {
		list.add(data);
		// 达到BATCH_COUNT,则调用importer方法入库,防止数据几万条数据在内存,容易OOM
		if (list.size() >= batchCount) {
			// 调用importer方法
			if(ObjectUtil.isEmpty(rstMap) || rstMap.get("成功导入数量") == 0){
				rstMap = iExceptionPersonService.importer(list);
			}else {
				iExceptionPersonService.importer(list);
			}
			// 存储完成清理list
			list.clear();
		}
	}

	@Override
	public void doAfterAllAnalysed(AnalysisContext analysisContext) {
		// 调用importer方法
		if(ObjectUtil.isEmpty(rstMap) || rstMap.get("成功导入数量") == 0){
			rstMap = iExceptionPersonService.importer(list);
		}else {
			iExceptionPersonService.importer(list);
		}

		// 存储完成清理list
		list.clear();
	}
}

ExceptionPersonImportExcel文章来源地址https://www.toymoban.com/news/detail-545072.html

/**
 * 异常人员管理
 *
 * @author JunHao Huang
 * @since 2023-06-13 14:33:50
 */
@Data
@ColumnWidth(25)
@HeadRowHeight(20)
@ContentRowHeight(18)
@HeadFontStyle(fontName = "微软雅黑", fontHeightInPoints = 8)
public class ExceptionPersonImportExcel {

	private static final long serialVersionUID = 1L;

	@ColumnWidth(25)
	@ExcelProperty(value = "员工编号")
	private String personCode;

	@ColumnWidth(25)
	@ExcelProperty(value = "姓名")
	private String personName;

	@ColumnWidth(25)
	@ExcelProperty(value = "身份证")
	private String idCardNo;

	@ColumnWidth(25)
	@ExcelProperty(value = "手机号")
	private String mobile;

	@ColumnWidth(25)
	@ExcelProperty(value = "所属渠道")
	private String orgName;

	@ColumnWidth(25)
	@ExcelProperty(value = "所属大区")
	private String areaName;

	@ColumnWidth(25)
	@ExcelProperty(value = "所属省区")
	private String subAreaName;

	@ColumnWidth(25)
	@ExcelProperty(value = "城市")
	private String miniAreaName;

	@ColumnWidth(25)
	@ExcelProperty(value = "负责人")
	private String storeSupervisorName;

	@ColumnWidth(25)
	@ExcelProperty(value = "入职时间")
	@JsonFormat(pattern = DateUtil.PATTERN_DATETIME)
	private Date entryTime;

	@ColumnWidth(25)
	@ExcelProperty(value = "离职时间")
	@JsonFormat(pattern = DateUtil.PATTERN_DATETIME)
	private Date dimissionTime;

	@ColumnWidth(25)
	@ExcelProperty(value = "所属公司名称")
	private String companyName;

	@ColumnWidth(25)
	@ExcelProperty(value = "纳入黑名单的原因")
	private String remark;

}

到了这里,关于使用EasyExcel实现导入和导出的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot中使用EasyExcel实现Excel 导入导出

    EasyExcel 是一款基于 Java 的简单易用的 Excel 文件操作工具。它提供了丰富的 API,可以方便地读取、写入和操作 Excel 文件,支持常见的 Excel 操作,如读取/写入单元格数据、合并单元格、设置样式、处理大数据量等。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将

    2024年02月12日
    浏览(57)
  • 使用POI和EasyExcel来实现excel文件的导入导出

    废话不多说咱们直接上干货!!!! 一.读取Excel表格 【1】使用POI读取excel表格中的数据 POI还可以操作我们这个word文档等等,他不仅仅只能弄Excel,而JXI只能操作excel 1.POI的结构,我们可以更具文件的类去选择 相关的对象我当前是使用的XLSX来操作的 HSSF - 提供读写Microsoft

    2024年02月05日
    浏览(39)
  • 【Easypoi & Apache poi】 Java后端 Word导入与导出

            如果这里造成了读取resources下的文件返回前端乱码问题:除了HttpServletResponse响应中设置字体问题,还有可能是因为在编译期文件就已经乱码了,所以需要在pom.xml中增加以下配置。

    2024年02月11日
    浏览(41)
  • JAVA实现easyExcel批量导入

    注解 类型 描述 ExcelProperty 导入 指定当前字段对应excel中的那一列。可以根据名字或者Index去匹配。当然也可以不写,默认第一个字段就是index=0,以此类推。千万注意,要么全部不写,要么全部用index,要么全部用名字去匹配。千万别三个混着用,除非你非常了解源代码中三个

    2024年04月27日
    浏览(30)
  • EasyExcel实现execl导入导出

    在实际开发中,处理 Excel 文件是一个常见的需求。EasyExcel 是一个基于 Java 的开源库,提供了简单易用的 API,可以方便地读取和写入 Excel 文件。本文将介绍如何使用 EasyExcel 实现 Excel 导入功能,以及一些相关的技巧和注意事项。 在开始之前,我们需要准备好 EasyExcel 的环境。

    2024年02月09日
    浏览(29)
  • Java——使用EasyExcel导出动态列的Excel

    多多点赞,会变好看! 多多留言,会变有钱! 有些时候列表的列可能是动态的,需要根据动态表头导出Excel文件,这时候可以使用下面的方法解决: 静态列导出代码:

    2024年02月15日
    浏览(38)
  • EasyExcel实现Excel文件导入导出功能

    Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。 EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。

    2024年02月02日
    浏览(55)
  • 使用Spring Boot和EasyExcel的导入导出

    在当今信息化社会,数据的导入和导出在各种业务场景中变得越来越重要。为了满足复杂的导入导出需求,结合Java编程语言、Spring Boot框架以及EasyExcel库,我们可以轻松地构建出强大而灵活的数据处理系统。本文将引导您通过一个案例学习如何使用这些工具,实现一个复杂的

    2024年02月14日
    浏览(31)
  • SpringBoot整合easyExcel实现CSV格式文件的导入导出

    目录 一:pom依赖 二:检查CSV内容格式的工具类 三:Web端进行测试 四:拓展使用 使用hutool工具类来进行导出功能

    2024年02月02日
    浏览(36)
  • Spring Boot集成EasyExcel实现excel导入导出操作

    Easy Excel 官网 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很

    2024年02月14日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包