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. 导出的测试方法 在导出文件的时候,响应结果是乱码,然后在测试的时候选择下载,下载 ...
随机推荐
- Python注释是什么东东
注释 标注解释,目的是帮助读者理解的文本 也就是说,注释首先是文本,其二是说明,其三是思路,其四是例子注释有两种形式 1. # ... 单行注释 用于对某句语句或语句块进行解释 放在语句块的头行或一个 ...
- [转帖]django使用html渲染页面样式+数据库管理员的创建
一.django页面渲染 1.在templates中创建html格式的文件-index.html,在该文件中添加body,设置样式,比如: <h1 style = "backgroun ...
- [转帖]tidb-lightning 逻辑模式导入
https://docs.pingcap.com/zh/tidb/stable/tidb-lightning-configuration 本文档介绍如何编写逻辑导入模式的配置文件,如何进行性能调优等内 ...
- [转帖]性能测试工具netperf安装使用
https://blog.51cto.com/dingtongxue1990/1853714 netperf工具使用 一.安装 1,下载 liunx下载地址:ftp://ftp.netperf.org ...
- [转帖]【有效解决】Edge浏览器提示你的连接不是专用连接怎么办?
https://www.xitongzhijia.net/xtjc/20230524/290887.html Win11正式版iso镜像最新(22H2新版) V2023 大小:4.22 GB类别:Wi ...
- [转帖]SPEC2006
安装步骤 # Ubuntu16.04 # 注意安装gFortran . ./install.sh . ./shrc 一般情况下经过以上步骤即可安装完毕,进行使用,注意需要执行shrc设置完环境变量以后 ...
- 自建邮箱服务器 EwoMail 发送邮件的办法
总结来源: http://doc.ewomail.com/docs/ewomail/changguipeizhi 1. 首先这个机器不能安装dovecot等软件,不然安装脚本会失败. 2. 下载安装文 ...
- element-ui中Select 选择器列表内容居中
<el-select class="my-el-select" v-model="tenantCont" placeholder="请输入机构标 ...
- linux虚拟机固定ip
1.查看宿主机IP信息 在windows宿主机上,键盘输入win+r,输出cmd,打开终端命令行: 输入ipconfig /all,查看宿主机IP信息: 2.修改Linux虚拟机的配置文件 Linux ...
- 【一】gym环境安装以及安装遇到的错误解决
相关文章: [一]gym环境安装以及安装遇到的错误解决 [二]gym初次入门一学就会-简明教程 [三]gym简单画图 [四]gym搭建自己的环境,全网最详细版本,3分钟你就学会了! [五]gym搭建自 ...