EXCEL上传POI
Java SpringMVC POI上传excel并读取文件内容
用的SSM框架,所需要的jar包如图所示:,链接地址:jar包下载 ,下面直接上代码。
1、ExcelUtil工具类
[java] view plain copy
- <span style="color:#993399;"><span style="font-size:18px;color:#993399;">import java.text.DecimalFormat;
- import java.text.SimpleDateFormat;
- import java.util.Calendar;
- import java.util.Date;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- import org.apache.poi.hssf.usermodel.HSSFCell;
- import org.apache.poi.hssf.usermodel.HSSFDateUtil;
- import org.apache.poi.ss.usermodel.Cell;
- import org.apache.poi.ss.usermodel.DateUtil;
- import org.apache.poi.xssf.usermodel.XSSFCell;
- /**
- * Excel工具类
- * @author lp
- *
- */
- public class ExcelUtil {
- public static final String OFFICE_EXCEL_2003_POSTFIX = "xls";
- public static final String OFFICE_EXCEL_2010_POSTFIX = "xlsx";
- public static final String EMPTY = "";
- public static final String POINT = ".";
- public static SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
- /**
- * 获得path的后缀名
- * @param path
- * @return
- */
- public static String getPostfix(String path){
- if(path==null || EMPTY.equals(path.trim())){
- return EMPTY;
- }
- if(path.contains(POINT)){
- return path.substring(path.lastIndexOf(POINT)+1,path.length());
- }
- return EMPTY;
- }
- /**
- * 单元格格式
- * @param hssfCell
- * @return
- */
- @SuppressWarnings({ "static-access", "deprecation" })
- public static String getHValue(HSSFCell hssfCell){
- if (hssfCell.getCellType() == hssfCell.CELL_TYPE_BOOLEAN) {
- return String.valueOf(hssfCell.getBooleanCellValue());
- } else if (hssfCell.getCellType() == hssfCell.CELL_TYPE_NUMERIC) {
- String cellValue = "";
- if(HSSFDateUtil.isCellDateFormatted(hssfCell)){
- Date date = HSSFDateUtil.getJavaDate(hssfCell.getNumericCellValue());
- cellValue = sdf.format(date);
- }else{
- DecimalFormat df = new DecimalFormat("#.##");
- cellValue = df.format(hssfCell.getNumericCellValue());
- String strArr = cellValue.substring(cellValue.lastIndexOf(POINT)+1,cellValue.length());
- if(strArr.equals("00")){
- cellValue = cellValue.substring(0, cellValue.lastIndexOf(POINT));
- }
- }
- return cellValue;
- } else {
- return String.valueOf(hssfCell.getStringCellValue());
- }
- }
- /**
- * 单元格格式
- * @param xssfCell
- * @return
- */
- public static String getXValue(XSSFCell xssfCell){
- if (xssfCell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
- return String.valueOf(xssfCell.getBooleanCellValue());
- } else if (xssfCell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
- String cellValue = "";
- if(XSSFDateUtil.isCellDateFormatted(xssfCell)){
- Date date = XSSFDateUtil.getJavaDate(xssfCell.getNumericCellValue());
- cellValue = sdf.format(date);
- }else{
- DecimalFormat df = new DecimalFormat("#.##");
- cellValue = df.format(xssfCell.getNumericCellValue());
- String strArr = cellValue.substring(cellValue.lastIndexOf(POINT)+1,cellValue.length());
- if(strArr.equals("00")){
- cellValue = cellValue.substring(0, cellValue.lastIndexOf(POINT));
- }
- }
- return cellValue;
- } else {
- return String.valueOf(xssfCell.getStringCellValue());
- }
- }
- /**
- * 自定义xssf日期工具类
- * @author lp
- *
- */
- class XSSFDateUtil extends DateUtil{
- protected static int absoluteDay(Calendar cal, boolean use1904windowing) {
- return DateUtil.absoluteDay(cal, use1904windowing);
- }
- }</span></span>
2、ExcelRead:读取Excel类
[java] view plain copy
- package com.ssm.util;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.List;
- import org.apache.poi.hssf.usermodel.HSSFCell;
- 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.xssf.usermodel.XSSFCell;
- import org.apache.poi.xssf.usermodel.XSSFRow;
- import org.apache.poi.xssf.usermodel.XSSFSheet;
- import org.apache.poi.xssf.usermodel.XSSFWorkbook;
- import org.springframework.web.multipart.MultipartFile;
- /**
- * 读取Excel
- * @author lp
- *
- */
- public class ExcelRead {
- public int totalRows; //sheet中总行数
- public static int totalCells; //每一行总单元格数
- /**
- * read the Excel .xlsx,.xls
- * @param file jsp中的上传文件
- * @return
- * @throws IOException
- */
- public List<ArrayList<String>> readExcel(MultipartFile file) throws IOException {
- if(file==null||ExcelUtil.EMPTY.equals(file.getOriginalFilename().trim())){
- return null;
- }else{
- String postfix = ExcelUtil.getPostfix(file.getOriginalFilename());
- if(!ExcelUtil.EMPTY.equals(postfix)){
- if(ExcelUtil.OFFICE_EXCEL_2003_POSTFIX.equals(postfix)){
- return readXls(file);
- }else if(ExcelUtil.OFFICE_EXCEL_2010_POSTFIX.equals(postfix)){
- return readXlsx(file);
- }else{
- return null;
- }
- }
- }
- return null;
- }
- /**
- * read the Excel 2010 .xlsx
- * @param file
- * @param beanclazz
- * @param titleExist
- * @return
- * @throws IOException
- */
- @SuppressWarnings("deprecation")
- public List<ArrayList<String>> readXlsx(MultipartFile file){
- List<ArrayList<String>> list = new ArrayList<ArrayList<String>>();
- // IO流读取文件
- InputStream input = null;
- XSSFWorkbook wb = null;
- ArrayList<String> rowList = null;
- try {
- input = file.getInputStream();
- // 创建文档
- wb = new XSSFWorkbook(input);
- //读取sheet(页)
- for(int numSheet=0;numSheet<wb.getNumberOfSheets();numSheet++){
- XSSFSheet xssfSheet = wb.getSheetAt(numSheet);
- if(xssfSheet == null){
- continue;
- }
- totalRows = xssfSheet.getLastRowNum();
- //读取Row,从第二行开始
- for(int rowNum = 1;rowNum <= totalRows;rowNum++){
- XSSFRow xssfRow = xssfSheet.getRow(rowNum);
- if(xssfRow!=null){
- rowList = new ArrayList<String>();
- totalCells = xssfRow.getLastCellNum();
- //读取列,从第一列开始
- for(int c=0;c<=totalCells+1;c++){
- XSSFCell cell = xssfRow.getCell(c);
- if(cell==null){
- rowList.add(ExcelUtil.EMPTY);
- continue;
- }
- rowList.add(ExcelUtil.getXValue(cell).trim());
- }
- list.add(rowList);
- }
- }
- }
- return list;
- } catch (IOException e) {
- e.printStackTrace();
- } finally{
- try {
- input.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return null;
- }
- /**
- * read the Excel 2003-2007 .xls
- * @param file
- * @param beanclazz
- * @param titleExist
- * @return
- * @throws IOException
- */
- public List<ArrayList<String>> readXls(MultipartFile file){
- List<ArrayList<String>> list = new ArrayList<ArrayList<String>>();
- // IO流读取文件
- InputStream input = null;
- HSSFWorkbook wb = null;
- ArrayList<String> rowList = null;
- try {
- input = file.getInputStream();
- // 创建文档
- wb = new HSSFWorkbook(input);
- //读取sheet(页)
- for(int numSheet=0;numSheet<wb.getNumberOfSheets();numSheet++){
- HSSFSheet hssfSheet = wb.getSheetAt(numSheet);
- if(hssfSheet == null){
- continue;
- }
- totalRows = hssfSheet.getLastRowNum();
- //读取Row,从第二行开始
- for(int rowNum = 1;rowNum <= totalRows;rowNum++){
- HSSFRow hssfRow = hssfSheet.getRow(rowNum);
- if(hssfRow!=null){
- rowList = new ArrayList<String>();
- totalCells = hssfRow.getLastCellNum();
- //读取列,从第一列开始
- for(short c=0;c<=totalCells+1;c++){
- HSSFCell cell = hssfRow.getCell(c);
- if(cell==null){
- rowList.add(ExcelUtil.EMPTY);
- continue;
- }
- rowList.add(ExcelUtil.getHValue(cell).trim());
- }
- list.add(rowList);
- }
- }
- }
- return list;
- } catch (IOException e) {
- e.printStackTrace();
- } finally{
- try {
- input.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return null;
- }
- }
[java] view plain copy
3、Controller
[java] view plain copy
- /**
- * 转到Excel上传页面
- * @return
- * @author lp
- */
- @RequestMapping(value="/read")
- public String addExcel(){
- return "baseInfo/testExcel";
- }
- **
- * 读取Excel数据到数据库
- * @param file
- * @param request
- * @return
- * @throws IOException
- * @author lp
- */
- @RequestMapping(value="/readExcel")
- public ModelAndView readExcel(@RequestParam(value="excelFile") MultipartFile file,
- HttpServletRequest request,HttpSession session) throws IOException{
- ModelAndView mv = new ModelAndView();
- //判断文件是否为空
- if(file == null){
- mv.addObject("msg", "failed");
- mv.setViewName("excel_result");
- return mv;
- }
- String name = file.getOriginalFilename();
- long size = file.getSize();
- if(name == null || ExcelUtil.EMPTY.equals(name) && size==0){
- mv.addObject("msg", "failed");
- mv.setViewName("excel_result");
- return mv;
- }
- //读取Excel数据到List中
- List<ArrayList<String>> list = new ExcelRead().readExcel(file);
- //list中存的就是excel中的数据,可以根据excel中每一列的值转换成你所需要的值(从0开始),如:
- User user = null;
- List<User> liseUser = new ArrayList<User>();
- for(ArrayList<String> arr:list){
- user= new User();
- user.setAuthor(list.get(0));//每一行的第一个单元格
- listUser.add(user);
- }
- if(userService.saveBatchInsert(listUser)){
- mv.addObject("msg", "success");
- }else{
- mv.addObject("msg", "failed");
- }
- mv.setViewName("excel_result");
- return mv;
- }</span></span>
4、jsp
(1)主页面添加“Excel导入”
<a href="javascript:addExcel();"><em>Excel导入</em></a>function addExcel(){var dg = new $.dialog({title:'导入Excel',id:'excel',width:1000,height:400,iconTitle:false,cover:true,maxBtn:false,xButton:true,resize:false,page:'user/read.html',});dg.ShowDialog();}
(2)导入页面
[html] view plain copy
- <body>
- <form action="readExcel.html" enctype="multipart/form-data" method="post" id="batchAdd" name="batchAdd" target="result" onsubmit="return check();>
- <div style="margin: 30px;">
- <div><input id="excel_file" type="file" name="excelFile" size="50"/>
- </form>
- <iframe name="result" id="result" src="about:blank" frameborder="0" width="0" height="0"></iframe>
- </body>
- </html>
- <script type="text/javascript">
- var dg;
- $(document).ready(function(){
- dg = frameElement.lhgDG;
- dg.addBtn('ok','保存',function(){
- $("#batchAdd").submit();
- this.disabled=true;
- });
- });
- function success(){
- if(dg.curWin.document.forms[0]){
- dg.curWin.document.forms[0].action = dg.curWin.location+"";
- dg.curWin.document.forms[0].submit();
- }else{
- dg.curWin.location.reload();
- }
- dg.cancel();
- }
- function failed(){
- alert("上传失败!");
- }
- </script>
(3)提示页面
[html] view plain copy
- <body>
- <script type="text/javascript">
- var msg = "${msg}";
- if(msg=="success" || msg==""){
- alert("保存成功");
- parent.success();
- }else{
- parent.failed();
- }
- </script>
- </body>
5、service层
service
boolean saveBatchInsert(List<User> listUser);
serviceimpl
@Transactional
public boolean saveBatchInsert(List<User> listUser){
boolean flag = false;
if(listBaseInfo != null){
userMapper.batchInsert(listUser);
flag = true;
}
return flag;
}
6、dao层
void batchInsert(List<User> list);
7、xml(oracle)
[html] view plain copy
- <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="false" keyProperty="Id">
- insert into baseinfo(ID,Name,Sex,Birth,IdCardNo,Address,Tel,Author,AddDate,Status)
- <foreach collection="list" item="item" index="index" separator="union all">
- (select
- <span style="white-space:pre"> </span>#{item.id,jdbcType=NUMERIC},
- #{item.name,jdbcType=VARCHAR},
- #{item.sex,jdbcType=CHAR},
- #{item.birth,jdbcType=DATE},
- #{item.idCardNo,jdbcType=CHAR},
- #{item.address,jdbcType=VARCHAR},
- #{item.tel,jdbcType=VARCHAR},
- #{item.author,jdbcType=VARCHAR},
- #{item.addDate,jdbcType=DATE},
- #{item.status,jdbcType=CHAR}
- from dual)
- </foreach>
- </insert>
EXCEL上传POI的更多相关文章
- poi之Excel上传
poi之Excel上传 @RequestMapping(value = "/import", method = RequestMethod.POST) public String ...
- excel上传和下载
需要注意的地方: 1.js构造表单并提交 2.js中文传参encodeURI(encodeURI("中文")),action接收并转换value = URLDecoder.deco ...
- IT轮子系列(六)——Excel上传与解析,一套代码解决所有Excel业务上传,你Get到了吗
前言 在日常开发当中,excel的上传与解析是很常见的.根据业务不同,解析的数据模型也都不一样.不同的数据模型也就需要不同的校验逻辑,这往往需要写多套的代码进行字段的检验,如必填项,数据格式.为了避免 ...
- Excel上传并读取数据
最近一段时间,维护一个旧系统,其中有一个功能,是把Excel上传,并读取数据进行维护,然后转插入至SQL数据库中.下面Insus.NET使用asp.net 标准上传控件: <asp:FileUp ...
- 基于thinkphp5的Excel上传
涉及知识点: thinkphp5.0: excel上传: mysql建立新表(基本的create语句): mysql ignore(避免重复插入): 主要功能: 通过在视图中上传excel文件,在my ...
- 2019.06.05 ABAP EXCEL 操作类代码 OLE方式(模板下载,excel上传,内表下载)
一般使用标准的excel导入方法9999行,修改了标准的excel导入FM 整合出类:excel的 模板下载,excel上传,ALV内表下载功能. 在项目一开始可以SE24创建一个类来供整体开发使用, ...
- F9 excel上传
1 在前台制定文件上传按钮 <div id="dataImport" class="mini-webuploader" pickerText=" ...
- 基于BootStrap的initupload()实现Excel上传和获取excel中的数据
简单说明:后边要做exl解析(还没做呢),所以先有一个excel的的上传以及获取excel中的数据,展示出来. 代码: //html代码 <div class="btn-group&q ...
- c# vs2010 excel 上传oracle数据
excel 数据表上传到oracle数据库.过程例如以下: 1.打开本地excel文件 2.用OleDb连接excel文件 3.将来excel的数据读取到dataset中 4.把dataset 中数据 ...
随机推荐
- 基于令牌桶算法实现的SpringBoot分布式无锁限流插件
本文档不会是最新的,最新的请看Github! 1.简介 基于令牌桶算法和漏桶算法实现的纳秒级分布式无锁限流插件,完美嵌入SpringBoot.SpringCloud应用,支持接口限流.方法限流.系统限 ...
- 类String 常用方法
字符串当中的常用方法之比较相关的方法 public boolean equals (object obj):将此字符串与指定的对象进行比较(只有参数是字符串并且内容相同才会返回true) public ...
- vue 修改数据界面没有及时更新nextTick
使用场景:有些时候,我们使用vue修改了一些数据,但是页面上的DOM还没有更新,这个时候我们就需要使用到nextTick. vm.$nextTick( [callback] ) 说明: 将回调延迟到下 ...
- MySQL主从复制(一)
whereis...命令的使用:
- ABP中的Filter(上)
这个部分我打算用上下两个部分来将整个结构来讲完,在我们读ABP中的代码之后我们一直有一个疑问?在ABP中为什么要定义Interceptor和Filter,甚至这两者之间我们都能找到一些对应关系,比如: ...
- servlet(1)
servlet类分级: 1.ServletConfig接口类:理解为读取servlet配置的类,里面有四个抽象方法如下: ①getServletName:获取servlet在web.xml中的名字 ② ...
- Plctext 如何发送默认的模式
当切屏指令都没有的情况下,就会发,即:当65这个地址位(0-7),都为零的情况下.
- chrome常用扩展程序汇总(程序员版)
chrome常用扩展程序之程序员版 1.chrome扩展程序 Chrome插件是一个由Web技术开发.用来增强浏览器功能的小程序,其实就是一个由HTML.CSS.JS.图片等静态资源组成的一个.crx ...
- Docke--Dockerfile实践
Dockerfile 实践 nginx镜像构建 先查看下本地的镜像,选取官网的centos作为base image: [root@server ~]# docker images REPOSITORY ...
- python12--字符串的比较 函数的默认值的细节 三元表达式 函数对象 名称空间 作用域 列表与字典的推导式 四则运算 函数的嵌套
复习 1.字符串的比较; 2.函数的参数; ******实参与形参的分类: 3.函数的嵌套调用: # 字符串的比较# -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 ...