一、概述
在工作过程中,都会遇到这样一个需求,动态选择想要导出的字段,这里写成通用的导出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>
六,导出效果如下