easypoi Excel导入导出 (工具类)

2023-11-10

1.用到的jar

红色的必须的。

下面那些是运行起来,缺哪个就导哪个。

如果报错提示没有这个方法的话,重启Tomcat,还不好使就是jar包版本不对,找个高点的版本。

 easypoi-annotation-3.1.0.jar
easypoi-base-3.1.0.jar
easypoi-web-3.1.0.jar

poi-3.15.jar
log4j-to-slf4j-2.10.0.jar
slf4j-api-1.7.12.jar
slf4j-log4j12-1.7.25.jar
poi-ooxml-3.15.jar
poi-ooxml-schemas-3.15.jar
commons-lang3-3.4.jar
commons-fileupload-1.2.1.jar
 commons-io-1.3.jar

2.实体类

package com.ssm.entity;

import cn.afterturn.easypoi.excel.annotation.Excel;

public class FileEntity {
    //注解,easypoi教程里有,时间转换、数据字典转换等
	 @Excel(name = "姓名", orderNum = "0")
	 public String fileId;
	 @Excel(name = "性别", replace = {"男_1", "女_2"}, orderNum = "1")
	 public String fileName;
	 @Excel(name = "孙权", orderNum = "2")
	 public String tags;
	/*如果不注释,抛异常,java.lang.InstantiationException(对象创建失败)
        public FileEntity(String fileId, String fileName, String tags) {        
		this.fileId = fileId;       
		this.fileName = fileName;        
		this.tags = tags;   
		}
    */
	public String getFileId() {
		return fileId;
	}
	public void setFileId(String fileId) {
		this.fileId = fileId;
	}
	public String getFileName() {
		return fileName;
	}
	public void setFileName(String fileName) {
		this.fileName = fileName;
	}
	public String getTags() {
		return tags;
	}
	public void setTags(String tags) {
		this.tags = tags;
	}

}

3.导入导出工具类

package com.ssm.until;

import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;

import javax.servlet.http.HttpServletResponse;

import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.multipart.MultipartFile;

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;

public class FileUtil {
	public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName,
			boolean isCreateHeader, HttpServletResponse response) throws Exception {
		ExportParams exportParams = new ExportParams(title, sheetName);
		exportParams.setCreateHeadRows(isCreateHeader);
		defaultExport(list, pojoClass, fileName, response, exportParams);

	}

	public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName,
			HttpServletResponse response) {
		defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName));
	}

	public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response)
			throws Exception {
		defaultExport(list, fileName, response);
	}

	private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response,
			ExportParams exportParams) {
		Workbook workbook = null;
		try {
			workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
		} catch (Exception e) {
			e.printStackTrace();
		}
		if (workbook != null)
		try {
			downLoadExcel(fileName, response, workbook);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook)
			throws Exception {
		try {
			response.setCharacterEncoding("UTF-8");
			response.setHeader("content-Type", "application/vnd.ms-excel");
			response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
			workbook.write(response.getOutputStream());
		} catch (IOException e) {
			throw new Exception(e.getMessage());
		}
	}

	private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response)
			throws Exception {
		Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
		if (workbook != null)
			;
		downLoadExcel(fileName, response, workbook);
	}

	public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> pojoClass)
			throws Exception {
		if (org.apache.commons.lang3.StringUtils.isBlank(filePath)) {
			return null;
		}
		ImportParams params = new ImportParams();
		params.setTitleRows(titleRows);
		params.setHeadRows(headerRows);
		List<T> list = null;
		try {
			list = ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);
		} catch (NoSuchElementException e) {
			throw new Exception("模板不能为空");
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception(e.getMessage());
		}
		return list;
	}

	public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass)
			throws Exception {
		if (file == null) {
			return null;
		}
		ImportParams params = new ImportParams();
		params.setTitleRows(titleRows);
		params.setHeadRows(headerRows);
		List<T> list = null;
		try {
			list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);
		} catch (NoSuchElementException e) {
			throw new Exception("excel文件不能为空");
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
		return list;
	}

}

3.导入导出controller

package com.ssm.controller;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import com.ssm.entity.FileEntity;
import com.ssm.until.FileUtil;

