1. 程式人生 > >java動態生成帶下拉框的Excel匯入模板

java動態生成帶下拉框的Excel匯入模板

 在實際開發中,由於業務需要,常常需要進行Excel匯入匯出操作。以前做一些簡單的匯入時,先準備一個模板,再進行匯入,單有十幾、

二十幾個匯入模板時,往往要做十幾、二十幾個模板。而且,當在模板中需要有下拉框,而且下拉資料要實時查詢時,這樣的方法就不太好了;

現在,做成了動態生成匯入模板,只要引數傳對了,就可以生成任何我們想要的匯入模板,而且隨意設定下拉框的數目、位置。

 

具體步驟如下:

1、需要用到的jar包:

poi-3.10-FINAL.jar

poi-ooxml-3.10-FINAL.jar

poi-ooxml-schemas-3.10-FINAL.jar

gradle引入:

compile group: 'org.apache.poi', name: 'poi', version: '3.10'
compile group: 'org.apache.poi', name: 'poi-ooxml', version: '3.10-FINAL'

 

2、生成Excel匯入模板 :

複製程式碼

/**
     * @Title: createExcelTemplate 
     * @Description: 生成Excel匯入模板  
     * @param @param filePath  Excel檔案路徑
     * @param @param handers   Excel列標題(陣列)
     * @param @param downData  下拉框資料(陣列)
     * @param @param downRows  下拉列的序號(陣列,序號從0開始)
     * @return void
     * @throws
     */
    private static void createExcelTemplate(String filePath, String[] handers, 
            List<String[]> downData, String[] downRows){
        
        HSSFWorkbook wb = new HSSFWorkbook();//建立工作薄
        
        //表頭樣式
        HSSFCellStyle style = wb.createCellStyle();  
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 建立一個居中格式  
        //字型樣式
        HSSFFont fontStyle = wb.createFont();    
        fontStyle.setFontName("微軟雅黑");    
        fontStyle.setFontHeightInPoints((short)12);    
        fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 
        style.setFont(fontStyle);
        
        //新建sheet
        HSSFSheet sheet1 = wb.createSheet("Sheet1");
        HSSFSheet sheet2 = wb.createSheet("Sheet2");
        HSSFSheet sheet3 = wb.createSheet("Sheet3");
        
        //生成sheet1內容
        HSSFRow rowFirst = sheet1.createRow(0);//第一個sheet的第一行為標題
        //寫標題
        for(int i=0;i<handers.length;i++){
            HSSFCell cell = rowFirst.createCell(i); //獲取第一行的每個單元格
            sheet1.setColumnWidth(i, 4000); //設定每列的列寬
            cell.setCellStyle(style); //加樣式
            cell.setCellValue(handers[i]); //往單元格里寫資料
        }
        
        //設定下拉框資料
        String[] arr = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
        int index = 0;
        HSSFRow row = null;
        for(int r=0;r<downRows.length;r++){
            String[] dlData = downData.get(r);//獲取下拉物件
            int rownum = Integer.parseInt(downRows[r]);
            
            if(dlData.length<5){ //255以內的下拉
                //255以內的下拉,引數分別是:作用的sheet、下拉內容陣列、起始行、終止行、起始列、終止列
                sheet1.addValidationData(setDataValidation(sheet1, dlData, 1, 50000, rownum ,rownum)); //超過255個報錯 
            } else { //255以上的下拉,即下拉列表元素很多的情況
                
                //1、設定有效性
                   //String strFormula = "Sheet2!$A$1:$A$5000" ; //Sheet2第A1到A5000作為下拉列表來源資料
                String strFormula = "Sheet2!$"+arr[index]+"$1:$"+arr[index]+"$5000"; //Sheet2第A1到A5000作為下拉列表來源資料
                   sheet2.setColumnWidth(r, 4000); //設定每列的列寬
                   //設定資料有效性載入在哪個單元格上,引數分別是:從sheet2獲取A1到A5000作為一個下拉的資料、起始行、終止行、起始列、終止列
                      sheet1.addValidationData(SetDataValidation(strFormula, 1, 50000, rownum, rownum)); //下拉列表元素很多的情況
                      
                      //2、生成sheet2內容
                      for(int j=0;j<dlData.length;j++){
                    if(index==0){ //第1個下拉選項,直接建立行、列
                        row = sheet2.createRow(j); //建立資料行
                        sheet2.setColumnWidth(j, 4000); //設定每列的列寬
                        row.createCell(0).setCellValue(dlData[j]); //設定對應單元格的值
                        
                    } else { //非第1個下拉選項
                        
                        int rowCount = sheet2.getLastRowNum();
                        //System.out.println("========== LastRowNum =========" + rowCount);
                        if(j<=rowCount){ //前面建立過的行,直接獲取行,建立列
                            //獲取行,建立列
                            sheet2.getRow(j).createCell(index).setCellValue(dlData[j]); //設定對應單元格的值
                            
                        } else { //未建立過的行,直接建立行、建立列
                            sheet2.setColumnWidth(j, 4000); //設定每列的列寬
                            //建立行、建立列
                            sheet2.createRow(j).createCell(index).setCellValue(dlData[j]); //設定對應單元格的值
                        }
                    }
                }
                      index++;
            }
        }
        
        try {
            
            File f = new File(filePath); //寫檔案
            
            //不存在則新增
            if(!f.getParentFile().exists()){
                f.getParentFile().mkdirs();
            }
            if(!f.exists()){
                f.createNewFile();
            }
            
            FileOutputStream out = new FileOutputStream(f);
            out.flush();  
            wb.write(out);    
            out.close(); 
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

複製程式碼

 

3、設定有效性:

 View Code

 

4、下載指定路徑的Excel檔案:

 View Code

 

5、刪除生成的臨時檔案:

複製程式碼

/**
     * @Title: delFile 
     * @Description: 刪除檔案
     * @param @param filePath  檔案路徑
     * @return void
     * @throws
     */
    public static void delFile(String filePath) {     
        java.io.File delFile = new java.io.File(filePath);     
        delFile.delete();     
    } 

複製程式碼

 

6、示例:

複製程式碼

/**
     * @Title: getExcelTemplate 
     * @Description: 生成Excel模板並匯出 
     * @param @param uuid
     * @param @param request
     * @param @param response
     * @param @return
     * @return Data
     * @throws
     */
    @RequestMapping("/getExcelTemplate")
    public void getExcelTemplate(HttpServletRequest request, HttpServletResponse response){
        
        String fileName = "員工資訊表"; //模板名稱
        String[] handers = {"姓名","性別","證件型別","證件號碼","服務結束時間","參保地","民族"}; //列標題
        
        //下拉框資料
        List<String[]> downData = new ArrayList();
        String[] str1 = {"男","女","未知"};
        String[] str2 = {"北京","上海","廣州","深圳","武漢","長沙","湘潭"};
        String[] str3 = {"01-漢族","02-蒙古族","03-回族","04-藏族","05-維吾爾族","06-苗族","07-彝族","08-壯族","09-布依族",
              "10-朝鮮族","11-滿族","12-侗族","13-瑤族","14-白族","15-土家族","16-哈尼族","17-哈薩克族","18-傣族","19-黎族","20-傈僳族",
              "21-佤族","22-畲族","23-高山族","24-拉祜族","25-水族","26-東鄉族","27-納西族","28-景頗族","29-柯爾克孜族","30-土族",
              "31-達斡爾族","32-仫佬族","33-羌族","34-布朗族","35-撒拉族","36-毛難族","37-仡佬族","38-錫伯族","39-阿昌族","40-普米族",
              "41-塔吉克族","42-怒族","43-烏孜別克族","44-俄羅斯族","45-鄂溫克族","46-德昂族","47-保安族","48-裕固族","49-京族","50-塔塔爾族",
              "51-獨龍族","52-鄂倫春族","53-赫哲族","54-門巴族","55-珞巴族","56-基諾族","98-外國血統","99-其他"};
        downData.add(str1);
        downData.add(str2);
        downData.add(str3);
        String [] downRows = {"1","5","6"}; //下拉的列序號陣列(序號從0開始)
        
        try {
            
            ExcelUtil.getExcelTemplate(fileName, handers, downData, downRows, request, response);
            
        } catch (Exception e) {
            log.error("批量匯入資訊異常:" + e.getMessage());
        }
    }

複製程式碼

 

7、結果如圖: