文章16 | 阅读 8736 | 点赞0
本文使用esaypoi3.2.0模板导入导出,与springdata jpa整合,实现数据库导出数据到excle与excle到入数据库。
简单适用,能运用于大多数业务场景。
esaypoi文档地址:http://easypoi.mydoc.io/
CREATE TABLE `user` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(20) COLLATE utf8_bin NOT NULL DEFAULT '',
`sex` int(2) NOT NULL DEFAULT '0',
`age` int(3) NOT NULL DEFAULT '0',
`birthday` date DEFAULT NULL,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*Data for the table `user` */
insert into `user`(`id`,`name`,`sex`,`age`,`birthday`,`create_time`) values (1,'张三',1,12,'2018-02-02','2019-03-21 11:28:21'),(2,'里斯',2,23,'2018-02-23','2019-03-21 11:28:22'),(3,'王二',1,34,'2014-02-03','2019-03-21 11:28:22');
打开pom.xml引入依赖
<dependencies>
<!--springdata jpa-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<!--druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!--easypoi-->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>3.2.0</version>
</dependency>
<!--lombok 简化代码-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.22</version>
</dependency>
<!--模板引擎-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
编辑配置文件:application.properties
#数据库配置
spring.datasource.type= com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springboot2?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456
#jpa配置
spring.jpa.database=mysql
#是否显示sql
spring.jpa.show-sql=true
# create 每次运行该程序,没有表会新建表,表内有数据会清空
# create-drop 每次程序结束的时候会清空表
# update 每次运行程序,没有表会新建表,表内有数据不会清空,只会更新
# validate 运行程序会校验数据与数据库的字段类型是否相同,不同会报错
spring.jpa.hibernate.ddl-auto=update
#单个文件的大小
spring.servlet.multipart.max-file-size = 100MB
#总文件的大小
spring.servlet.multipart.max-request-size=100MB
#指定日期格式 yyyy-MM-dd HH:mm:ss
spring.jackson.date-format: yyyy-MM-dd HH:mm:ss
#mvc序列化时候时区选择
spring.jackson.time-zone: GMT+8
注:涉及了excle的文件上传,所以我们要设置,因为springboot默认的单个文件上传大小只有1MB
编写User.java类
@Data
@Entity
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Excel(name = "编号")
private int id;
@Excel(name = "姓名")
private String name;
@Excel(name = "性别", replace = {"男_1", "女_2"})
private String sex;
@Excel(name = "年龄")
private int age;
@Excel(name = "出生日期", format = "yyyy-MM-dd", width = 20)
private Date birthday;
@Excel(name = "创建日期", format = "yyyy-MM-dd HH:mm:ss", width = 30)
private Date createTime;
}
注: 1.@Data注解为lombok插件的,能简化get、set方法的书写。
2.@Entity 标明bean
3.@Id 标明当前字段为主键
4.@GeneratedValue(strategy = GenerationType.IDENTITY) 自增
5.@Excel 作用到filed上面,是对Excel一列的一个描述
** easypoi注解介绍请看**:http://easypoi.mydoc.io/#category_41961
@Excel中属性介绍:http://easypoi.mydoc.io/#text_186900
编写UserRepository.java类
public interface UserReposity extends JpaRepository<User, Integer> {
}
编写UserService.java类
public interface UserService {
List<User> selectAll();
void add(User user);
void adds(List<User> list);
}
编写UserServiceImpl.java类
@Service
public class UserServiceImpl implements UserService {
@Resource
private UserReposity reposity;
/**
* 查询所有数据
* @return
*/
@Override
public List<User> selectAll() {
return reposity.findAll();
}
/**
* 批量添加
* @param list
*/
@Override
public void adds(List<User> list) {
reposity.saveAll(list);
}
}
编写excle下载工具类:ExcleUtils.java
public class ExcleUtils {
/**
* excle下载
* @param list 数据集合
* @param title excle表中的标题
* @param sheetName sheet名称
* @param pojoClass pojo类
* @param fileName 生成的文件名
* @param response
*/
public static void downloadExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, HttpServletResponse response) {
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(title, sheetName), pojoClass, list);
if (workbook != null) {
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) {
System.out.println(e.getMessage());
}
}
}
}
编写文件配置类:FileConfig.java
public class FileConfig {
//允许上传的excle表格格式
public static final String[] UPLOAD_EXCLE_TYPES ={"xls","xlsx"};
}
编写UserController.java
@Controller
public class UserController {
@Resource
private UserService userService;
/**
* 首页
* @return
*/
@GetMapping("/index")
public String index() {
return "index";
}
/**
* excle下载
* @param title
* @param response
*/
@GetMapping("/download")
@ResponseBody
public void downLoadExcel(String title,HttpServletResponse response) {
String sheetName="用户";
List<User> userList = userService.selectAll();
ExcleUtils.downloadExcel(userList,title,sheetName,User.class,title+".xlsx",response);
}
/**
* excle导入
* @param file
* @param request
* @return
*/
@PostMapping("/upload")
@ResponseBody
public String upload(@RequestParam("fileName") MultipartFile file, HttpServletRequest request){
if(file.isEmpty()){
return "空文件";
}
//获取文件名
String fileName = file.getOriginalFilename();
//获取文件后缀
String type =fileName.indexOf(".") != -1 ? fileName.split("[.]")[1] : null;
//文件格式判断
if (!Arrays.asList(FileConfig.UPLOAD_EXCLE_TYPES).contains(type.toLowerCase())) {
return "文件类型不对";
}
ImportParams params = new ImportParams();
//表格标题所占据的行数,默认0,代表没有标题
params.setTitleRows(1);
//表头所占据的行数行数,默认1,代表标题占据一行
params.setHeadRows(1);
List<User> list;
try {
//excel的数据
list = ExcelImportUtil.importExcel(file.getInputStream(),User.class, params);
//导入数据库
userService.adds(list);
return "success";
} catch (Exception e) {
e.printStackTrace();
return e.getMessage();
}
}
}
注:excle导入代码中有这么一句
这里我解释一下titleRows代表的标题占据的行数,headRows对应头部占据的行数。至于什么是标题什么是头部,请看下图就名表了。
顺便提一下,上面这张图就是我们从数据库导出的excle文件最终效果。而我们导入的时候,要记住不要编号这一列哦,因为编号是我们数据库的主键id,如果你导入存在编号的话就会对已有的数据做修改。导入数据库应该是这样的。没有编号那一列
还有就是我们的列的标题一定要和我们对象中的@Excle name名称对应哦,也就是这里。一定要对应
编写页面文件:index.html,使用thymeleaf模板引擎
加入<html xmlns:th="http://www.thymeleaf.org">,才能使thymeleaf语法生效
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>excle操作</title>
</head>
<body>
<p>-----------------------------------excle导入数据库-----------------------------------</p>
<form action="upload" method="post" enctype="multipart/form-data">
<p>选择文件: <input type="file" name="fileName"/></p>
<p><input type="submit" value="提交"/></p>
</form>
<p>-----------------------------------数据库导出excle-----------------------------------</p>
<a href="/download?title=用户信息表">用户信息表</a>下载
</body>
</html>
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/xu12387/article/details/88713016
内容来源于网络,如有侵权,请联系作者删除!