POI實(shí)現(xiàn)EXCEL導(dǎo)入

Java開發(fā)過程中饶囚,有些需求需要實(shí)現(xiàn)Excel導(dǎo)入功能,具體就是Excel導(dǎo)入數(shù)據(jù)直接操作數(shù)據(jù)庫宠进,先將Excel導(dǎo)入實(shí)現(xiàn)方法貼出晕拆。實(shí)現(xiàn)過程如下。
1材蹬、xml配置实幕,本人使用較為成熟流行的ssm框架,即spring堤器、springMvc昆庇、mybiats整合而成框架。所以需要在springMvc的xml配置中加入如下代碼配置闸溃。這里非常重要

     <!-- 上傳配置 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
            <property name="maxUploadSize" value="2097152"></property> 
            <property name="defaultEncoding" value="UTF-8" />  
        </bean> 

2整吆、jsp頁面配置,上傳必須使用from表單辉川,且表單必須添加屬性enctype="multipart/form-data" onsubmit="return check();"并在上傳input中添加accept="xls/xlsx" size="50"表蝙。用于限制上傳文件格式。

    <form action="/Matton/batchimport.do" method="post" enctype="multipart/form-data" name="batchAdd" onsubmit="return check();">
        <div class="col-lg-4">
            <input id="excel_file" type="file" name="filename" accept="xls/xlsx" size="50"/>
        </div>
        <input id="excel_button" class="btn btn-success col-lg-1" type="submit" value="導(dǎo)入Excel"/>
       <%--  <font id="importMsg" color="red"><%=importMsg%></font><input type="hidden"/> --%>  
    </form>