@Controller
public class FileController {
        //导出Excel
	  @RequestMapping("/export")
	    public void export(HttpServletResponse response) throws Exception{
	 
	        //模拟从数据库获取需要导出的数据
	        List<FileEntity> personList = new ArrayList<FileEntity>();
	        FileEntity person1 = new FileEntity();
	        FileEntity person2 = new FileEntity();
	        FileEntity person3 = new FileEntity();
	        FileEntity person4 = new FileEntity();
	        person1.setFileId("1");
	        person2.setFileId("xm2");
	        person1.setFileName("daiang");
	        person1.setTags("谷向南是大老娘们");
	        person2.setTags("asdsadg");
	        personList.add(person1);
	        personList.add(person2);
	        personList.add(person3);
	        personList.add(person4);
	 
	        //导出操作
	        FileUtil.exportExcel(personList,"花名册","422",FileEntity.class,"虾米.xls",response);
	    }
	     //Excel导入
	    @RequestMapping("importExcel")
	    public void importExcel(@RequestParam("textFile") MultipartFile file,HttpServletRequest request) throws Exception{
	        //String filePath = "F:\\故乡南.xls";
	    	System.out.println(file);//用来检查前端是否把文件传过来
            //解析excel,
	        List<FileEntity> personList = FileUtil.importExcel(file, 1, 1,FileEntity.class);
	        //也可以使用FileUtil.importExcel(filePath,1,1,FileEntity.class) 导入
	        System.out.println("导入数据一共【"+personList.size()+"】行");
	        //TODO 保存数据库
	    }

}

4.导入Excel前端代码

<form action="importExcel" method="post" enctype="multipart/form-data">
 	<input type="file" name="textFile"/>
 	<input type="submit" value="进来"/>
 </form>

5.用的是springmvc,需要改一下配置文件springmvc-servlet.xml,因为Excel导入功能

    <!-- 上传文件 -->  
    <bean name="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="UTF-8"></property>
    </bean>

