Springboot2整合easypoi实现导入导出、OSS图片导出到Excel
程序员文章站
2022-03-11 08:51:58
提示这篇文件OSS图片导出到Excel表格是根据,上一篇文章来实现的。 如果不需要导出图片,请忽略关于OSS部分的内容以及工具类。上一篇文章连接:https://blog.csdn.net/qq_41085151/article/details/1073542631.添加pom依赖 ...
提示这篇文件OSS图片导出到Excel表格是根据,上一篇文章来实现的。 如果不需要导出图片,请忽略关于OSS部分的内容以及工具类。
上一篇文章连接:https://blog.csdn.net/qq_41085151/article/details/107354263
1.添加pom依赖
<!--<version>2.1.5.RELEASE</version>springboot版本-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- mybatisPlus 核心库 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<!-- 引入阿里数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.6</version>
</dependency>
<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>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<!--swagger ui-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
2.配置文件
server.port=8083
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
mybatis-plus.configuration.map-underscore-to-camel-case=false
mybatis-plus.global-config.db-config.id-type=auto
mybatis-plus.global-config.db-config.db-type=mysql
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=1000MB
#地域节点
aliyun.oss.file.endpoint=oss-cn-beijing.aliyuncs.com
#用户accesskey id
aliyun.oss.file.keyid=xxxxxxxxxx
#用户accesskey secret
aliyun.oss.file.keysecret=xxxxxxxxxx
#相当于是哪个库
aliyun.oss.file.bucketname=xiaozhuya
#文件路径
aliyun.oss.file.filehost=avatar
3.编写mybatis配置类和Swagger配置类
@Data
@Configuration
public class MybatisPlusConfig {
/**
* mybatis-plus SQL执行效率插件【生产环境可以关闭】
*/
@Bean
public PerformanceInterceptor performanceInterceptor() {
return new PerformanceInterceptor();
}
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
//逻辑删除
@Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
}
}
@Configuration
@EnableSwagger2
public class Swagger2Config {
@Bean
public Docket webApiConfig(){
return new Docket(DocumentationType.SWAGGER_2)
.groupName("webApi")
.apiInfo(webApiInfo())
.select()
//.paths(Predicates.not(PathSelectors.regex("/admin/.*")))
.paths(Predicates.not(PathSelectors.regex("/error.*")))
.build();
}
private ApiInfo webApiInfo(){
return new ApiInfoBuilder()
.title("网站-用户中心API文档")
.description("本文档描述了课程中心微服务接口定义")
.version("1.0")
.contact(new Contact("Helen", "http://itlinli.com", "1003908971@qq.com"))
.build();
}
}
4.创建表编写pojo
CREATE TABLE `t_userinfo` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) DEFAULT NULL,
`age` INT(3) DEFAULT NULL,
`birthday` DATE DEFAULT NULL,
`headimageurl` TEXT,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8
@Data //没有lombok写get和set方法
@TableName("t_userinfo")
public class User implements Serializable {
// 主键id
@ExcelIgnore // 生成报表时忽略,不生成次字段
@TableId(type = IdType.AUTO)
private Integer id;
@NotEmpty(message = "不能为空")
@Size(min = 2,max = 20,message = "长度不能超过2-20")
@Excel(name = "姓名") // 定义表头名称和位置,0代表第一列
private String name;
@Size(max = 3,message = "年龄不能大于3位数")
@Excel(name = "年龄")
private Integer age;// 定义列宽
@Excel(name = "生日", format = "yyyy-MM-dd", width = 15)
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
@Excel(name = "头像", type = 2 ,width = 20 , height = 40)//type = 2 :代表这个一个图片展示
private String headImageurl;
}
5.编写Dao
@Mapper
public interface UserDao extends BaseMapper<User> {
}
6.编写Service,如果不需要图片,忽略下载OSS图片
public interface UserService extends IService<User> {
void logDownload(Integer id, HttpServletResponse response) throws Exception;
R download();//根据数据库url,下载oss图片保存到本地
void exportExcelUser(HttpServletResponse response);
List<User> getUser();
R importExcelUser(MultipartFile file);
}
7.easypoi工具类
public final class EasyPoiUtils {
private EasyPoiUtils() {}
private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
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 RuntimeException(e);
}
}
private static<T> void defaultExport(List<T> dataList, Class<?> clz, String fileName, HttpServletResponse response, ExportParams exportParams) {
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, clz, dataList);
if (workbook != null) {
downLoadExcel(fileName, response, workbook);
}
}
public static<T> void exportExcel(List<T> dataList, String title, String sheetName, Class<?> clz, String fileName, boolean isCreateHeader, HttpServletResponse response) {
ExportParams exportParams = new ExportParams(title, sheetName);
exportParams.setCreateHeadRows(isCreateHeader);
defaultExport(dataList, clz, fileName, response, exportParams);
}
public static<T> void exportExcel(List<T> dataList, String title, String sheetName, Class<?> clz, String fileName, HttpServletResponse response) {
defaultExport(dataList, clz, fileName, response, new ExportParams(title, sheetName));
}
private static void defaultExport(List<Map<String, Object>> dataList, String fileName, HttpServletResponse response) {
Workbook workbook = ExcelExportUtil.exportExcel(dataList, ExcelType.HSSF);
if (workbook != null) {
downLoadExcel(fileName, response, workbook);
}
}
public static void exportExcel(List<Map<String, Object>> dataList, String fileName, HttpServletResponse response) {
defaultExport(dataList, fileName, response);
}
public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> clz) {
if (StringUtils.isBlank(filePath)) {
return null;
}
ImportParams params = new ImportParams();
params.setTitleRows(titleRows);
params.setHeadRows(headerRows);
try {
return ExcelImportUtil.importExcel(new File(filePath), clz, params);
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> clz) {
if (file == null) {
return null;
}
ImportParams params = new ImportParams();
params.setTitleRows(titleRows);
params.setHeadRows(headerRows);
try {
return ExcelImportUtil.importExcel(file.getInputStream(), clz, params);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static List<User> importExcel(MultipartFile file, Class<User> clz) {
if (file == null) {
return null;
}
ImportParams params = new ImportParams();
params.setTitleRows(0);
params.setHeadRows(1);
try {
return ExcelImportUtil.importExcel(file.getInputStream(), clz, params);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private List<String> downloadPicture(String fileName,List<String> urlList) {
File file=new File(fileName);
// 不存在则创建文件夹
if (!file.exists()){
file.mkdir();
}
long imageNumber = System.currentTimeMillis();
List<String>imageList=new ArrayList<>();
URL url = null;
for (String urlString : urlList) {
try {
url = new URL(urlString);
DataInputStream dataInputStream = new DataInputStream(url.openStream());
Random random=new Random();
int rd=random.nextInt(9999);
String imageName = imageNumber+""+rd + ".jpg";
FileOutputStream fileOutputStream = new FileOutputStream(new File(fileName+"/"+imageName));
byte[] buffer = new byte[1024];
int length;
while ((length = dataInputStream.read(buffer)) > 0) {
fileOutputStream.write(buffer, 0, length);
}
dataInputStream.close();
fileOutputStream.close();
imageList.add(fileName+"/"+imageName);
imageNumber++;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return imageList;
}
}
8.编写实现类
@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {
@Autowired
UserDao userDao;
@Override
public void logDownload(Integer id, HttpServletResponse response) throws Exception {
String endPoint = ConstantPropertiesUtil.END_POINT;
String accessKeyId = ConstantPropertiesUtil.ACCESS_KEY_ID;
String accessKeySecret = ConstantPropertiesUtil.ACCESS_KEY_SECRET;
String bucketName = ConstantPropertiesUtil.BUCKET_NAME;
String fileHost = ConstantPropertiesUtil.FILE_HOST;
User user = userDao.selectById(id);
String imageurl = user.getHeadImageurl();
String name = OSSStringUtil.urltoname(imageurl);
//设置响应头为下载
response.setContentType("application/force-download");
//设置下载的文件名
response.addHeader("Content-Disposition", "attachment;fileName=" + name);
response.setCharacterEncoding("UTF-8");
OSSClient ossClient = new OSSClient(endPoint, accessKeyId, accessKeySecret);
String filePath = OSSStringUtil.urltofilepath(imageurl, fileHost);
String osskey = OSSStringUtil.osskey(fileHost, filePath, name);
OSSObject ossObject = ossClient.getObject(bucketName,osskey);
InputStream is = ossObject.getObjectContent();
BufferedInputStream bis = null;//定义缓冲流
OSSStringUtil.file(bis,is,response);
}
@Override
public R download() {
String endPoint = ConstantPropertiesUtil.END_POINT;
String accessKeyId = ConstantPropertiesUtil.ACCESS_KEY_ID;
String accessKeySecret = ConstantPropertiesUtil.ACCESS_KEY_SECRET;
String bucketName = ConstantPropertiesUtil.BUCKET_NAME;
String fileHost = ConstantPropertiesUtil.FILE_HOST;
String file = OSSStringUtil.projecturl();
OSSClient ossClient = new OSSClient(endPoint, accessKeyId, accessKeySecret);
File fileUpload = new File(file);
if (!fileUpload.exists()){
fileUpload.mkdirs();
}
List<User> userList = userDao.selectList(null);
try {
for (User user : userList) {
String imageurl=user.getHeadImageurl();
String name = OSSStringUtil.urltoname(imageurl);
fileUpload = new File(file, name);
System.out.println(fileUpload);
if (fileUpload.exists()){
log.debug("文件已经存在!");
continue;
}
String filePath = OSSStringUtil.urltofilepath(imageurl, fileHost);
String osskey = OSSStringUtil.osskey(fileHost, filePath, name);
ossClient.getObject(new GetObjectRequest(bucketName,osskey), fileUpload);
}
}catch (Exception e){
return R.error().message(e.getMessage());
}finally {
// 关闭OSSClient。
ossClient.shutdown();
}
return R.ok();
}
@Override
public void exportExcelUser(HttpServletResponse response) {
String file = OSSStringUtil.projecturl();
System.out.println(file);
List<User> list = userDao.selectList(null);
for (User user : list) {
String imageurl = user.getHeadImageurl();
String name = OSSStringUtil.urltoname(imageurl);
user.setHeadImageurl(file+"/"+name);
}
System.out.println(list);
EasyPoiUtils.exportExcel(list, "用户列表", "用户报表", User.class, "用户明细报表.xls", response);
}
@Override
public List<User> getUser() {
List<User> users = userDao.selectList(null);
return users;
}
@Override
public R importExcelUser(MultipartFile file) {
ImportParams importParams = new ImportParams();
// 数据处理
importParams.setHeadRows(1);
importParams.setTitleRows(1);
// 需要验证
importParams.setNeedVerfiy(false);
try {
ExcelImportResult<User> result = ExcelImportUtil.importExcelMore(file.getInputStream(), User.class,
importParams);
List<User> commpanyList = result.getList();
for (User commpany : commpanyList) {
//保存到mysql
int i = userDao.insert(commpany);
if(i < 1){
log.error("保存失败");
return R.error().message("保存失败");
}
/* //查出自增id
TbCommpanyExample tbCommpanyExample = new TbCommpanyExample();
tbCommpanyExample.createCriteria().andCompanyNameEqualTo(commpany.getCompanyName());
long id = tbCommpanyMapper.selectByExample(tbCommpanyExample).get(0).getId();
commpany.setId(id);*/
//保存到redis
// redisUtils.sSet("company",JSONObject.parseObject(JSONObject.toJSONString(commpany)));
}
log.info("从Excel导入数据一共 {} 行 ", commpanyList.size());
} catch (Exception e) {
log.error("导入失败:{}", e.getMessage());
return R.error().message("导入失败");
}
return R.ok().message("导入成功");
}
}
9.编写控制层类,如果不用图片就忽略文件下载的部分
@RestController
@Api(value = "用户列表")
public class UserController {
@Autowired
UserService userService;
@ApiOperation(value = "导入数据到数据库中")
@PostMapping("/import/users")
@ResponseBody
public R importExcel(@RequestParam("file") MultipartFile file) {
return userService.importExcelUser(file);
}
@ApiOperation(value = "导出数据到Excel表格")
@GetMapping(value = "/export/users")
public void exportUsers(HttpServletResponse response) {
// userService.download();定时任务执行下载图片
userService.exportExcelUser(response);
}
@ApiOperation(value = "浏览器按id文件下载")
@GetMapping(value = "/downloads/{id}")
public void logDownload(@PathVariable Integer id, HttpServletResponse response) throws Exception {
userService.logDownload(id, response);
}
@ApiOperation(value = "按数据库url从阿里云中下载图片")
@GetMapping("/loads")
public R logDownload(){
userService.download();
return R.ok();
}
// @PostConstruct // 加上该注解项目启动时就执行一次该方法
@ApiOperation(value = "直接按照数据库中的url下载图片。")
@GetMapping("/ossdownload")
public R ossdownload() throws Exception {
List<User> users = userService.getUser();
for (User user : users) {
String headImageurl = user.getHeadImageurl();
doloadimgUtil.download(headImageurl,user.getName());
}
return R.ok();
}
}
10.工具类
public class OSSStringUtil {
public static String urltoname(String url){
String name = url.substring(url.lastIndexOf("/") + 1);
return name;
}
public static String urltofilepath(String url,String fileHost){
String filePath = url.substring(url.indexOf(fileHost) + fileHost.length() + 1, url.lastIndexOf("/"));
return filePath;
}
public static String osskey(String fileHost,String filePath,String name){
String osskey = fileHost+"/"+filePath+"/"+name;
return osskey;
}
public static String projecturl(){
String property = System.getProperty("user.dir");//获取本项目路径
String file = new File(property+"/"+"src/main/resources/static/imags").getAbsolutePath();
return file;
}
public static void file(BufferedInputStream bis, InputStream is , HttpServletResponse response){
try {
bis = new BufferedInputStream(is);//把流放入缓存流
OutputStream os = response.getOutputStream();//定义输出流的响应流。
byte[] buffer = new byte[1024];//定义一个字节数
int len;//记录每次读入到cbuf数组中的字符的个数
while ((len = is.read(buffer)) != -1) {//开始输出
os.write(buffer,0,len); //从数组中每次写出len个字符
}
} catch (Exception e){
e.printStackTrace();
}finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
11.图中的返回类型R工具类,我就不贴了。
12.测试导入数据
文件导出,需要导出图片的话,需要把上传图片的url先保存到用户表中,然后再下载到本地,才能导入到Excel中。
数据导入到数据库中图片的路径肯定是空的。一般开发中会默认头像,用户设置头像了再保存url。测试的时候导出Excel不要在swagger中测试可以在浏览器中测试
有疑问请各位大佬留下珍贵的评论哦!
本文地址:https://blog.csdn.net/qq_41085151/article/details/107378257
上一篇: Java 单例模式
下一篇: 用 nacos 做配置中心