springMVC从上传的Excel文件中读取数据
示例:导入客户文件(Excle文件)
一、编辑customer.xlsx
二、在spring的xml文件设置上传文件大小
<!-- 上传文件拦截,设置最大上传文件大小 10M=10*1024*1024(B)=10485760 bytes --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="10485760" /> </bean>
三、编辑jsp(addCustomer3.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html><% String importMsg=""; if(request.getSession().getAttribute("msg")!=null){ importMsg=request.getSession().getAttribute("msg").toString(); } request.getSession().setAttribute("msg", ""); %> <head><title>批量导入客户</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><body><div><font color="bule">批量导入客户</font></div><form action="addController/batchimport" method="post" enctype="multipart/form-data" οnsubmit="return check();"><div style="margin: 30px;"><input id="excel_file" type="file" name="filename" accept="xlsx" size="80"/><input id="excel_button" type="submit" value="导入Excel"/></div><font id="importMsg" color="red"><%=importMsg%></font><input type="hidden"/></form></body><script type="text/javascript"> function check() { var excel_file = $("#excel_file").val(); if (excel_file == "" || excel_file.length == 0) { alert("请选择文件路径!"); return false; } else { return true; } } $(document).ready(function () { var msg=""; if($("#importMsg").text()!=null){ msg=$("#importMsg").text(); } if(msg!=""){ alert(msg); } }); </script></html>
四、编辑java文件
4.1 控制器代码(AddController.java)
@Controller @RequestMapping("toPage/addController/") public class AddController {private static Log log = LogFactory.getLog(AddController.class);@Autowiredprivate CustomerService customerService;@RequestMapping(value = "batchimport", method = RequestMethod.POST)public String batchimport(@RequestParam(value="filename") MultipartFile file,HttpServletRequest request,HttpServletResponse response) throws IOException{log.info("AddController ..batchimport() start");//判断文件是否为空if(file==null) return null;//获取文件名String name=file.getOriginalFilename();//进一步判断文件是否为空(即判断其大小是否为0或其名称是否为null)long size=file.getSize();if(name==null || ("").equals(name) && size==0) return null;//批量导入。参数:文件名,文件。boolean b = customerService.batchImport(name,file);if(b){String Msg ="批量导入EXCEL成功!";request.getSession().setAttribute("msg",Msg); }else{String Msg ="批量导入EXCEL失败!";request.getSession().setAttribute("msg",Msg);} return "Customer/addCustomer3";}}
4.2 服务层代码(CustomerService.java),即上述方法中 customerService.batchImport(name,file);语句所调用的方法
//批量导入客户public boolean batchImport(String name,MultipartFile file){boolean b = false;//创建处理EXCELReadExcel readExcel=new ReadExcel();//解析excel,获取客户信息集合。List<Customer> customerList = readExcel.getExcelInfo(name ,file);if(customerList != null){b = true;}//迭代添加客户信息(注:实际上这里也可以直接将customerList集合作为参数,在Mybatis的相应映射文件中使用foreach标签进行批量添加。)for(Customer customer:customerList){customerDoImpl.addCustomers(customer);}return b;}
4.3 工具类代码(ReadExcel.java),即上述方法中readExcel.getExcelInfo(name ,file);语句所调用的方法以及其他相关的方法
Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。不过这首先得判断Excel的版本而选择不同的Workbook的方式(2003版本对应的是HSSFWorkbook,2007版本及以上对应的是XSSFWorkbook)。此外,一般来说先将在客户端用户上传的文件拷贝一份至服务器的本地磁盘中,然后再从这个拷贝文件中进行读取,这样就避免了因客户端的网络异常或其他状况而在读取时造成的数据流失或损坏的情况。
package com.jun.util;import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Date; import java.util.List;import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.commons.CommonsMultipartFile;import com.jun.service.CustomerService; import com.jun.vo.Customer;public class ReadExcel {//总行数private int totalRows = 0; //总条数private int totalCells = 0; //错误信息接收器private String errorMsg;//构造方法public ReadExcel(){}//获取总行数public int getTotalRows() { return totalRows;} //获取总列数public int getTotalCells() { return totalCells;} //获取错误信息public String getErrorInfo() { return errorMsg; } /*** 验证EXCEL文件* @param filePath* @return*/public boolean validateExcel(String filePath){if (filePath == null || !(WDWUtil.isExcel2003(filePath) || WDWUtil.isExcel2007(filePath))){ errorMsg = "文件名不是excel格式"; return false; } return true;}/*** 读EXCEL文件,获取客户信息集合* @param fielName* @return*/public List<Customer> getExcelInfo(String fileName,MultipartFile Mfile){//把spring文件上传的MultipartFile转换成CommonsMultipartFile类型CommonsMultipartFile cf= (CommonsMultipartFile)Mfile; //获取本地存储路径File file = new File("D:\\fileupload");//创建一个目录 (它的路径名由当前 File 对象指定,包括任一必须的父路径。)if (!file.exists()) file.mkdirs();//新建一个文件File file1 = new File("D:\\fileupload" + new Date().getTime() + ".xlsx"); //将上传的文件写入新建的文件中try {cf.getFileItem().write(file1); } catch (Exception e) {e.printStackTrace();}//初始化客户信息的集合 List<Customer> customerList=new ArrayList<Customer>();//初始化输入流InputStream is = null; try{//验证文件名是否合格if(!validateExcel(fileName)){return null;}//根据文件名判断文件是2003版本还是2007版本boolean isExcel2003 = true; if(WDWUtil.isExcel2007(fileName)){isExcel2003 = false; }//根据新建的文件实例化输入流is = new FileInputStream(file1);//根据excel里面的内容读取客户信息customerList = getExcelInfo(is, isExcel2003); is.close();}catch(Exception e){e.printStackTrace();} finally{if(is !=null){try{is.close();}catch(IOException e){is = null; e.printStackTrace(); }}}return customerList;}/*** 根据excel里面的内容读取客户信息* @param is 输入流* @param isExcel2003 excel是2003还是2007版本* @return* @throws IOException*/public List<Customer> getExcelInfo(InputStream is,boolean isExcel2003){List<Customer> customerList=null;try{/** 根据版本选择创建Workbook的方式 */Workbook wb = null;//当excel是2003时if(isExcel2003){wb = new HSSFWorkbook(is); }else{//当excel是2007时wb = new XSSFWorkbook(is); }//读取Excel里面客户的信息customerList=readExcelValue(wb);}catch (IOException e) { e.printStackTrace(); } return customerList;}/*** 读取Excel里面客户的信息* @param wb* @return*/private List<Customer> readExcelValue(Workbook wb){ //得到第一个shell Sheet sheet=wb.getSheetAt(0);//得到Excel的行数this.totalRows=sheet.getPhysicalNumberOfRows();//得到Excel的列数(前提是有行数)if(totalRows>=1 && sheet.getRow(0) != null){this.totalCells=sheet.getRow(0).getPhysicalNumberOfCells();}List<Customer> customerList=new ArrayList<Customer>();Customer customer; //循环Excel行数,从第二行开始。标题不入库for(int r=1;r<totalRows;r++){Row row = sheet.getRow(r);if (row == null) continue;customer = new Customer();//循环Excel的列for(int c = 0; c <this.totalCells; c++){ Cell cell = row.getCell(c);if (null != cell){if(c==0){//第一列不读}else if(c==1){customer.setcName(cell.getStringCellValue());//客户名称}else if(c==2){customer.setSimpleName(cell.getStringCellValue());//客户简称}else if(c==3){customer.setTrade(cell.getStringCellValue());//行业}else if(c==4){customer.setSource(cell.getStringCellValue());//客户来源}else if(c==5){customer.setAddress(cell.getStringCellValue());//地址}else if(c==6){customer.setRemark(cell.getStringCellValue());//备注信息}}}//添加客户customerList.add(customer);}return customerList;}}
4.4 工具类代码(WDWUtil.java)
public class WDWUtil {// @描述:是否是2003的excel,返回true是2003 public static boolean isExcel2003(String filePath) { return filePath.matches("^.+\\.(?i)(xls)$"); } //@描述:是否是2007的excel,返回true是2007 public static boolean isExcel2007(String filePath) { return filePath.matches("^.+\\.(?i)(xlsx)$"); } }
说明:上面的代码为了阅读便利而先贴的是父方法,后贴的是子方法,而在实际的代码编辑中一般是先编辑子方法,后编辑父方法,如上面应该是先编辑工具类的代码,再编辑服务层的代码,最后编辑控制器的代码。
运行结果:(先点击“选择文件”,再点击“导入Excel”)
数据库:
后记:此博客省略了模型层的代码,此项目采用的是Mybatis。
鉴于博友提的上传去重的问题,也是思考了自己的想法,这里先引用其他博友解决的思路 Excel导入去重
springMVC从上传的Excel文件中读取数据相关推荐
- POI:从Excel文件中读取数据,向Excel文件中写入数据,将Excel表格中的数据插入数据库,将数据库中的数据添加到Excel表
POI 简介: POI是Apache软件基金会用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能. ...
- r导入txt乱码_R学习笔记系列—R语言从文本和Excel文件中读取数据-excel打开是乱码...
1.4.1 从文本文件中导入数据 可以使用 read.table() 函数从带分隔符的文本文件中导入数.调用格式为: 这个函数看上去很复杂,但其实很多参数在使用时不用明确指出来,使用默认值可以满足绝大 ...
- 服务器上传excel文件并读取数据,asp.net上传Excel文件并读取数据的实现方法
前言 本文主要给大家介绍了关于asp.net上传Excel文件并读取数据的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 实现如下: 前台代码:使用服务端控件实现上传 服务端 ...
- matlab如何读取excel文件中的数据?_Python自动化之从Excel文件读取数据
前言: 在Python语言,常用的excel读写库有xrld和openpyxl两个,当然pandas库也可以从excel文件中读取数据,但这里不建议使用.有个问题就是,xrld只能用于读取数据而不能用 ...
- java file数组 初始化_java从文件中读取数据并赋值给数组
从txt文件中读取数据赋值给一维数组 字节流读入字节数组中 字节数组转化为字符串 字符创解析为字符串数组 字符串数组转化为数值,并赋值为数组 文本文件是以字节的形式储存的. 在txt文件中一个数字或者 ...
- java struts2 excel上传_文件上传下载——通过struts的FormFile上传单个excel文件
通过struts的FormFile上传单个excel文件 思路: 1.通过struts的FormFile获取File(这个文件的路径是"客户端的选择的路径地址") 2.将客户端的文 ...
- 使用Python批量筛选上千个Excel文件中的某一行数据并另存为新Excel文件(下篇)
点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 野火烧不尽,春风吹又生. 大家好, ...
- Java读取、写入、处理Excel文件中的数据
在日常工作中,我们常常会进行文件读写操作,除去我们最常用的纯文本文件读写,更多时候我们需要对Excel中的数据进行读取操作,本文将介绍Excel读写的常用方法,希望对大家学习Java读写Excel会有 ...
- matlab引用数据,excel引用数据-如何用matlab处理excel文件中的数据?
如何利用matlab根据excel表格里面的数据画图 将待导入的矩阵结数据Excel中,录入时注意行列原矩阵一一对应 录入完以后数据,为了后续步骤使用方便,命名时我们最好把它命名为我们接下来在MATL ...
最新文章
- 获取qt保存对话框中输入文本_PyQt5 输入对话框QInputDialog
- 无心剑中译杰克•谢弗《当默多克遇到撒旦》
- vue状态管理存取数据_Vue中的数据通信和状态管理
- 遗传算法(2):对适应度函数的改进
- 2014年8月22日 百度发布“冰桶算法”
- 字节、腾讯、金山wps、跟谁学、百度 go工程师面试题集锦
- SLAM入门之数学基础
- android开发者mac(含M1芯片)电脑全新配置2022
- 高德天气 php,高德开放平台天气查询API
- 一个普通程序员和他的猫
- css之overflow
- (项目)在线教育平台(十二)
- Ionic Capacitor 插件开发
- LeetCode 2296. 设计一个文本编辑器(双栈)
- open、write、read函数总结(初学者,请见谅)
- 网上有一款测试人血压的软件,中国和加拿大合作新研究开发出一款可通过自拍测量血压的软件...
- 报童问题求解最大利润_SVD求解ICP问题
- 墨尔本大学计算机qs排名,澳洲墨尔本大学的QS世界排名多少
- libra测试环境搭建
- 完全随机试验设计 事后均值检测
热门文章
- docker 安装wordpress
- 解决数据库报唯一性约束错误的实践
- Linux常用命令之文件和目录处理命令
- Smart/400开发上手2: COBOL批处理程序处理过程
- ./wls1036_linux32.bin: /lib/ld-linux.so.2: bad ELF interpreter
- Quartz2D之绘制一个简单的机器猫
- 表单提交数据丢失的问题
- 移动应用可以通过微信沟通接口连接公众号 微信涨粉多了一个新通道
- Windows 查看程序占用的端口
- Oracle On Linux