java動態生成帶下拉框的Excel匯入模板
阿新 • • 發佈:2018-11-09
在實際開發中,由於業務需要,常常需要進行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、結果如圖: