圖為要導入的excel格式 

分析一下:

前一部分數據是讀取 合并行 存入一張 “會見” 表 ,后面藍色的 非合并行 存入 “會見人信息” 表。

先說后臺方法,(讀取本地文件例子)

    public void importJsInfo() throws IOException {
            Boolean bool = false;
            Record  record =new Record();
            String name ="1.xlsx";
            FileInputStream  f = new FileInputStream(new File("C:\\Users\\foresee\\Desktop\\1.xlsx"));
            record     = readXls(f,name);    //讀取excel方法
             if(record.get("list") != null ) {
                 List<Hjrxx> hjrxxList = record.get("hjrxxList");
                 List<Hj> hjList = record.get("list");
                bool = HjService.service.saveJsxx(hjrxxList,hjList);    //把讀取結果封裝在record對象里,并保存兩張表的業務邏輯
             }
            renderText(String.valueOf(bool));
        }

 

下面是 :上面調用的讀取excel方法  readXls (注意下身份證長數字和日期格式處理)

 

 /**
     * 讀取excel
     * @throws IOException 
     */
    private Record readXls(InputStream inputStream,String fileName) throws IOException  {
    Record record = new Record();
        boolean isE2007 = false;    //判斷是否是excel2007格式  
        if(fileName.endsWith("xlsx")){
            isE2007 = true;
        }
        int rowIndex = 0;
        int columnIndex = 0;
        
            InputStream input = inputStream;  //建立輸入流  
            Workbook wb  = null;  
            //根據文件格式(2003或者2007)來初始化  
            if(isE2007){ 
                wb = new XSSFWorkbook(input);
            }else{  
                wb = new HSSFWorkbook(input);
            }
            Sheet sheet = wb.getSheetAt(0);    //獲得第一個表單  
             
            List<CellRangeAddress> cras = importHj.getCombineCell(sheet);
            //isMergedRegion(Sheet sheet,int row ,int column);判斷是不是合并單元格
            int count = sheet.getLastRowNum()+1;//總行數
            
            List<Hj> hjs = new ArrayList<>();
            List<Hjrxx> hjrxxs = new ArrayList<>();   //這兩個LIst最后要放入record這個對象里,作為方法的返回值
             for(int i = 2; i < count;i++){
                rowIndex = i;
                Row row = sheet.getRow(i);
                Hj hj = new Hj();
                if(importHj.getCellValue(row.getCell(0)) != " ") {
                    String sfzh = NumberToTextConverter.toText(row.getCell(0).getNumericCellValue());    //根據表格獲得的身份證查出另一個字段值,存入數據庫
                      Record jbxx = JbxxService.service.findByBrSfzh(sfzh);
                    hj.set(Hj.column_br_id, jbxx.get("br_id")); 
                }
              //如果該行是日期,同樣是需要先處理,否則會報錯
                if (HSSFDateUtil.isCellDateFormatted(row.getCell(3))) {// 處理日期格式、時間格式  
                    SimpleDateFormat sdf = null; 
                    sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  
                    Date date = row.getCell(3).getDateCellValue();
                    Date jssj = row.getCell(4).getDateCellValue();
                    String a =sdf.format(date);//根據需要取時間,date類型和String類型
                    String b =sdf.format(jssj);
                    System.out.println(a);
                    hj.set(Hj.column_kssj, ToolDateTime.parse(a, ToolDateTime.pattern_ymd_hm));
                    hj.set(Hj.column_jssj, ToolDateTime.parse(b, ToolDateTime.pattern_ymd_hm));
 
                }
                hj.set(Hj.column_hjlx,"01");   //會見實體類
                hj.set(Hj.column_pzbm,importHj.getCellValue(row.getCell(1)));
                hj.set(Hj.column_pzr,importHj.getCellValue(row.getCell(2)));
                hj.set(Hj.column_jbmj,importHj.getCellValue(row.getCell(5)));
                hj.set(Hj.column_bz,importHj.getCellValue(row.getCell(6)));
                hj.set(Hj.column_createtm, ToolDateTime.getSqlTimestamp(new Date()));
                hj.set(Hj.column_updatetm, ToolDateTime.getSqlTimestamp(new Date()));
                hj.set(Hj.column_validmk, Hj.VALIDMK_1);
                Hjrxx hjrxx = null;
                if(importHj.isMergedRegion(sheet,i,0)){
                    int lastRow = importHj.getRowNum(cras,sheet.getRow(i).getCell(0),sheet);
                    
                    for(;i<=lastRow;i++){
                        row = sheet.getRow(i);
                        hjrxx  = new Hjrxx(); //會見人信息實體類
                        hjrxx.set("hjrxm",importHj.getCellValue(row.getCell(7)));
                        hjrxx.set("sfzh",importHj.getCellValue(row.getCell(8)));
                        hjrxx.set("lxfs",importHj.getCellValue(row.getCell(9)));
                        hjrxx.set("szdw",importHj.getCellValue(row.getCell(10)));
                        hjrxx.set("hjdz",importHj.getCellValue(row.getCell(11)));
                        hjrxx.set(Hjrxx.column_createtm, ToolDateTime.getSqlTimestamp(new Date()));
                        hjrxx.set(Hjrxx.column_updatetm, ToolDateTime.getSqlTimestamp(new Date()));
                        hjrxx.set(Hjrxx.column_validmk, Hjrxx.VALIDMK_1);
                        hjrxxs.add(hjrxx);
                    }
                    i--;
                }else{
                    row = sheet.getRow(i);
                    hjrxx  = new Hjrxx();
                    hjrxx.set("hjrxm",importHj.getCellValue(row.getCell(7)));
                    hjrxx.set("sfzh",importHj.getCellValue(row.getCell(8)));
                    hjrxx.set("lxfs",importHj.getCellValue(row.getCell(9)));
                    hjrxx.set("szdw",importHj.getCellValue(row.getCell(10)));
                    hjrxx.set("hjdz",importHj.getCellValue(row.getCell(11)));
                    hjrxx.set(Hjrxx.column_createtm, ToolDateTime.getSqlTimestamp(new Date()));
                    hjrxx.set(Hjrxx.column_updatetm, ToolDateTime.getSqlTimestamp(new Date()));
                    hjrxx.set(Hjrxx.column_validmk, Hjrxx.VALIDMK_1);
                    hjrxxs.add(hjrxx);
                }
                 hjs.add(hj);
                
            }
            record.set("list", hjs);
            record.set("hjrxxList",hjrxxs);
            return record;
    }

 

 

