导出加载进度条
1、導出進度條是基于EasyUI框架寫的。
2、前臺頁面:在導出的頁面中寫入js。可以把以下代碼寫個function,并在導出的function中加入。
//獲取所有行數據,頁面有數據才可以加載進度條 var rows = $("#dg").datagrid("getRows"); if (rows.length > 0) {//打開進度條$.messager.progress({title: '請稍等',msg: '正在導出...',text: '拼命加載中...',interval: 300});//訪問后臺,監控后臺數據是否導出完畢window.setTimeout(function () {var timer = window.setInterval(function () {$.ajax({type: "POST",url: 'busine.do?method=flushProgress',success: function (data) {var result = $.parseJSON(data);//關閉動畫if (result.percent == "100") {window.clearInterval(timer);$.messager.progress('close');}}});}, 300);}, 800); }3、后端導出工具類代碼
/*** 導出Excel 2007 OOXML (.xlsx)格式** @param filename 導出文件名* @param title 表格標題名* @param headers 表格屬性列名* @param columns 對應字段* @param dataset 需要顯示的數據集合 集合中一定要放置符合javabean風格的類的對象* @param pattern 如果有時間數據,設定輸出格式。默認為"yyy-MM-dd"*/ public static void exportXlsx( HttpServletResponse response,HttpServletRequest request,String filename,String title,String[] headers,String[] columns, List<?> dataset, String pattern) {//創建一個工作簿SXSSFWorkbook workbook = new SXSSFWorkbook(1000);// 生成一個表格SXSSFSheet sheet = workbook.createSheet(title + 1);SXSSFRow row = null;//創建行// 設置表格默認列寬度為20個字節/*sheet.setDefaultColumnWidth(20);sheet.setDefaultRowHeightInPoints(24);*/// 生成一個 表格標題行樣式CellStyle style = workbook.createCellStyle();// 設置這些樣式 背景style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());style.setFillPattern(FillPatternType.SOLID_FOREGROUND);//邊框style.setBorderBottom(BorderStyle.THIN);style.setBorderLeft(BorderStyle.THIN);style.setBorderRight(BorderStyle.THIN);style.setBorderTop(BorderStyle.THIN);//水平居中style.setAlignment(HorizontalAlignment.CENTER);// 生成一個字體Font font = workbook.createFont();font.setColor(IndexedColors.WHITE.getIndex());font.setFontHeightInPoints((short) 12);font.setBold(true);// font.setBoldweight((short)700));// 把字體應用到當前的樣式style.setFont(font);// 生成并設置另一個樣式 內容的背景CellStyle style2 = workbook.createCellStyle();//背景style2.setFillForegroundColor(IndexedColors.WHITE.getIndex());style2.setFillPattern(FillPatternType.SOLID_FOREGROUND);//邊框style2.setBorderBottom(BorderStyle.THIN);style2.setBorderLeft(BorderStyle.THIN);style2.setBorderRight(BorderStyle.THIN);style2.setBorderTop(BorderStyle.THIN);//居中style2.setAlignment(HorizontalAlignment.CENTER);style2.setVerticalAlignment(VerticalAlignment.CENTER);// 生成另一個字體Font font2 = workbook.createFont();// font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);// 把字體應用到當前的樣式style2.setFont(font2);// 聲明一個畫圖的頂級管理器Drawing<?> patriarch = sheet.createDrawingPatriarch();// 定義注釋的大小和位置//Comment comment = patriarch.createCellComment(new HSSFClientAnchor(0, 0, 0, 0, (short) 4, 2, (short) 6, 5));// 設置注釋內容//comment.setString(new HSSFRichTextString("Created By Phil"));// 設置注釋作者,當鼠標移動到單元格上是可以在狀態欄中看到該內容.//comment.setAuthor("zhufei");if (StringUtils.isEmpty(pattern)) {pattern = "yyyy/MM/dd";}FastDateFormat instance = FastDateFormat.getInstance(pattern);// 遍歷集合數據,產生數據行Iterator<?> it = dataset.iterator();int rowNo = 0; //總行號int count = 0; //總列數int pageRowNo = 0; //頁行號long startTime = System.currentTimeMillis(); //開始時間while (it.hasNext()) {//打印5萬條后切換到下個工作表,可根據需要自行拓展,10萬、30萬...數據一樣操作,只要不超過65535就可以if (rowNo % 500000 == 0) {if (rowNo > 0) {//建立新的sheet對象 第一次進入不需要在創建一個工作表workbook.createSheet(title + (rowNo / 500000 + 2));}sheet = workbook.getSheetAt(rowNo / 500000); //動態指定當前的工作表pageRowNo = 0; //每當新建了工作表就將當前工作表的行號重置為0row = sheet.createRow(pageRowNo); //創建行//設置表頭表格樣式for (int i = 0; i < headers.length - 1; i++) {SXSSFCell cell = row.createCell(i);cell.setCellStyle(style);//設置標題表格寬度sheet.setColumnWidth(i, 10 * 512);cell.setCellValue(headers[i]);}//Thread.sleep(1); //休息一下,防止對CPU占用,其實影響不大}pageRowNo++;rowNo++;//自增加一row = sheet.createRow(pageRowNo); //創建行//取出內容Object ob = it.next();// 利用反射,根據javabean屬性的先后順序,動態調用getXxx()方法得到屬性值// Field[] fields = t.getClass().getDeclaredFields();count = headers.length - 1 < columns.length - 1 ? headers.length - 1 : columns.length - 1;for (int i = 0; i < count; i++) {SXSSFCell cell = row.createCell(i);cell.setCellStyle(style2);String fieldName = columns[i];String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);try {Class<? extends Object> tCls = ob.getClass();Method getMethod = tCls.getMethod(getMethodName, new Class[]{});Object value = getMethod.invoke(ob, new Object[]{});// 判斷值的類型后進行強制類型轉換String textValue = null;if (value instanceof Date) {Date date = (Date) value;textValue = instance.format(date);} else if (value instanceof byte[]) {// 有圖片時,設置行高為60px;row.setHeightInPoints(60);// 設置圖片所在列寬度為80px,注意這里單位的一個換算sheet.setColumnWidth(i, (short) (35.7 * 80));// sheet.autoSizeColumn(i);byte[] bsValue = (byte[]) value;ClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) 6, rowNo, (short) 6, rowNo);anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_DONT_RESIZE);patriarch.createPicture(anchor, workbook.addPicture(bsValue, SXSSFWorkbook.PICTURE_TYPE_JPEG));} else {// 其它數據類型都當作字符串簡單處理if (value != null) {textValue = value.toString();} else {textValue = "";}}// 如果不是圖片數據,就利用正則表達式判斷textValue是否全部由數字組成if (textValue != null) {Pattern p = Pattern.compile("^//d+(//.//d+)?$");Matcher matcher = p.matcher(textValue);if (matcher.matches()) {// 是數字當作double處理cell.setCellValue(Double.parseDouble(textValue));} else {cell.setCellValue(textValue);}}} catch (SecurityException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}}//導出完畢后放入session會話中【這里是用來給導出進度條用的】request.getSession().setAttribute("percent", "100");//處理完成時間long finishedTime = System.currentTimeMillis();log.info("處理完成時間: " + (finishedTime - startTime) + "ms");OutputStream out = null;try {// 設置response參數,可以打開下載頁面response.reset();response.setContentType("application/vnd.ms-excel;");response.setHeader("Content-Disposition", "attachment;filename=\"" + new String(filename.getBytes("gbk"), "iso-8859-1") + ".xlsx\"");out = response.getOutputStream();workbook.write(out);workbook.close();workbook.dispose();} catch (IOException e) {e.printStackTrace();log.info("導出xlsx文件出錯" + StackMsg.getStackMsg(e));} }4、在控制層,導出方法旁邊再寫個方法,用來給進度條識別是否導出完畢。
/*** 進度條刷新,數據從session當中取** @param request* @return String*/ @ResponseBody @RequestMapping(params = "method=flushProgress") public String flushProgress(HttpServletRequest request) {HashMap<String, Object> map = null;try {map = new HashMap<String, Object>();Object percent = request.getSession().getAttribute("percent");//加上空判斷是為了防止第一次讀取session時,出現NULLif (null == percent || "".equals(percent)) {map.put("percent", 0);} else {map.put("percent", percent);request.getSession().removeAttribute("percent");}} catch (Exception e) {e.printStackTrace();}return JSON.toJSONString(map); }5、至此,一個完整的導出進度條寫完了,界面效果雖然不是很好,但基本原理基本是這樣。
總結
- 上一篇: CompareNoCase与Compar
- 下一篇: winamp 5.55下载_免费下载:W