3乓旗、xml配置和jsp配置已經(jīng)完成勇哗,現(xiàn)在就是后臺(tái)代碼(@RequestParam("filename") MultipartFile file這里的filename需與from表單中的input的name一致。MultipartFile 就是剛剛xml配置啟動(dòng)的寸齐。所以xml配置不可或缺。

    /**
     * excel批量導(dǎo)入
     * @param file
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "batchimport.do", method = RequestMethod.POST)
    public String batchimport(@RequestParam("filename") MultipartFile file,HttpServletRequest request,HttpServletResponse response) throws Exception{
     //   String a = "C:\Users\lg\Desktop\1.xlsx";
        //獲取路徑
        if(file==null) return null;
        //文件名
        String name=file.getOriginalFilename();
        String filePath = request.getSession().getServletContext().getRealPath("/") + "upload"+"\\"  
                + file.getOriginalFilename();  
        long size=file.getSize();
        if(name==null || ("").equals(name) && size==0) return null;
        try {
            InputStream in = file.getInputStream();
          //調(diào)用Service抄谐,將數(shù)據(jù)插入Excel
            int i=poiService.batchImport(filePath,file);
            if(i>0){
                 String Msg ="導(dǎo)入成功";
                 avg();
                 request.getSession().setAttribute("msg",Msg);
            }else{
                 String Msg ="導(dǎo)入失敗";
                 request.getSession().setAttribute("msg",Msg);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            excel();
        }
    //  return null; 
        return "forward:/jsp/excel/excel.jsp";
    }

Service實(shí)現(xiàn)渺鹦,將調(diào)用實(shí)現(xiàn)類。

    /**
     * excel倒庫
     * @param name
     * @param file
     * @return
     */
    public int batchImport(String name,MultipartFile file);

Service實(shí)現(xiàn)類蛹含,調(diào)動(dòng)實(shí)現(xiàn)方法毅厚。

    /**
     *批量導(dǎo)入 
     */
    public int batchImport(String name,MultipartFile file) {
                //這個(gè)是Excel導(dǎo)入的實(shí)現(xiàn)工具類。但不是直接導(dǎo)入數(shù)據(jù)庫
                //是將Excel數(shù)據(jù)分解成能夠?qū)霐?shù)據(jù)庫的數(shù)據(jù)浦箱。
        ExelUtil readExcel=new ExelUtil();
        List<MeatModel> userList=readExcel.getExcelInfo(name,file);
        if("".equals(userList) || userList.size() < 1){
            return 0;
        }else{
          //這才是導(dǎo)入操作
             return meatMapper.batchInsertStudent(userList);
        }
     }

導(dǎo)入工具類:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
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.apache.shiro.SecurityUtils;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import com.matton.model.LoginUserModel;
import com.matton.model.MeatModel;
import com.matton.model.Student;
import com.sun.org.apache.xml.internal.serializer.utils.Utils;


public class ExelUtil {

    //總行數(shù)
    private int totalRows = 0;  
   
    //總條數(shù)
    private int totalCells = 0; 
    
    //錯(cuò)誤信息接收器
    private String errorMsg;
          
    //構(gòu)造方法
    public ExelUtil(){}
    
    //得到總行數(shù)
    public int getTotalRows()  { return totalRows;} 
    
    //得到總列數(shù)
    public int getTotalCells() {  return totalCells;} 
    
    public String getErrorInfo() { return errorMsg; }  
    
  /**
   * 描述:驗(yàn)證EXCEL文件
   * @param filePath
   * @return
   */
  public boolean validateExcel(String filePath){
      /** 檢查文件是否存在 */  
/*      File file = new File(filePath);  
      boolean a = file.exists();
      if (file == null || !file.exists()) {  
        errorMsg = "文件不存在";  
          return false;  
      } */ 
      
      if (filePath == null || !(WDWUtil.isExcel2003(filePath) || WDWUtil.isExcel2007(filePath))){  
          errorMsg = "文件名不是excel格式";  
          return false;  
      }  
       
        return true;
  }
    
  
  /**描述 :讀EXCEL文件
   * @param fielName
   * @return
   */
  public List<MeatModel> getExcelInfo(String fileName,MultipartFile Mfile){
      
      //把spring文件上傳的MultipartFile轉(zhuǎn)換成File
       CommonsMultipartFile cf= (CommonsMultipartFile)Mfile; 
       DiskFileItem fi = (DiskFileItem)cf.getFileItem();
      File file = fi.getStoreLocation();
      List<MeatModel> userList=new ArrayList<MeatModel>();
//  fileName = "E:/ruanjian/apache-tomcat-6.0.41 -3/webapps/Matton/upload/1.xlsx";
      
      InputStream is = null;  
      try{
          //驗(yàn)證文件名是否合格
          if(!validateExcel(fileName)){
              return null;
          }
          //判斷文件時(shí)2003版本還是2007版本
          boolean isExcel2003 = true; 
          if(WDWUtil.isExcel2007(fileName)){
              isExcel2003 = false;  
          }
          is = new FileInputStream(file);
          userList=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 userList;
  }
  /**
   * 此方法兩個(gè)參數(shù)InputStream是字節(jié)流吸耿。isExcel2003是excel是2003還是2007版本
   * @param is
   * @param isExcel2003
   * @return
   * @throws IOException
   */
  public  List<MeatModel> getExcelInfo(InputStream is,boolean isExcel2003){
      
       List<MeatModel> userList=null;
       try{
           /** 根據(jù)版本選擇創(chuàng)建Workbook的方式 */
           Workbook wb = null;
           //當(dāng)excel是2003時(shí)
           if(isExcel2003){
               wb = new HSSFWorkbook(is);
           }else{
               wb = new XSSFWorkbook(is);
           }
           userList=readExcelValue(wb);
       }
       catch (IOException e)  {  
           e.printStackTrace();  
       }  
       return userList;
  }
  /**
   * 讀取Excel里面的信息
   * @param wb
   * @return
   */
  private List<MeatModel> readExcelValue(Workbook wb){ 
       //得到第一個(gè)shell  
       Sheet sheet=wb.getSheetAt(0);
       //得到Excel的行數(shù)
       this.totalRows=sheet.getPhysicalNumberOfRows();
       //得到Excel的列數(shù)(前提是有行數(shù))
       if(totalRows>=1 && sheet.getRow(0) != null){
            this.totalCells=sheet.getRow(0).getPhysicalNumberOfCells();
       }
       List<MeatModel> userList=new ArrayList<MeatModel>();
       MeatModel meat = null ;
       //獲取當(dāng)前用戶id
          Subject currentUser = SecurityUtils.getSubject();
          Session session = currentUser.getSession();
          session.getAttribute("currentUser");
          LoginUserModel loginUserModel = (LoginUserModel) session.getAttribute("currentUser");
       
       
       System.out.println(this.totalRows+"行行航哈哈哈哈哈哈哈哈哈哈哈哈");
       System.out.println(this.getTotalCells()+"行行航哈哈哈哈哈哈哈哈哈哈哈哈");
       /** 循環(huán)Excel的行祠锣,然后循環(huán)列,即先循環(huán)行咽安,再循環(huán)列 */  
       for (int r = 1; r < this.totalRows; r++) {  
           Row row = sheet.getRow(r);  
           if (row == null){  
               continue;  
           }  
          // List<String> rowLst = new ArrayList<String>();  
           meat = new MeatModel();
           /** 循環(huán)Excel的列 */  
           for (int c = 0; c < this.getTotalCells(); c++){  
               Cell cell = row.getCell(c);  
               String cellValue = getCellTypes(cell);  
               
               GenerateSequenceUtil strid = new GenerateSequenceUtil();
               meat.setWaterId(strid.generateSequenceNo());
               if(c == 0){
                   meat.setInsertData(cellValue);
               }else if(c == 1){
                   meat.setMeatNum(cellValue); 
               } else if(c == 2){
                   meat.setEmptyCupWeight(cellValue);//空杯子質(zhì)量
               } else if(c == 3){
                   meat.setWaterCupWeight(cellValue);//空杯+鮮肉質(zhì)量
               } else if(c == 4){
                   meat.setMeatWeight(cellValue);//鮮肉質(zhì)量
               } else if(c == 5){
                   meat.setNoWaterMeatWeight(cellValue);//空干后的肉+杯子的質(zhì)量
               } else if(c == 6){
                   if("".equals(meat.getWaterCupWeight()) || null == meat.getWaterCupWeight() ||
                           "".equals(meat.getNoWaterMeatWeight()) || null == meat.getNoWaterMeatWeight() ||  
                           "".equals(meat.getMeatWeight()) || null == meat.getMeatWeight() 
                           ){
                       //如果該字段存在值則使用伴网,不存在放空
                       if("".equals(cellValue) || null == cellValue ){
                           cellValue = "";
                       }else{
                           DecimalFormat  df = new DecimalFormat("0.0000");
                         cellValue = df.format(cellValue);
                       }
                   }else{
                   double WaterCupWeight = Double.parseDouble(meat.getWaterCupWeight());
                   double NoWaterMeatWeight = Double.parseDouble(meat.getNoWaterMeatWeight());
                   double MeatWeight = Double.parseDouble(meat.getMeatWeight());
                   double water = ((WaterCupWeight - NoWaterMeatWeight  ) / MeatWeight);
                  DecimalFormat  df = new DecimalFormat("0.0000");
                 cellValue = df.format(water);
                   }
                  cellValue = String.valueOf(cellValue);
                   meat.setWater(cellValue);//水分
               } else if(c == 7){
                   meat.setWateravg(cellValue);//平均值
               }
 
              meat.setUserId(loginUserModel.getUserId());
              
           }
           userList.add(meat);
       }
       
    return userList;
  }
  //判斷Excel倒入數(shù)據(jù)類型,轉(zhuǎn)換為數(shù)據(jù)庫可識(shí)別的數(shù)據(jù)類型
  public String getCellTypes(Cell cell){
      String cellValue = null;
      if (null != cell) {  
          // 以下是判斷數(shù)據(jù)的類型  
          switch (cell.getCellType()){  
          case HSSFCell.CELL_TYPE_NUMERIC: // 數(shù)字  
            // 處理日期格式妆棒、時(shí)間格式
              if (HSSFDateUtil.isCellDateFormatted(cell)) {
                  Date d = cell.getDateCellValue();
                  DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
                  cellValue = formater.format(d);
              }
              else{ 
                  cellValue = cell.getNumericCellValue() + ""; 
              }  
                    
                    
              break;  

          case HSSFCell.CELL_TYPE_STRING: // 字符串  
              cellValue = cell.getStringCellValue();  
              break;  

          case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean  
              cellValue = cell.getBooleanCellValue() + "";  
              break;  

          case HSSFCell.CELL_TYPE_FORMULA: // 公式  
             // cellValue = cell.getCellFormula() + "";  
              try {
                  DecimalFormat  df = new DecimalFormat("0.0000");
                  cellValue = String.valueOf(df.format(cell.getNumericCellValue()));
                  
              } catch (IllegalStateException e) {
                  cellValue = String.valueOf(cell.getRichStringCellValue());
                     }
              break;  

          case HSSFCell.CELL_TYPE_BLANK: // 空值  
              cellValue = "";  
              break;  

          case HSSFCell.CELL_TYPE_ERROR: // 故障  
              cellValue = "非法字符";  
              break;  

          default:  
              cellValue = "未知類型";  
              break;  
          }  
      }  
    return cellValue;
  }
  
}

Excel文件格式判斷澡腾,判斷Excel是07版還是10版

       // 驗(yàn)證是否是excel2003
      public static boolean isExcel2003(String filePath)  {  
          return filePath.matches("^.+\\.(?i)(xls)$");  
      }  

       //驗(yàn)證是否是excel2007 
      public static boolean isExcel2007(String filePath)  {  
          return filePath.matches("^.+\\.(?i)(xlsx)$");  
      }  

Excel導(dǎo)入至此完成。
本人于2016年畢業(yè)糕珊,小白一枚动分,經(jīng)驗(yàn)不足。各位看官如有問題红选,請(qǐng)百度澜公。小白我也是一步一步百度而來。小白QQ群571669420喇肋,靜請(qǐng)打擾坟乾;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市苟蹈,隨后出現(xiàn)的幾起案子糊渊,更是在濱河造成了極大的恐慌,老刑警劉巖慧脱,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渺绒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡菱鸥,警方通過查閱死者的電腦和手機(jī)宗兼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氮采,“玉大人殷绍,你說我怎么就攤上這事∪的” “怎么了主到?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長躯概。 經(jīng)常有香客問我登钥,道長,這世上最難降的妖魔是什么娶靡? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任牧牢,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘塔鳍。我一直安慰自己伯铣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布轮纫。 她就那樣靜靜地躺著腔寡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜡感。 梳的紋絲不亂的頭發(fā)上蹬蚁,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音郑兴,去河邊找鬼犀斋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛情连,可吹牛的內(nèi)容都是我干的叽粹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼却舀,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼虫几!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起挽拔,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤辆脸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后螃诅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啡氢,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年术裸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了倘是。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡袭艺,死狀恐怖搀崭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情猾编,我是刑警寧澤瘤睹,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站答倡,受9級(jí)特大地震影響默蚌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜苇羡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧设江,春花似錦锦茁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至歼捏,卻和暖如春稿存,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瞳秽。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工瓣履, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人练俐。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓袖迎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親腺晾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子燕锥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)悯蝉,斷路器归形,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 今天來講下企業(yè)的開發(fā)的一些功能應(yīng)用吧,就是Ajax使用鼻由,以及簡(jiǎn)單的企業(yè)報(bào)表的導(dǎo)入導(dǎo)出暇榴,基于原有的項(xiàng)目進(jìn)行展示(其實(shí)...
    JackFrost_fuzhu閱讀 1,360評(píng)論 1 12
  • 本文包括:1、文件上傳概述2嗡靡、利用 Commons-fileupload 組件實(shí)現(xiàn)文件上傳3跺撼、核心API——Dis...
    廖少少閱讀 12,549評(píng)論 5 91
  • Spring mvc 框架 DispatcherServlet前端控制器 ---- 整個(gè)流程控制的中心,由它調(diào)用其...
    蕊er閱讀 703評(píng)論 0 0
  • 今天的深圳讨彼,艷陽高照歉井,陽臺(tái)的山茶花和三角梅恣意綻放,大朵大朵的花蕾下葉子在艷陽的照射下翠綠欲滴哈误。陽光真是很奇...
    小妖妮妲閱讀 131評(píng)論 0 1