上面用到的工具類,單獨放一個文件,直接調用(工具類從網上抄的,沒改動)

注:該文件為本地一個文件。下篇寫上傳一個文件,并導入數據庫。

package com.platform.mvc.aq.hj;

import java.util.ArrayList;
import java.util.List;

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.util.CellRangeAddress;

public class importHj {
    /**   
    * 獲取單元格的值   
    * @param cell   getCombineCell
    * @return   
    */    
    public static String getCellValue(Cell cell){    
        if(cell == null) return "";    
        if(cell.getCellType() == Cell.CELL_TYPE_STRING){    
            return cell.getStringCellValue();    
        }else if(cell.getCellType() == Cell.CELL_TYPE_BOOLEAN){    
            return String.valueOf(cell.getBooleanCellValue());    
        }else if(cell.getCellType() == Cell.CELL_TYPE_FORMULA){    
            return cell.getCellFormula() ;    
        } 
        return "";    
    }
    /** 
        * 合并單元格處理,獲取合并行 
        * @param sheet 
        * @return List<CellRangeAddress> 
        */  
        public static List<CellRangeAddress> getCombineCell(Sheet sheet)  
        {  
            List<CellRangeAddress> list = new ArrayList<CellRangeAddress>();  
            //獲得一個 sheet 中合并單元格的數量  
            int sheetmergerCount = sheet.getNumMergedRegions();  
            //遍歷所有的合并單元格  
            for(int i = 0; i<sheetmergerCount;i++)   
            {  
                //獲得合并單元格保存進list中  
                CellRangeAddress ca = sheet.getMergedRegion(i);  
                list.add(ca);  
            }  
            return list;  
        }
        