最后感谢陈锐、司马缸对本文大力支持(#^.^#)!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

easypoi Excel导入导出 (工具类) 的相关文章

  • 【C++】Vector和String详解

    前言 没错 我又更新了 即使没人看 上一篇文章介绍了有关双向链表的容器list 那问题来了 数组和字符串这种使用频率非常高的数据结构 在STL模板中会不会有让人眼前一亮的实现哪 很明显 有 vertor和string就是这两种数据结构相对应
  • Python Flask 中的路由

    Python Flask 中的路由 在 Web 应用中 接口一般都是遵守 RESTful API 设计风格的 这种风格很优雅 而且对用户来说非常易于理解 RESTful API 参考 https blog csdn net weixin 4
  • C语言:电话号码字母排列

    这点B玩意写了一下午加一晚上 但是理解了回溯法也值了 具体解释我写在注释里 include
  • Linux iNode 双网卡,已解决: Zynq 7000 双网卡配置-内核DTS该如何配置 - Community Forums...

    问题 ETH0是通的 ETH1找不到PHY 连接到GMII2RGMII转换器时 找不到该设备 dts和vivado该如何配置 系统 Zynq 7Z015 Vivado 2018 3 内核 4 6 VIVADO工程如下 在内核设备树文件中 配
  • mysql重连次数_Yii2-Mysql重连机制

    背景 nsq消费进程中长时间消费不到数据 mysql设置的自动断开时间超过后 mysql自动断线 服务端报mysql gone away 这时需要捕获异常重连并重试 或者将长连接改为短连接也可以解决该问题 解决 配置项新增 db gt cl
  • python马士兵学习笔记

    前言 本篇文章是作者在B站学习python马士兵视频的笔记 之前章节的内容可参考https blog csdn net qq 43511094 article details 113062435 或https blog csdn net w
  • stat()函数:获取文件状态

    相关函数 fstat lstat chmod chown readlink utime 头文件 include
  • SQL Server 基础操作 (二) 创建用户并且为用户授权

    1 创建用户 右键点击登录名 新建登录名 2 设置管理员权限 进入 服务器角色 在右侧的服务器角色面板中 勾选public 服务器角色 说明 sysadmin 执行SQL Server中的任何操作 serveradmin 配置服务器设置 s
  • nodejs链接mysql报错_nodejs连接数据库报错

    ER NOT SUPPORTED AUTH MODE 报错详情 使用nodejs连接数据库时报错 Error ER NOT SUPPORTED AUTH MODE Client does not support authentication
  • Blockly概述

    原文地址 https developers google com blockly guides overview Blockly是一个用于Web Android IOS的可视化代码编辑器库 Blockly使用了相互关联的积木来表示表达代码中
  • ES 搜索22 (function_score 支持的衰减函数 linear、exp 和 gauss)

    衰减函数 很多变量都可以影响用户对于酒店的选择 像是用户可能希望酒店离市中心近一点 但是如果价格足够便宜 也愿意为了省钱 妥协选择一个更远的住处 如果我们只是使用一个 filter 排除所有市中心方圆 100 米以外的酒店 再用一个filt
  • 关于根轨迹对于控制系统的一点理解

    自动控制理论根轨迹的学习过程中 经常会遇到几个问题 为什么要用根轨迹法 为什么根轨迹法最终转化为调整增益K来反应系统的稳定性和动态性能 为什么根轨迹法用开环传递函数求解的却是闭环极点 盲目的借助于matlab进行根轨迹的计算和绘图 有时候往
  • MySQL采用B+树作为索引的原因

    MySQL采用B 树作为索引的原因 1 MySQL的索引结构是如何查询的 在MySQL中 存储的数据记录都是持久化到磁盘中的 数据包含索引和记录 当MySQL查询数据时 由于索引也是持久化在磁盘上面的 首先会从磁盘上读取索引到缓存中 然后再
  • 【计算机网络】JWT(JSON Web Token)初识

    JWT JSON Web Token 初识 JWT JSON Web Token 是目前最流行的跨域认证解决方案 1 跨域认证的问题 互联网服务离不开用户认证 一般流程是下面这样 用户向服务器发送用户名和密码 服务器验证通过后 在当前对话
  • jQuery实现MD5加密

    原文地址 http blog csdn net you23hai45 article details 52629234 1 问题背景 有两个输入框 一个输入明文 另一个输入框显示密文 2 实现源码 html view plain copy
  • Linux平台的IO操作

    什么是IO如何理解IO IO就是输入与输出 I Input 从键盘拷贝数据至内存中 O Output 从内存中拷贝数据到终端上 因为Linux平台基本思想为 一切皆文件 所以 对于IO可以再次理解位 I 从文件中拷贝数据到内存中去 O 从内
  • WebService 学习笔记之一 HelloWorld

    一 开发环境 我的开发环境是 MyEclipse 10 Apache cxf 2 3 0 相关jar包下载地址 http www apache org dist cxf 2 3 0 二 开发步骤 创建Server 1 新建一个Java工程C
  • Linux/Android 充电框架/流程分析 1

    1 内核注册供电设备 内核通过 devm power supply register 或者 power supply register 注册供电相关的设备 2 获取电量的方式 电量是电池相关的信息 所以 注册的供电设备为 battery 例
  • [深入研究4G/5G/6G专题-46]: 5G Link Adaption链路自适应-2-常见缩略语

    A CSI Aperiodic Channel Status Information 非周期性信道状态信息 AL Aggregation level for PDCCH 聚合等级 ATB Adaptive Transmission Band
  • 如何从一个git服务器仓库将项目迁移到另一个git服务器仓库

    最近服务器迁移涉及到代码也需要一块迁移 梳理了一些git服务迁移指令 希望大家共享 从服务器A迁移到服务器B 1 首先将服务器A上的代码进行备份 1 1 git备份指令 从A服务器 https gitlab xxxx cn 上clone代码

随机推荐

  • Kali环境下渗透目标(win7)虚拟机

    Kali环境下渗透目标 win7 虚拟机 注 此文章 是我看了CSDN上另一位博主的文章 我在自己在电脑上实验了一遍的结果 另外 本文仅供学习交流 用来做非法之事 本人概不负责 准备 1 在电脑上安装VMware 并下载安装虚拟机kali
  • pycharm运行YOLOv5 (一)

    登录github com search yolov5 查看选择各个版本 查看发布各个版本 点击下载版本 下载zip文件 解压之后导入pycharm 先看这个文件requirements txt 这是启动yolov5需要的各个库 pip in
  • docker启动rabbitmq后无法访问15672端口

    docker启动rabbitmq后无法访问15672端口 经查找资料得知 rabbitmq默认web界面管理插件是关闭的 只要通过命令开启就行 1 docker ps查看rabbitmq的id fb7a78201d31 2 命令进入容器do
  • vivado下载

    vitis vivado 2019 2百度网盘 链接 https pan baidu com s 11CvUL05o2NTRqN4PpnFG5Q 提取码 n82v vivado2018 2百度网盘 链接 https pan baidu co
  • javaEE 2019 10 24关于运算符 键盘录入数据

    运算符 对变量和常量的操作过程称为运算 对变量和常量进行操作的符号 运算符 算术运算符 加 减 乘 除 自增 自减 取模 字符串连接 赋值运算符
  • WEB前端 期末复习 2018.11

    WEB前端 期末复习 2018 11 名词解释部分 API Application Programming Interface 应用程序编程接口 是一些预先定义的函数 目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力 而又
  • kafka不同的topic使用相同的group的问题

    前几天为了省事 在申请group的时候 就使用了原来的group 本来以为group从属于某一个topic topic不同 group之间相互不会影响 但实际情况不是这样的 kafka不同topic的consumer如果用的groupid名
  • android 下拉刷新 组件,Android实现简单的下拉刷新控件

    背景 列表控件在Android App开发中用到的场景很多 在以前我们用ListView GradView 现在应该大多数开发者都已经在选择使用RecyclerView了 谷歌给我们提供了这些方便的列表控件 我们可以很容易的使用它们 但是在
  • maven跳过单元测试-maven.test.skip和skipTests的区别以及部分常用命令

    DskipTests 不执行测试用例 但编译测试用例类生成相应的class文件至target test classes下 Dmaven test skip true 不执行测试用例 也不编译测试用例类 不执行测试用例 但编译测试用例类生成相
  • poll, select, epoll

    随着2 6内核对epoll的完全支持 网络上很多的文章和示例代码都提供了这样一个信息 使用epoll代替传统的poll能给网络服务应用带来性能上的提升 但大多文章里关于性能提升的原因解释的较少 这里我将试分析一下内核 2 6 21 1 代码
  • HDU - 1312 Red and Black(DFS)

    There is a rectangular room covered with square tiles Each tile is colored either red or black A man is standing on a bl
  • 微信小程序导出当前画布指定区域的内容并生成图片保存到本地相册(canvas)

    最近在学小程序 在把当前画布指定区域的内容导出并生成图片保存到本地这个知识点上踩坑了 这里用到的方法是 wx canvasToTempFilePath 该方法作用是把当前画布指定区域的内容导出生成指定大小的图片 并返回文件路径 详情 看文档
  • Idea快捷键大全(Windows)

    转载 Idea快捷键大全 Windows Lymanyu的博客 CSDN博客 idea快捷键
  • spring+shiro多节点session共享

    shiro我就不多介绍了 我的方案是重写 shiro的sessionDAO 把session存储到redis上 直接上代码 一 spring中配置
  • Node.js 利用Promise对象并发写入流、读取流(Stream)

    上篇文章我们用高阶函数 函数柯里化 实现并发文件读取流 写入流 今天 我们用另外一种方法实现 let fs require fa 写一个通用的读取函数 返回promise对象 function getFile filename return
  • php 下载七牛文件上传,laravel下封装的七牛云图片上传下载方法

    fileName 文件名 filePath 文件路径 我用的是七牛云私有空间 如果用公有空间也一样 只是不需要下载方法而已
  • 042_前端规范 2021-06-03

    042 前端规范 最终目的 去除冗余 让代码易于维护 常见代码片段 遍历数组 1 2 3 forEach function value index console log value 映射新数组 arr 1 2 3 map v gt v 2
  • 如何在word中的图片上画圈标注_怎么在word画圈标注 如何在word图片中进行画圈标示...

    例如上面在图片上画圈效果的制作方法 1 单击插入 形状 线条 椭圆工具 2 拖动鼠标 在图片所需要的位置绘制一个适当大小的圆 3 单击绘图工具格式 形状填充 无填充颜色 4 单击绘图工具格式 形状轮廓 红色即可 如图所示 怎么用Word画简
  • JAVA基础之接口

    什么是接口 接口是一种特殊的类 但与类有本质区别 类中有成员方法和成员变量但是接口中只有常量和用abstract定义的方法 接口的声明采用关键字interface 格式 修饰符 interface 接口名 方法体 接口可以多继承 使用关键字
  • easypoi Excel导入导出 (工具类)

    1 用到的jar 红色的必须的 下面那些是运行起来 缺哪个就导哪个 如果报错提示没有这个方法的话 重启Tomcat 还不好使就是jar包版本不对 找个高点的版本 easypoi annotation 3 1 0 jar easypoi ba