spring boot整合poi实现excel文件导入导出实战
今天科比离去,今天肺炎病毒持续肆虐。。。
意识到生命的脆弱,今天我继续前行,比以往更加坚定和紧迫,这辈子不活好自己就算白来一趟。
1.项目介绍
最近帮朋友做了一个小工具,就是实现:上传一个excel文件,将数据导入mysql表中,再调用存储过程进行转换计算,最后再将处理结果导出成excel。中间用到的一些知识点记录下来和朋友分享。
2.效果图

3.pom整合
<!--解析excel-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.16</version>
</dependency>
<!--处理2007 excel-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.16</version>
</dependency>
4.工具类
package com.laoxu.test.helloweb.util;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
/**
* @Description:
* @Author laoxu
* @Date 2020/1/24 16:00
**/
public class ExcelUtil {
private static final Logger logger = LoggerFactory.getLogger(ExcelUtil.class);
/**
* 获取并解析excel文件,返回一个二维集合
* @param file 上传的文件
* @return 二维集合(第一重集合为行,第二重集合为列,每一行包含该行的列集合,列集合包含该行的全部单元格的值)
*/
public static ArrayList<ArrayList<String>> analysis(MultipartFile file) {
ArrayList<ArrayList<String>> result = new ArrayList<>();
//获取文件名称
String fileName = file.getOriginalFilename();
System.out.println(fileName);
try {
//获取输入流
InputStream in = file.getInputStream();
//判断excel版本
Workbook workbook = null;
if (judegExcelEdition(fileName)) {
workbook = new XSSFWorkbook(in);
} else {
workbook = new HSSFWorkbook(in);
}
//获取第一张工作表
Sheet sheet = workbook.getSheetAt(0);
//从第二行开始获取
Row row=null;
for (int i=1; i<sheet.getPhysicalNumberOfRows();i++) {
row = sheet.getRow(i);
//循环获取每一列
ArrayList<String> list = new ArrayList<>();
Cell cell = null;
for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {
// logger.info(i+":"+j);
cell = row.getCell(j);
if(cell==null){
cell = row.createCell(j);
}
cell.setCellType(CellType.STRING);
list.add(cell.getStringCellValue());
}
//将装有每一列的集合装入大集合
result.add(list);
//关闭资源
workbook.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("===================未找到文件======================");
} catch (IOException e) {
e.printStackTrace();
System.out.println("===================上传失败======================");
}
return result;
}
/**
* 判断上传的excel文件版本(xls为2003,xlsx为2017)
* @param fileName 文件路径
* @return excel2007及以上版本返回true,excel2007以下版本返回false
*/
private static boolean judegExcelEdition(String fileName){
if (fileName.matches("^.+\\.(?i)(xls)$")){
return false;
}else {
return true;
}
}
}
5.controller
package com.laoxu.test.helloweb.controller;
import com.laoxu.test.helloweb.entity.WorkDt;
import com.laoxu.test.helloweb.service.WorkDtService;
import com.laoxu.test.helloweb.util.ExcelUtil;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
/**
* @Description: excel上传
* @Author laoxu
* @Date 2020/1/24 16:25
**/
@Controller
@RequestMapping("/api/excel/")
public class ExcelUploadController {
@Autowired
WorkDtService workDtService;
//接受文件上传
@RequestMapping("/upload")
@ResponseBody
public Map<String,Object> uploadFile(MultipartFile file, HttpServletResponse response) {
Map<String,Object> map = new HashMap<>(16);
//解析excel文件
List<ArrayList<String>> row = ExcelUtil.analysis(file);
if(row.size()>0){
//1.清空表
workDtService.removeAll();
//2.插入数据
WorkDt entity = null;
int size=0;
for (int i = 0;i<row.size();i++){
entity = new WorkDt();
List<String> cell = row.get(i);
size = cell.size();
// 不足32个的 补全
for (int j = size; j < 32; j++) {
cell.add("");
}
entity.setSeqno(Integer.valueOf(cell.get(0)));
entity.setD1(cell.get(1));
entity.setD2(cell.get(2));
entity.setD3(cell.get(3));
entity.setD4(cell.get(4));
entity.setD5(cell.get(5));
entity.setD6(cell.get(6));
entity.setD7(cell.get(7));
entity.setD8(cell.get(8));
...
workDtService.add(entity);
/* for (int j = 0;j<cell.size();j++){
System.out.print(cell.get(j)+" ");
}
System.out.println();*/
}
}
//3.调用存储过程
Map<String,String> param = new HashMap<>();
param.put("year","2019");
param.put("month","12");
workDtService.updateWorkDt(param);
Map<String,Object> result = new HashMap<>();
result.put("code",0);
result.put("msg","");
return result;
}
/**
* 导出
* @param response
* @throws Exception
*/
@GetMapping("/export")
public void export(HttpServletResponse response) throws Exception{
// 创建工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
// 创建sheet
HSSFSheet sheet = workbook.createSheet("sheet1");
// String id = UUID.randomUUID().toString();
String fileName = "计算结果.xls";// 设置要导出的文件的名字
// 获取数据集合
List<WorkDt> list = workDtService.getAll();
// 在表中存放查询到的数据放入对应的列
HSSFRow row = null;
WorkDt entity=null;
for (int i = 0; i < list.size(); i++) {
entity = list.get(i);
row = sheet.createRow(i);
row.createCell(0).setCellValue(entity.getSeqno());
row.createCell(1,CellType.STRING).setCellValue(entity.getD1());
row.createCell(2,CellType.STRING).setCellValue(entity.getH1());
row.createCell(3).setCellValue(entity.getD2());
row.createCell(4).setCellValue(entity.getH2());
row.createCell(5).setCellValue(entity.getD3());
row.createCell(6).setCellValue(entity.getH3());
row.createCell(7,CellType.STRING).setCellValue(entity.getD4());
row.createCell(8,CellType.STRING).setCellValue(entity.getH4());
row.createCell(9).setCellValue(entity.getD5());
row.createCell(10).setCellValue(entity.getH5());
row.createCell(11,CellType.STRING).setCellValue(entity.getD6());
row.createCell(12,CellType.STRING).setCellValue(entity.getH6());
...
}
response.setContentType("application/octet-stream");
response.setHeader("Content-disposition",
"attachment;filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));
response.flushBuffer();
workbook.write(response.getOutputStream());
}
}
spring boot整合poi实现excel文件导入导出实战的更多相关文章
- spring boot 使用 POI 读取Excel文件
内容简介 本文主要介绍使用POI进行Excel文件的相关操作,涉及读取文件,获取sheet表格,对单元格内容进行读写操作,以及合并单元格的操作. Excel文件目录 Excel模板文件存了resour ...
- Excel导入导出工具(简单、好用且轻量级的海量Excel文件导入导出解决方案.)
Excel导入导出工具(简单.好用且轻量级的海量Excel文件导入导出解决方案.) 置顶 2019-09-07 16:47:10 $9420 阅读数 261更多 分类专栏: java 版权声明:本 ...
- NodeJs之EXCEL文件导入导出MongoDB数据库数据
NodeJs之EXCEL文件导入导出MongoDB数据库数据 一,介绍与需求 1.1,介绍 (1),node-xlsx : 基于Node.js解析excel文件数据及生成excel文件. (2),ex ...
- poi实现excel的导入导出功能
Java使用poi实现excel的导入导出功能: 工具类ExcelUtil,用于解析和初始化excel的数据:代码如下 package com.raycloud.kmmp.item.service.u ...
- Excel文件导入导出(基于Nodejs、exceljs)
Excel导入.导出是大多数项目的管理后台必备功能.几年来使用过多个该功能的实现包,最近一次开发该功能,突然发现一个人气极高(3000+)的包,这里记录一下使用方法. 大凡厉害的技术的文档咋一看都想字 ...
- C# excel文件导入导出
欢迎关注微信公众号 C#编程大全 这里有更多入门级实例帮你快速成长 在C#交流群里,看到很多小伙伴在excel数据导入导出到C#界面上存在疑惑,所以今天专门做了这个主题,希望大家有所收获! 环境:wi ...
- spring boot 整合 poi 导出excel
一. 第一种方式 1.首先从中央仓库中导入架包Poi3.14以及Poi-ooxml3.14. <dependency> <groupId>org.apache.poi</ ...
- SSM中使用POI实现excel的导入导出
环境:导入POI对应的包 环境: Spring+SpringMVC+Mybatis POI对应的包 <dependency> <groupId>org.apache.poi&l ...
- Excel文件导入导出
/** * 导入Excel文件数据 * * @param file 将要导入的Excel文件 * @param fileCheckKeyWord 用于判断导入文件是否 ...
- postman 测试Excel文件导入导出功能
1.导入的测试方法 选择form-data,key值填写方法对应的参数,选择File,Value处上传文件即可. 2. 导出的测试方法 在导出文件的时候,响应结果是乱码,然后在测试的时候选择下载,下载 ...
随机推荐
- Shell-函数-function
- [转帖]常用bash脚本功能
https://cloud.tencent.com/developer/article/1906536 1.判断curl返回状态码 #!/bin/bash response=$(curl -sL -o ...
- [转帖]k8s(1.28.2)部署ingress-nginx-controller(1.9.0)
1.部署ingress-nginx-controller 继在三台虚拟机部署k8s后,需要部署ingress-nginx-controller,才能使设置的ingress规则生效. 1.1下载yaml ...
- Kafka的部分初始化参数的学习与整理
Kafka的部分初始化参数的学习与整理 背景 前段时间跟同事一起处理过kafka的topic offset的retention 时间与 log 的retention时间不一致. 导致消息还有, 但是o ...
- VM PowerCli的简单安装和使用学习
1. Win10 上面安装 下载 zip包并且进行安装 win10 已经带了powershell 安装比较简单, 只不过安装时会提示 powershell的权限有问题需要打开powershell 执行 ...
- Raid卡在Write back 与Write through 时的性能差异
还是读姜老师的 mysql技术内核innodb存储引擎这本书里面的内容. 之前知道raid卡的设置会影响性能, 预计也是十几倍的性能差距, 但是从来没有用数据库进行过验证 书中有针对不通raid卡的设 ...
- 学到了,原来 gzip 是种`连续分块`的压缩算法
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 我想要表述的是:假设有 10 mb的数据使用 gzip 算 ...
- ABP-VNext 用户权限管理系统实战02---用户权限表的创建与迁移
一.表实体建立 1.菜单表 [Comment("菜单表")] [Table("t_identity_menu")] public class Menu : Au ...
- 树状数组(区间修改&&区间查询)
#include<bits/stdc++.h> #define int long long using namespace std; int n,m,x,x1,y,z; int a[100 ...
- MindSpore导入CUDA算子
技术背景 当今众多的基于Python的AI框架(如MindSpore.PyTorch等)给了开发者非常便利的编程的条件,我们可以用Python的简单的语法写代码,然后由框架在后端自动编译成可以在GPU ...