        static int getRowNum(List<CellRangeAddress> listCombineCell,Cell cell,Sheet sheet){
            int xr = 0;
            int firstC = 0;  
            int lastC = 0;  
            int firstR = 0;  
            int lastR = 0;  
            for(CellRangeAddress ca:listCombineCell)  
            {
                //獲得合并單元格的起始行, 結束行, 起始列, 結束列  
                firstC = ca.getFirstColumn();  
                lastC = ca.getLastColumn();  
                firstR = ca.getFirstRow();  
                lastR = ca.getLastRow();  
                if(cell.getRowIndex() >= firstR && cell.getRowIndex() <= lastR)   
                {  
                    if(cell.getColumnIndex() >= firstC && cell.getColumnIndex() <= lastC)   
                    {  
                        xr = lastR;
                    } 
                }  
                
            }
            return xr;
            
        }
        /** 
         * 判斷單元格是否為合并單元格,是的話則將單元格的值返回 
         * @param listCombineCell 存放合并單元格的list 
         * @param cell 需要判斷的單元格 
         * @param sheet sheet 
         * @return 
         */ 
         public String isCombineCell(List<CellRangeAddress> listCombineCell,Cell cell,Sheet sheet)
         throws Exception{ 
             int firstC = 0;  
             int lastC = 0;  
             int firstR = 0;  
             int lastR = 0;  
             String cellValue = null;  
             for(CellRangeAddress ca:listCombineCell)  
             {
                 //獲得合并單元格的起始行, 結束行, 起始列, 結束列  
                 firstC = ca.getFirstColumn();  
                 lastC = ca.getLastColumn();  
                 firstR = ca.getFirstRow();  
                 lastR = ca.getLastRow();  
                 if(cell.getRowIndex() >= firstR && cell.getRowIndex() <= lastR)   
                 {  
                     if(cell.getColumnIndex() >= firstC && cell.getColumnIndex() <= lastC)   
                     {  
                         Row fRow = sheet.getRow(firstR);  
                         Cell fCell = fRow.getCell(firstC);  
                         cellValue = getCellValue(fCell);  
                         break;  
                     } 
                 }  
                 else  
                 {  
                     cellValue = "";  
                 }  
             }  
             return cellValue;  
         }
        
        /**   
        * 獲取合并單元格的值   
        * @param sheet   
        * @param row   
        * @param column   
        * @return   
        */    
        public String getMergedRegionValue(Sheet sheet ,int row , int column){    
            int sheetMergeCount = sheet.getNumMergedRegions();    
                
            for(int i = 0 ; i < sheetMergeCount ; i++){    
                CellRangeAddress ca = sheet.getMergedRegion(i);    
                int firstColumn = ca.getFirstColumn();    
                int lastColumn = ca.getLastColumn();    
                int firstRow = ca.getFirstRow();    
                int lastRow = ca.getLastRow();    
                    
                if(row >= firstRow && row <= lastRow){    
                    if(column >= firstColumn && column <= lastColumn){    
                        Row fRow = sheet.getRow(firstRow);    
                        Cell fCell = fRow.getCell(firstColumn);    
                        return getCellValue(fCell) ;    
                    }    
                }    
            }    
                
            return null ;    
        }
        
        
        /**  
        * 判斷指定的單元格是否是合并單元格  
        * @param sheet   
        * @param row 行下標  
        * @param column 列下標  
        * @return  
        */  
        static boolean isMergedRegion(Sheet sheet,int row ,int column) {  
          int sheetMergeCount = sheet.getNumMergedRegions();  
          for (int i = 0; i < sheetMergeCount; i++) {  
            CellRangeAddress range = sheet.getMergedRegion(i);  
            int firstColumn = range.getFirstColumn();  
            int lastColumn = range.getLastColumn();  
            int firstRow = range.getFirstRow();  
            int lastRow = range.getLastRow();  
            if(row >= firstRow && row <= lastRow){  
                if(column >= firstColumn && column <= lastColumn){  
                    return true;  
                }  
            }
          }  
          return false;  
        }


}