動態匯出Excel
阿新 • • 發佈:2018-10-31
一、概述
在工作過程中,都會遇到這樣一個需求,動態選擇想要匯出的欄位,這裡寫成通用的匯出Excel的工具。
二、專案實現
1、構建pom.xml
我的工程是利用Maven來構建的,這裡僅給出最核心的包
<!--jxi匯出--> <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifactId>jxl</artifactId> <version>2.6.12</version> </dependency>
三、jxi匯出Excel工具類
import jxl.SheetSettings; import jxl.Workbook; import jxl.format.Alignment; import jxl.format.VerticalAlignment; import jxl.write.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServletResponse; import java.io.OutputStream; import java.net.URLEncoder; import java.util.*; /** * @Auther: admin * @Date: 2018/10/28 12:35 * @Description: */ public class JXIExcelUtils { private final static Logger logger = LoggerFactory.getLogger(JXIExcelUtils.class); /** * @param : response * @param : fileName 檔名,如20150703.xls * @param : listData 資料來源 * @param : sheetName 表頭名稱 * @param : columns 列名稱集合,例如(姓名,年齡) * @return: void * @date : 2018/10/28 12:49 * @Description: 下載Excel */ public static void exportExcel(HttpServletResponse response, String fileName, List<Map<String, Object>> listData, String sheetName, List<String> columns) throws Exception { response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-disposition", "attachment; fileName" + URLEncoder.encode(fileName, "UTF-8")); exportToExcel(response, listData, sheetName, columns); } private static void exportToExcel(HttpServletResponse response, List<Map<String, Object>> objData, String sheetName, List<String> columns) { try { OutputStream outputStream = response.getOutputStream(); //建立WritableWorkbook物件 WritableWorkbook book = Workbook.createWorkbook(outputStream); //獲取sheet物件 WritableSheet sheet = book.createSheet(sheetName, 0); SheetSettings settings = sheet.getSettings(); settings.setVerticalFreeze(1); WritableFont font = new WritableFont(WritableFont.createFont("微軟雅黑"), 10, WritableFont.BOLD); WritableCellFormat format = new WritableCellFormat(font); //format.setBackground(Colour.YELLOW); format.setAlignment(Alignment.CENTRE); format.setVerticalAlignment(VerticalAlignment.CENTRE); if (columns != null && columns.size() > 0) { for (int i = 0; i < columns.size(); i++) { sheet.addCell(new Label(i, 0, columns.get(i), format)); } if (objData != null && objData.size() > 0) { for (int i = 0; i < objData.size(); i++) { Map<String, Object> map = objData.get(i); for (int j = 0; j < columns.size(); j++) { sheet.addCell(new Label(j, i + 1, "null".equals(String.valueOf(map.get(columns.get(j)))) ? null : String.valueOf(map.get(columns.get(j))))); } } } book.write(); book.close(); outputStream.flush(); outputStream.close(); } logger.info("匯入成功"); } catch (Exception e) { e.printStackTrace(); logger.error("匯入" + e.getMessage()); } } //整合內容 public static List<Map<String, Object>> assembelDats(List<Map<String, Object>> result, LinkedHashMap<String, String> map) { List<Map<String, Object>> daList = new ArrayList<>(); Map<String, Object> tempMap = null; for (int i = 0; i < result.size(); i++) { tempMap = new HashMap<String, Object>(); for (Map.Entry<String, Object> entrySet : result.get(i).entrySet()) { tempMap.put(map.get(entrySet.getKey()), entrySet.getValue()); } daList.add(tempMap); } return daList; } //整合內容(不帶泛型) public static List<Map<String, Object>> assembelDats2(List<Map> result, LinkedHashMap map) { List<Map<String, Object>> daList = new ArrayList<>(); Map<String, Object> tempMap = null; for (int i = 0; i < result.size(); i++) { tempMap = new HashMap(); for (Object key : result.get(i).keySet()) { tempMap.put((String) map.get(key), result.get(i).get(key)); } daList.add(tempMap); } return daList; } } 三、Service程式碼
@Override
public List<Map> queryCase(Map<String, Object> params) {
return excelFormDao.queryCase(params);
}
四,Controller,講解下思路,前端傳過來一個數組column,以逗號分割
/** * @date : 2018/10/28 15:25 * @param : [params, response, request] * @return : void * @exception: * @Description: jxi動態匯出Excel,匯出欄位可選 * */ @RequestMapping("/JxiexportExcel.do") @ResponseBody public void JxiexportExcel(@RequestParam HashMap params, HttpServletResponse response,HttpServletRequest request) { logger.info("呼叫JxiexportExcel請求引數params"+params); String fileName="查詢"+System.currentTimeMillis()+".xls"; String sheetName="xxx表"; //獲取前端請求的input選中的的值,前端傳參格式是:陣列,以,分割 String [] titles=request.getParameterValues("column"); params.put("column",titles); List<Map> resultSet=excelService.queryCase(params); LinkedHashMap <String,String> map=new LinkedHashMap<>(); //name,age對應pojo屬性 map.put("name","姓名"); map.put("age","年齡"); map.put("sex","性別"); map.put("address","上海"); //整合表頭 List<String> columns=new ArrayList<>(); for (int i = 0; i <titles.length; i++) { columns.add(map.get(titles[i])); } List <Map<String,Object>> listData=JXIExcelUtils.assembelDats2(resultSet,map); try { JXIExcelUtils.exportExcel(response,fileName,listData,sheetName,columns); } catch (Exception e) { logger.error(e.getMessage()); logger.error("匯出查詢失敗:"+ExceptionUtils.getStackTrace(e)); } }
五.前端頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";%>
<html>
<head>
<base href="<%=basePath%>">
<title>匯出</title>
<script src="js/jquery-3.1.1.min.js"></script>
</head>
<body>
<form id="form_login" action="http://localhost:8080/Mybatis_PageHelper/JxiexportExcel.do" method="get">
<div class="modal" id="mymodal1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span
class="sr-only">Close</span></button>
<h4 class="modal-title">選擇資訊</h4>
</div>
<div class="modal-body">
姓名<input type="checkbox" name="checkbox1" value="name" />
性別<input type="checkbox" name="checkbox1" value="sex"/>
年齡<input type="checkbox" name="checkbox1" value="age"/>
地址<input type="checkbox" name="checkbox1" value="address"/>
</div>
<div class="modal-footer">
<button type="submit" >JXI匯出</button>
<button id="btn" type="button" onclick="openpage()">匯出</button>
</div>
</div>
</div>
</div>
</form>
</body>
<script type="text/javascript">
function openpage(){
window.location.replace("export.do");
}
</script>
</html>
六,匯出效果如下