这个也没啥好说的,主要是注意数据格式,excel表的样式根据需求而定,
下载的是xlsx格式的,03版本的代码基本都差不多,下面是查询出来的数据,List<Map<String,Object>>
[{'age':0,'busiState':'04','crtTime':'2017-10-26 16:09:28.0','current':0,'custName':'张朋','custNo':'C2017091182510','hasAmazon':false,'hasEbay':false,'hasJingdong':false,'hasTaobao':false,'hasTianmao':true,'idNo':'360681198811016815','limitapplicationId':'LM20171026635920','mobile':'13917186473','pageSize':0,'platType':'03','processId':'1f983d2798f54050941be4a9ff1f633a','reApproveTime':'2017-10-26 16:20','shopCount':0},{'age':0,'busiState':'04','crtTime':'2017-09-21 14:39:39.0','current':0,'custName':'张朋','custNo':'C2017091182510','hasAmazon':false,'hasEbay':false,'hasJingdong':false,'hasTaobao':false,'hasTianmao':true,'idNo':'360681198811016815','limitapplicationId':'LM20170921492254','mobile':'13917186473','pageSize':0,'platType':'03','processId':'a7678889ed2d4a2a83625f1008851e79','reApproveTime':'2017-09-21 14:43','shopCount':0},{'age':0,'busiState':'04','crtTime':'2017-09-20 11:50:16.0','current':0,'custName':'张朋','custNo':'C2017091182510','hasAmazon':true,'hasEbay':false,'hasJingdong':false,'hasTaobao':false,'hasTianmao':false,'idNo':'360681198811016815','limitapplicationId':'LM20170912445361','mobile':'13917186473','pageSize':0,'platType':'01','processId':'2916174e2de74eb58a14d8c5867dde1e','reApproveTime':'2017-09-12 15:12','shopCount':0}]
/**
* 导出历史查询结果
* @param queryResultData
* @param req
* @param res
*/
@RequestMapping(value = "/report/exportQueryResult", method = RequestMethod.POST)
public void exportQueryResult(String queryResultData,HttpServletRequest req,HttpServletResponse res){
if(StringUtil.isEmpty(queryResultData)){
throw new CommonException("没有可导出的数据!");
}
queryResultData = queryResultData.replace("'", "\"");
JSONArray jsonArray = JSONArray.parseArray(queryResultData);
Object[] objList = jsonArray.toArray();
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
for (Object object : objList) {
Map<String,Object> map = null;
if(object instanceof Map){
map = (Map<String,Object>)object;
list.add(map);
}else{
throw new CommonException("数据格式错误!");
}
}
String[] headers = { "进件编号", "用户编号", "姓名", "手机", "身份证号","申请时间","状态"};
String fileName = "历史查询结果.xlsx";
fileName = getCodedFileName(fileName);
res.reset();
res.setContentType("application/x-msdownload");
res.setHeader("Content-Disposition","attachment; filename=" + fileName);
OutputStream out;
try {
out = res.getOutputStream();
createExcel("历史查询结果", headers,list,out);
out.flush();
out.close();
} catch (IOException e) {
throw new CommonException("导出查询结果异常!"+e.toString());
}
}
/**
* 创建excel文件
* @param sheetName
* @param headers
* @param listData
* @param out
* @throws IOException
*/
private void createExcel(String sheetName, String[] headers,List<Map<String,Object>> listData,OutputStream out) throws IOException{
if(listData != null && listData.size()>0){
// 声明一个工作薄
XSSFWorkbook workbook = new XSSFWorkbook();
// 生成一个表格
XSSFSheet sheet = workbook.createSheet(sheetName);
// 设置表格默认列宽度为15个字节
sheet.setDefaultColumnWidth((short) 20);
// 生成表头样式
XSSFCellStyle headerStyle = workbook.createCellStyle();
// 设置这些样式
headerStyle.setFillForegroundColor(HSSFColor.LAVENDER.index);
headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 生成一个字体
XSSFFont font = workbook.createFont();
font.setFontHeightInPoints((short) 12);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
// 把字体应用到当前的样式
headerStyle.setFont(font);
//产生表格标题行
XSSFRow row = sheet.createRow(0);
for (short i = 0; i < headers.length; i++) {
XSSFCell cell = row.createCell(i);
cell.setCellStyle(headerStyle);
XSSFRichTextString text = new XSSFRichTextString(headers[i]);
cell.setCellValue(text);
}
// 生成并设置 数据展示样式
XSSFCellStyle dataStyle = workbook.createCellStyle();
dataStyle.setFillForegroundColor(HSSFColor.WHITE.index);
dataStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
dataStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
dataStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
dataStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
dataStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
dataStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
dataStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
//设置单元格格式为文本格式
XSSFDataFormat xssfDataFormat = workbook.createDataFormat();
dataStyle.setDataFormat(xssfDataFormat.getFormat("@"));
// 生成另一个字体
XSSFFont font2 = workbook.createFont();
font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
// 把字体应用到当前的样式
dataStyle.setFont(font2);
for (int i = 0; i < listData.size(); i++) {
row = sheet.createRow(i+1);//从第二行开始
Map<String, Object> rowData = listData.get(i);
int cellIndex = 0;
cellIndex = createCell(cellIndex, row, dataStyle, rowData, "limitapplicationId");//进件编号
cellIndex = createCell(cellIndex, row, dataStyle, rowData, "custNo");//用户编号
cellIndex = createCell(cellIndex, row, dataStyle, rowData, "custName");//姓名
cellIndex = createCell(cellIndex, row, dataStyle, rowData, "mobile");//手机
cellIndex = createCell(cellIndex, row, dataStyle, rowData, "idNo");//身份证号
cellIndex = createCell(cellIndex, row, dataStyle, rowData, "crtTime");//申请时间
createCell(cellIndex, row, dataStyle, rowData, "busiState");//状态
}
workbook.write(out);
}
}
/**
* 创建单元格,并且写入数据
* @param cellIndex
* @param row
* @param dataStyle
* @param rowData
* @param columnId
* @return
*/
private int createCell(int cellIndex,XSSFRow row,XSSFCellStyle dataStyle,Map<String, Object> rowData,String columnId){
XSSFCell cell = row.createCell(cellIndex);
cell.setCellStyle(dataStyle);
Object obj = rowData.get(columnId);
if(obj == null){
cell.setCellValue("");
}else if(columnId.equals("crtTime")){
String crtTime = obj.toString();
crtTime = crtTime.substring(0, crtTime.length()-2);//格式化日期,去掉最后的 .0
cell.setCellValue(crtTime);
}else if(columnId.equals("busiState")){
if(obj.equals(ReportConstants.BUSI_STATE_01)){//自己定义的常量,01到05
cell.setCellValue("待审核");
}else if(obj.equals(ReportConstants.BUSI_STATE_02)){
cell.setCellValue("已审核");
}else if(obj.equals(ReportConstants.BUSI_STATE_03)){
cell.setCellValue("已放款");
}else if(obj.equals(ReportConstants.BUSI_STATE_04)){
cell.setCellValue("已放弃");
}else if(obj.equals(ReportConstants.BUSI_STATE_05)){
cell.setCellValue("拒贷");
}
}else{
cell.setCellValue(obj.toString());
}
cellIndex++;
return cellIndex;
}
private boolean isGBK(String entryName) {
try {
return java.nio.charset.Charset.forName("GBK").newEncoder().canEncode(entryName);
} catch (Exception e) {
return false;
}
}
public String getCodedFileName(String fileName){
String zipFileName = fileName;
try {
if (isGBK(fileName)) {
zipFileName = new String(fileName.getBytes("GBK"), "iso-8859-1");
} else {
zipFileName = URLEncoder.encode(fileName, "UTF-8");
}
} catch (UnsupportedEncodingException e) {
return fileName;
}
return zipFileName;
}
最后导出的效果