springMVC从上传的Excel文件中读取数据

示例:导入客户文件(Excle文件)

一、编辑customer.xlsx

二、编辑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" onsubmit="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文件

3.1 控制器代码(AddController.java)

@Controller
@RequestMapping("toPage/addController/")
public class AddController {

    private static Log log = LogFactory.getLog(AddController.class);
     @Autowired
     private 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";
     }

}

3.2 服务层代码(CustomerService.java),即上述方法中 customerService.batchImport(name,file);语句所调用的方法

   //批量导入客户
    public boolean batchImport(String name,MultipartFile file){
        boolean b = false;
        //创建处理EXCEL
        ReadExcel 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;
    }

3.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;
  }

}

3.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。

时间: 2024-12-24 21:48:37

springMVC从上传的Excel文件中读取数据的相关文章

java的JFileChooser上传一个Excel文件并读取该文件的内容

一.描述 无论是jsp中还是swing中的上传文件组件都可能上传一个Excel文件并且按行读取文件的记录,读取记录后可以提供数据的显示功能,也可以构造sql语句进行数据库中数据的查询等. 例如我们上传一份用户名单,其中包括用户姓名,性别和身份证号,我们将用户真实姓名加上身份证后四位作为用户账号查询数据库中是否有该用户信息,上传的表格如下: 二.所需工具 java要调用Excel并且读取Excel文件中的数据,就必须使用jxl.jar札包,所以先获取该札包然后引入到java项目中. 该札包的免费下

ci框架读取上传的excel文件数据

原文链接: https://blog.csdn.net/qq_38148394/article/details/87921373 此功能实现使用到PHPExcel类库,PHPExcel是一个PHP类库,用来帮助我们简单.高效实现从Excel读取Excel的数据和导出数据到Excel.也是我们日常开发中,经常会遇到的使用场景. (一) PHPExcel下载 类库下载地址:https://github.com/PHPOffice/PHPExcel (二) PHPExcel引入到CI框架 1) 解压压

[Python]将Excel文件中的数据导入MySQL

Github Link 需求 现有2000+文件夹,每个文件夹下有若干excel文件,现在要将这些excel文件中的数据导入mysql. 每个excel文件的第一行是无效数据. 除了excel文件中已有的数据,还要添加一列,名为“at_company”,值为821. 流程 (1)获取excel文件列表,并根据excel文件名确定之后需要创建的table名: (2)连接mysql (3)创建table (4)插入数据 (5)断开连接 依赖模块 1. xlrd # to read excel fil

用python读取带密码的excel文件中的数据

用python读取带密码的excel文件中的数据,程序代码如下: #filename:readingxls.py ''' 此程序的作用为:用python读取带密码的excel文件中的数据. 首先通过pip安装xlrd第三方库 pip3 install xlrd 请输入excel文件路径:D:\x1.xls ''' import xlrd path=input("请输入excel文件路径:") workbook=xlrd.open_workbook(path) b=len(workboo

【Python】从文件中读取数据

从文件中读取数据 1.1 读取整个文件 要读取文件,需要一个包含几行文本的文件(文件PI_DESC.txt与file_reader.py在同一目录下) PI_DESC.txt 3.1415926535 8979323846 2643383279 5028841971 file_reader.py with open("PI_DESC.txt") as file_object: contents = file_object.read() print(contents) 我们可以看出,读取

从plist文件中读取数据

//从plist文件中读取数据- (void)readDataFromPlist{    //1.先获取文件路径    NSString * filePath = [[NSBundle mainBundle] pathForResource:@"Book" ofType:@"plist"];    //2.根据路径初始化字典对象    self.dic = [NSMutableDictionary dictionaryWithContentsOfFile:fileP

Mean and Standard Deviation-从文件中读取数据计算其平均数和标准差

Meanand Standard Deviation-从文件中读取数据计算其平均数和标准差 //Meanand Standard Deviation-从文件中读取数据计算其平均数和标准差 #include<iostream> #include<fstream> #include<cstdlib> #include<cmath>   int main() {     usingnamespace std;     ifstream fin;     ofstr

从Matlab .fig文件中读取数据,并重新绘图

Matlab提供了强大的函数集合,可以从.fig文件中读取图中的数据,并重新绘制图形.如果原始数据丢失,我们可以从.fig文件中恢复原始数据,并基于原始数据做进一步的处理. 以下是一个从两个不同文件中读取原始数据,并重新绘制图形的例子. h1 = openfig('1.fig','reuse'); % open figure D1=get(gca,'Children'); %get the handle of the line object XData1=get(D1,'XData'); %ge

从txt文件中读取数据放在二维数组中

1.我D盘中的test.txt文件内的内容是这样的,也是随机产生的二维数组 /test.txt/ 5.440000 3.4500006.610000 6.0400008.900000 3.0300000.140000 2.7400008.920000 7.2900002.580000 7.4300001.850000 6.1300001.350000 4.280000 ... ... 2.在我的test.cpp中添加头文件,即可使用FILE类来读取txt文件中的数据 #include <stdi