postman上传excel,java后台读取excel生成到指定位置进行备份,并且把excel中的数据添加到数据库
最近要做个前端网页上传excel,数据直接添加到数据库的功能。。在此写个读取excel的demo。
首先新建springboot的web项目 导包,读取excel可以用poi也可以用jxl,这里本文用的是poi
poi的 pom依赖如下:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency> <dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
service层的实现类为:
@Service
public class ExcelServiceImpl implements ExcelService {
@Autowired
private CorpTaxService corpTaxService; @Override
public void read(HttpServletRequest request, HttpServletResponse response, MultipartFile file) {
String fileName = "";
String filePath = "D://";
if (file != null && !file.isEmpty()){
fileName = file.getOriginalFilename();
}else {
throw new CECException(501, "上传的文件为空,请重新选择。");
}
BigDecimal tenThsoud = new BigDecimal(10000);
ArrayList<CorpTax> list = new ArrayList<>(); //excel文件路径
// String excelPath2 = "F:\\工作簿2.xlsx";
try {
FileInputStream fis = null;
if (file != null && !file.isEmpty()) { //判断文件是否存在 String[] split = file.getOriginalFilename().split("\\."); //.是特殊字符,需要转义!!!!!
Workbook wb;
//根据文件后缀(xls/xlsx)进行判断
if ( "xls".equals(split[1])){
//fis = new FileInputStream(excel); //文件流对象
wb = new HSSFWorkbook(file.getInputStream());
}else if ("xlsx".equals(split[1])){
wb = new XSSFWorkbook(file.getInputStream());
}else {
System.out.println("文件类型错误!");
throw new CECException(501, "文件类型错误");
} //开始解析
Sheet sheet = wb.getSheetAt(0); //读取sheet 0 int firstRowIndex = sheet.getFirstRowNum()+1; //第一行是列名,所以不读
int lastRowIndex = sheet.getLastRowNum();
System.out.println("firstRowIndex: "+firstRowIndex);
System.out.println("lastRowIndex: "+lastRowIndex); for(int rIndex = firstRowIndex; rIndex <= lastRowIndex; rIndex++) { //遍历行
System.out.println("rIndex: " + rIndex);
Row row = sheet.getRow(rIndex);
if (row != null) {
CorpTax corpTax = new CorpTax();
corpTax.setCorpName(row.getCell(0).getStringCellValue());
corpTax.setTaxData(new BigDecimal(row.getCell(1).getNumericCellValue()).divide(tenThsoud, 6, RoundingMode.HALF_UP));
corpTax.setFiscalRet(new BigDecimal(row.getCell(2).getNumericCellValue()).divide(tenThsoud, 6,RoundingMode.HALF_UP));
corpTax.setIndustry(row.getCell(3).toString());
corpTax.setCorpType(row.getCell(4).toString());
corpTax.setCorpBelong(row.getCell(5).toString());
corpTax.setCorpYear((int)row.getCell(6).getNumericCellValue());
corpTax.setCorpMonth((int)row.getCell(7).getNumericCellValue());
System.out.println(corpTax);
list.add(corpTax);
// 往数据库库添加数据,这里就是一个王数据库的添加操作
int insert = corpTaxService.insert(corpTax);
System.out.println(insert); int firstCellIndex = row.getFirstCellNum();
int lastCellIndex = row.getLastCellNum();
for (int cIndex = firstCellIndex; cIndex < lastCellIndex; cIndex++) { //遍历列
Cell cell = row.getCell(cIndex);
if (cell != null) {
System.out.println(cell.toString());
}
}
}
}
wb.close(); } else {
System.out.println("找不到指定的文件");
}
} catch (Exception e) {
e.printStackTrace();
}
// 把excel生成到指定位置进行备份。
FileInputStream fileInputStream;
try {
fileInputStream = (FileInputStream) file.getInputStream();
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
FileOutputStream fileOutputStream = new FileOutputStream(filePath + fileName);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
byte[] bytes = new byte[1024];
while (bufferedInputStream.read(bytes) != -1){
bufferedOutputStream.write(bytes);
}
bufferedOutputStream.flush();
bufferedOutputStream.close();
bufferedInputStream.close();
} catch (IOException e) {
e.printStackTrace();
} for (CorpTax corpTax : list){
System.out.println(corpTax);
} } public List<CorpTax> test(){
BigDecimal tenThsoud = new BigDecimal(10000);
ArrayList<CorpTax> list = new ArrayList<>(); //excel文件路径 String excelPath2 = "F:\\工作簿2.xlsx";
try {
FileInputStream fis = null;
//String encoding = "GBK";
File excel = new File(excelPath2);
if (excel.isFile() && excel.exists()) { //判断文件是否存在 String[] split = excel.getName().split("\\."); //.是特殊字符,需要转义!!!!!
Workbook wb;
//根据文件后缀(xls/xlsx)进行判断
if ( "xls".equals(split[1])){
fis = new FileInputStream(excel); //文件流对象
wb = new HSSFWorkbook(fis);
}else if ("xlsx".equals(split[1])){
wb = new XSSFWorkbook(excel);
}else {
System.out.println("文件类型错误!");
return null;
} //开始解析
Sheet sheet = wb.getSheetAt(0); //读取sheet 0 int firstRowIndex = sheet.getFirstRowNum()+1; //第一行是列名,所以不读
int lastRowIndex = sheet.getLastRowNum();
System.out.println("firstRowIndex: "+firstRowIndex);
System.out.println("lastRowIndex: "+lastRowIndex); for(int rIndex = firstRowIndex; rIndex <= lastRowIndex; rIndex++) { //遍历行
System.out.println("rIndex: " + rIndex);
Row row = sheet.getRow(rIndex);
if (row != null) {
CorpTax corpTax = new CorpTax();
corpTax.setCorpName(row.getCell(0).getStringCellValue());
corpTax.setTaxData(new BigDecimal(row.getCell(1).getNumericCellValue()).divide(tenThsoud, 6, RoundingMode.HALF_UP));
corpTax.setFiscalRet(new BigDecimal(row.getCell(2).getNumericCellValue()).divide(tenThsoud, 6,RoundingMode.HALF_UP));
corpTax.setIndustry(row.getCell(3).toString());
corpTax.setCorpType(row.getCell(4).toString());
corpTax.setCorpBelong(row.getCell(5).toString());
corpTax.setCorpYear((int)row.getCell(6).getNumericCellValue());
corpTax.setCorpMonth((int)row.getCell(7).getNumericCellValue());
System.out.println(corpTax);
list.add(corpTax);
// int insert = corpTaxService.insert(corpTax); int firstCellIndex = row.getFirstCellNum();
int lastCellIndex = row.getLastCellNum();
for (int cIndex = firstCellIndex; cIndex < lastCellIndex; cIndex++) { //遍历列
Cell cell = row.getCell(cIndex);
if (cell != null) {
System.out.println(cell.toString());
}
}
}
}
wb.close();
// fis.close();
} else {
System.out.println("找不到指定的文件");
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
}
上面这个实现类包含两个方法,上面的那个方法是,可以把excel生成到D盘进行备份,并且读取其中的数据,添加到数据库的(这里读取excel中的数据添加到数据库,是我根据自己的数据库格式,剪切了excel就只剩下了8列,而且每一列的格式都是手动处理的,并没有使用工具类进行处理,网友想要用工具类进行处理,可以参考https://www.cnblogs.com/zhanghaoliang/p/6526089.html)。
controller层就是一个简单的对service层的调用
@RequestMapping("excel")
@RestController
public class ExcelController {
@Autowired
private ExcelService excelService;
@RequestMapping(value = "upload",method = RequestMethod.POST)
public String upLoadExcel(HttpServletRequest request, HttpServletResponse response, @RequestParam(value = "file") MultipartFile file){
excelService.read(request, response, file);
return "ok";
}
}
参考文章:https://www.cnblogs.com/zhanghaoliang/p/6526089.html
https://blog.csdn.net/gxx_csdn/article/details/79085713
https://www.cnblogs.com/cx-code/p/9111336.html
下面说一下,过程中的坑;
1 org.springframework.beans.BeanInstantiationException 这是因为
HttpServletRequest request, HttpServletResponse response 写成了
HttpRequest request, HttpResponse response
postman上传excel,java后台读取excel生成到指定位置进行备份,并且把excel中的数据添加到数据库的更多相关文章
- uploadify前台上传文件,java后台处理的例子
1.先创建一个简单的web项目upload (如图1-1) 2.插件的准备 (1).去uploadify的官网下载一个uploadify插件,然后解压新建个js文件夹放进去(这个不强求,只要路径对了就 ...
- 通过JAVA对FTP服务器连接,上传,下载,读取,移动文件等
记录一次对FTP服务器文件内容 通过Java程序对FTP服务器文件处理:连接,上传,下载,读取,移动文件等. 需求描述:今天接到一个任务,在Java项目中,读取FTP服务器上的一些文件,进行一些业务操 ...
- 求超大文件上传方案( Java )
最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...
- 记录一次node中台转发表单上传文件到后台过程
首发掘金 记录一次node中台转发表单上传文件到后台过程 本篇跟掘金为同一个作者leung 公司几个项目都是三层架构模式即前台,中台(中间层),后台.前台微信端公众号使用vue框架,后台管理前端使 ...
- 从app上传图片到php,再上传到java后端服务器的方法一览
在现在的网络开发中,上传图片类的需求实在是太普通不过了,但是对于怎么样做到上传图片,对于刚开始建立项目的时候,还是有点不知所措的.也许有幸,我们做的项目是之前已经有人写过类似的用例了,那么我们只需要依 ...
- 从app上传图片到php,再上传到java后端服务器的方法一条龙服务
在现在的网络开发中,上传图片类的需求实在是太普通不过了,但是对于怎么样做到上传图片,对于刚开始建立项目的时候,还是有点不知所措的.也许有幸,我们做的项目是之前已经有人写过类似的用例了,那么我们只需要依 ...
- 接口测试-Http状态码-postman上传文件
转自:https://www.cnblogs.com/jiadan/articles/8546015.html 一. 接口 接口:什么是接口呢?接口一般来说有两种,一种是程序内部的接口,一种是系统 ...
- vue图片上传及java存储图片(亲测可用)
1.前言 在使用elementui的upload组件时,我一直无法做到上传的图片和其他数据一起提交.单纯的上传文件,java的存储图片的方式也有局限性. 我知道的后端保存图片有两种方式:一种是直接存储 ...
- java后台读取/解析 excel表格
需求描述 前台需要上传excel表格,提交到后台,后台解析并返回给前台,展示在前台页面上! 前台部分代码与界面 <th style="padding: 7px 1px;width:15 ...
随机推荐
- springMVC + mybatis 下出现JDBC Connection *** will not be managed by Spring错误
仔细查看配置中是否有如下类似的配置 execution(* com.ciguo.service.*.*(..)) <aop:config> <aop:pointcut id=&quo ...
- 恶意代码分析学习之dll相关记录
kernel32.dll 这是一个很常见的DLL,它包含核心系统功能,如访问和操作内存.文件和硬件,Kernel32.dl等等 Advapi32.dll 这个DLL提供了对核心Windows组件的访问 ...
- 从零开始学虚拟DOM
此文主要翻译自:Building a Simple Virtual DOM from Scratch,看原文的同学请直达! 此文是作者在一次现场编程演讲时现场所做的,有关演讲的相关资料我们也可以在原英 ...
- RabbitMQ java 原生代码
rabbitMQ 的交换器有四种类型:direct.fanout.topic.headers 以下是具体的代码: direct:路由键只能全部匹配,才能进入到指定队列中.其他使用 direct生产者 ...
- 18,flask项目中使用celery
导包: from celery import Celery from celery.result import AsyncResult app.config['CELERY_BROKER_URL'] ...
- ssmtp脚本发中文邮件的笔记
( echo "From:<test@abc.com>"; \ echo "TO:def@abc.com"; \ echo "Subjec ...
- MySQL JOIN原理(转)
先看一下实验的两张表: 表comments,总行数28856 表comments_for,总行数57,comments_id是有索引的,ID列为主键. 以上两张表是我们测试的基础,然后看一下索引,co ...
- SpringBoot -生成Entity和Dto互转的双向枚举类 -使用注解@Mapper(componentModel = "spring")
1.导入pom文件 ,版本号自定 <!--mapStruct依赖--> <dependency> <groupId>org.mapstruct</groupI ...
- JDK源码那些事儿之SynchronousQueue下篇
之前一篇文章已经讲解了阻塞队列SynchronousQueue的大部分内容,其中默认的非公平策略还未说明,本文就紧接上文继续讲解其中的非公平策略下的内部实现,顺便简单说明其涉及到的线程池部分的使用 前 ...
- BZOJ1396 识别子串 和 BZOJ2865 字符串识别
字符串识别 2865: 字符串识别 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 839 Solved: 261[Submit][Status][D ...