javascript
SpringMVC + Apache POI 实现WEB中Excel下载功能
歡迎跳轉到本文的原文鏈接:https://honeypps.com/java/spring-mvc-apache-poi-web-excel-download/
項目中需要將web頁面中的報表導出成Excel,在網上搜尋了寫資料,實現了相關功能,如圖1所示:
?
項目后臺架構采用的是SpringMVC+Spring+Mybatis,通過引入Apache POI實現excel的下載功能。
導出效果如圖2所示:
?
首先頁面中點擊“導出Excel”按鈕就會觸發如下js代碼:
function getXls() {var selectVal = dijit.byId('DRSSelectFacId').get('value');var beginTimeVal = dijit.byId('DRSBeginTime').get('displayedValue');var endTimeVal = dijit.byId('DRSEndTime').get('displayedValue'); var url = "report/getDRSExcel.do?"+"fac_id="+selectVal+"&beginTime="+beginTimeVal+"&endTime="+endTimeVal;window.open(url,"_self"); }這段js代碼的主要功能是將選擇條件返回給后臺,請求相應的數據并生成excel。
jsp相關代碼如下:
<div style="margin-top:10px;"><label for="DRSSelectFacId">選擇電場:</label><span id="DRSSelectFacId" ></span>????<label for="DRSBeginTime">起始日期:</label><span id="DRSBeginTime" ></span>????<label for="DRSEndTime">截止日期:</label><span id="DRSEndTime" ></span>????<span id="DRSbutton1" ></span>????<span id="DRSbutton2" ></span></div>?
下面是JAVA后臺控制層代碼:
@RequestMapping(value = "/report/getDRSExcel.do")public void getDRSExcel(@RequestParam(value = "fac_id", required = true) String fac_id,@RequestParam(value = "beginTime", required = true) String beginTime,@RequestParam(value = "endTime", required = true) String endTime,HttpServletRequest request, HttpServletResponse response){logger.info("/report/getDRSExcel.do?fac_id=" + fac_id + "&beginTime="+ beginTime + "&endTime=" + endTime);try {this.daliyRepShortService.getXls(fac_id,beginTime,endTime,request,response);} catch (ParseException e) {e.printStackTrace();}}這里調用了業務層代碼如下:
private List<Map<String, Object>> createExcelRecord(List<Fc_dailyreport> projects) {List<Map<String, Object>> listmap = new ArrayList<Map<String, Object>>();Map<String, Object> map = new HashMap<String, Object>();map.put("sheetName", "短期預測日報");listmap.add(map);Fc_dailyreport project=null;SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");DecimalFormat fnum = new DecimalFormat("##0.0000"); for (int j = 0; j < projects.size(); j++) {project=projects.get(j);Map<String, Object> mapValue = new HashMap<String, Object>();mapValue.put("dtime", sdf.format(project.getDtime()));mapValue.put("cap", project.getCap());mapValue.put("p", project.getP());mapValue.put("fore_p", project.getFore_p());mapValue.put("rmse", fnum.format(project.getRmse()*100)+"%");mapValue.put("mae", fnum.format(project.getMae()*100)+"%");mapValue.put("qualified_rate", project.getQualified_rate()+"%");mapValue.put("colrel", project.getColrel());mapValue.put("uploadrate", project.getUploadrate()+"%");mapValue.put("qxuploadrate", project.getQxuploadrate()+"%");listmap.add(mapValue);}return listmap;}public void getXls(String fac_id,String beginTime,String endTime,HttpServletRequest request, HttpServletResponse response) throws ParseException{String fileName="短期預測日報";//1. List<Fc_dailyreport> projects = getXlsData(fac_id,beginTime,endTime);//2.List<Map<String,Object>> list=createExcelRecord(projects);//3.String columnNames[]={"時間","容量(MW)","實際功率(MW)","預測功率(MW)","均方誤差(%)","平均絕對誤差(%)","合格率(%)","相關系數","上傳率(%)","氣象上傳率(%)"};//列名String keys[] = {"dtime","cap","p","fore_p","rmse","mae","qualified_rate","colrel","uploadrate","qxuploadrate"};//map中的key//4.ExcelUtil.ExcelSingleOutputStream(list,keys,columnNames,fileName,request,response);}在getXls方法中,getXlsData(fac_id,beginTime,endTime);主要是根據前端的查詢條件參數獲取所要的數據,這里采用的是mybatis實現,由于本文的主旨是與excel相關的,這里就不說明mybatis如何實現數據的獲取。
第二步是創建excel的數據,如方法createExcelRecord(projects);所示。list中第一項的sheetName用來命名Excel中的sheet。剩余list中的數據數excel中的沒一行的數據。在getXls方法中的columnNames對應excel的第一行的列名,可參考圖2. keys與createExcelRecord中的相關名字一一對應(這里也與DAO值的pojo類的屬性名字一一對應)。
接下來就需要了解ExcelUtil.ExcelSingleOutputStream(list,keys,columnNames,fileName,request,response);這一段代碼是做什么的了。
首選看類ExcelUtil:
package com.shr.util;import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.List; import java.util.Map;import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;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.Font; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook;public class ExcelUtil {public static Workbook createSingleWorkBook(List<Map<String, Object>> list,String []keys,String columnNames[]) {Workbook wb = new HSSFWorkbook();Sheet sheet = wb.createSheet(list.get(0).get("sheetName").toString());for(int i=0;i<keys.length;i++){sheet.setColumnWidth((short) i, (short) (35.7 * 150));}Row row = sheet.createRow((short) 0);CellStyle cs = wb.createCellStyle();CellStyle cs2 = wb.createCellStyle();Font f = wb.createFont();Font f2 = wb.createFont();f.setFontHeightInPoints((short) 10);f.setColor(IndexedColors.BLACK.getIndex());f.setBoldweight(Font.BOLDWEIGHT_BOLD);f2.setFontHeightInPoints((short) 10);f2.setColor(IndexedColors.BLACK.getIndex());cs.setFont(f);cs.setFillForegroundColor(IndexedColors.AQUA.getIndex());cs.setFillPattern(CellStyle.SOLID_FOREGROUND);cs.setBorderLeft(CellStyle.BORDER_THIN);cs.setBorderRight(CellStyle.BORDER_THIN);cs.setBorderTop(CellStyle.BORDER_THIN);cs.setBorderBottom(CellStyle.BORDER_THIN);cs.setAlignment(CellStyle.ALIGN_CENTER);cs2.setFont(f2);cs2.setBorderLeft(CellStyle.BORDER_THIN);cs2.setBorderRight(CellStyle.BORDER_THIN);cs2.setBorderTop(CellStyle.BORDER_THIN);cs2.setBorderBottom(CellStyle.BORDER_THIN);cs2.setAlignment(CellStyle.ALIGN_CENTER);for(int i=0;i<columnNames.length;i++){Cell cell = row.createCell(i);cell.setCellValue(columnNames[i]);cell.setCellStyle(cs);}for (short i = 1; i < list.size(); i++) {Row row1 = sheet.createRow((short) i);for(short j=0;j<keys.length;j++){Cell cell = row1.createCell(j);cell.setCellValue(list.get(i).get(keys[j]) == null?" ": list.get(i).get(keys[j]).toString());cell.setCellStyle(cs2);}}return wb;}public static void ExcelSingleOutputStream(List<Map<String, Object>> list,String []keys,String columnNames[],String fileName, HttpServletRequest request, HttpServletResponse response){ByteArrayOutputStream os = new ByteArrayOutputStream();try {createSingleWorkBook(list,keys,columnNames).write(os);} catch (IOException e2) {e2.printStackTrace();}ExcelOutputStream(fileName,request,response,os);}private static void ExcelOutputStream( String fileName, HttpServletRequest request, HttpServletResponse response,ByteArrayOutputStream os){byte[] content = os.toByteArray();InputStream is = new ByteArrayInputStream(content);response.reset();response.setContentType("application/vnd.ms-excel;charset=utf-8");try {response.setHeader("Content-Disposition", "attachment;filename="+ new String((fileName + ".xls").getBytes(), "iso-8859-1"));} catch (UnsupportedEncodingException e1) {e1.printStackTrace();}ServletOutputStream out = null;try {out = response.getOutputStream();} catch (IOException e1) {e1.printStackTrace();}BufferedInputStream bis = null;BufferedOutputStream bos = null;try {bis = new BufferedInputStream(is);bos = new BufferedOutputStream(out);byte[] buff = new byte[2048];int bytesRead;while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {bos.write(buff, 0, bytesRead);}} catch ( IOException e) {e.printStackTrace();} finally {if (bis != null)try {bis.close();} catch (IOException e) {e.printStackTrace();}if (bos != null)try {bos.close();} catch (IOException e) {e.printStackTrace();}}} }?
這里的createSingleWorkBook方法用來根據業務層中的相關數據生成的excel,這時候生成的excel是駐留在內存中的,所以需要其輸出,請參照方法ExcelSingleOutputStream和ExcelOutputStream(這里將一個方法拆分成兩個是因為原項目中還有其他的情況考慮,本文只羅列出一種相對簡單的情況,所以這樣不要差異,可以將這兩個方法看成一個也無妨,主要是向頁面輸出這個生成的Excel。
?
歡迎跳轉到本文的原文鏈接:https://honeypps.com/java/spring-mvc-apache-poi-web-excel-download/
?
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
?
?
?
?
總結
以上是生活随笔為你收集整理的SpringMVC + Apache POI 实现WEB中Excel下载功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中this()和super()的
- 下一篇: gradle idea java ssm