版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012279452/article/details/82894726
Excel工具类:
package com.haaa.cloudmedical.common.util;/**
* Created by Tony.Tong on 2018/9/25.
*/
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* @ClassName ExportExcel
* @Description List集合导出成Excel表格工具类
* @Author Tony.Tong
* @Date 2018/9/25 14:03
**/
public final class ExportExcel {
/**
* 工作簿
*/
private static HSSFWorkbook workbook;
/**
* sheet
*/
private static HSSFSheet sheet;
/**
* 标题行开始的位置
*/
private static final int TITLE_START_POSITION = 0;
/**
* 时间行开始的位置
*/
private static final int DATEHEAD_START_POSITION = 1;
/**
* 表头行开始的位置
*/
private static final int HEAD_START_POSITION = 2;
/**
* 文本行开始的位置
*/
private static final int CONTENT_START_POSITION = 3;
public static ResponseEntity<byte[]> excelExport(List<LinkedHashMap<String,String>> dataList, LinkedHashMap<String, String>
titleMap, String sheetName, String timeRange, HttpServletRequest request, HttpServletResponse response) throws IOException{
//初始化workbook
initHSSFWorkbook(sheetName);
//填充标题行
createTitleRow(titleMap, sheetName);
//填充时间行
createDateHeadRow(titleMap,timeRange);
//填充表头行
creatHeadRow(titleMap);
//填充文本内容
createContentRow(dataList, titleMap);
//设置列自动伸缩
// autoSizeColumn(titleMap.size());
//写入结果
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
workbook.write(out);
} catch (Exception e) {
e.printStackTrace();
}
HttpHeaders headers = new HttpHeaders();
//如果是IE浏览器,则用URLEncode解析
if(isMSBrowser(request)){
sheetName = URLEncoder.encode(sheetName, "UTF-8");
}else{//如果是谷歌、火狐则解析为ISO-8859-1
sheetName = new String(sheetName.getBytes("UTF-8"), "ISO-8859-1");
}
//通知浏览器以attachment(下载方式)
headers.setContentDispositionFormData("attachment", sheetName+".xls");
//application/octet-stream二进制流数据(最常见的文件下载)。
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
ResponseEntity<byte[]> filebyte = new ResponseEntity<byte[]>(out.toByteArray(),headers, HttpStatus.CREATED);
return filebyte;
}
/**
* @Title initHSSFWorkbook
* @Description 创建sheet
* @Date 2018/9/25
* @Param [sheetName]
* @Return void
* @Author Tony.Tong
*/
private static void initHSSFWorkbook(String sheetName) {
workbook = new HSSFWorkbook();
sheet = workbook.createSheet(sheetName);
}
/**
* @Title createTitleRow
* @Description 生成标题(第零行创建)
* @Date 2018/9/25
* @Param [titleMap, sheetName]表头名称,sheet名称
* @Return void
* @Author Tony.Tong
*/
private static void createTitleRow(Map<String, String> titleMap, String sheetName) {
CellRangeAddress titleRange = new CellRangeAddress(0, 0, 0, titleMap.size() - 1);
sheet.addMergedRegion(titleRange);
HSSFRow titleRow = sheet.createRow(TITLE_START_POSITION);
HSSFCell titleCell = titleRow.createCell(0);
titleCell.setCellValue(sheetName);
}
/**
* @Title createDateHeadRow
* @Description 创建时间行 (第一行创建)
* @Date 2018/9/25
* @Param [titleMap]表头名称
* @Return void
* @Author Tony.Tong
*/
private static void createDateHeadRow(Map<String, String> titleMap,String timeRange) {
CellRangeAddress dateRange = new CellRangeAddress(1, 1, 0, titleMap.size() - 1);
sheet.addMergedRegion(dateRange);
HSSFRow dateRow = sheet.createRow(DATEHEAD_START_POSITION);
HSSFCell dateCell = dateRow.createCell(0);
dateCell.setCellValue(timeRange);
}
/**
* @Title creatHeadRow
* @Description 创建表头行(第二行创建)
* @Date 2018/9/25
* @Param [titleMap]表头名称
* @Return void
* @Author Tony.Tong
*/
private static void creatHeadRow(LinkedHashMap<String, String> titleMap) {
//第一行创建
HSSFRow headRow = sheet.createRow(HEAD_START_POSITION);
int i = 0;
for (String entry : titleMap.keySet()
) {
HSSFCell headCell = headRow.createCell(i);
headCell.setCellValue(titleMap.get(entry));
i++;
}
}
/**
* @Title createContentRow
* @Description 文本创建
* @Date 2018/9/25
* @Param [dataList, titleMap]对象数据集合,表头信息
* @Return void
* @Author Tony.Tong
*/
private static void createContentRow(List<?> dataList, Map<String, String> titleMap) {
try {
for (int i = 0;i<dataList.size();i++){
HSSFRow textRow = sheet.createRow(CONTENT_START_POSITION + i);
Map<String,String> map = (HashMap)dataList.get(i);
for (int j = 0;j<titleMap.size();){
for (HashMap.Entry<String, String> entry : map.entrySet()){
String value = entry.getValue();
HSSFCell textCell = textRow.createCell(j);
textCell.setCellValue(value);
j++;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @Title autoSizeColumn
* @Description 自动伸缩列 (如非必要,请勿打开此方法,耗内存)
* @Date 2018/9/25
* @Param [size]
* @Return void
* @Author Tony.Tong
*/
private static void autoSizeColumn(Integer size) {
for (int j = 0; j < size; j++) {
sheet.autoSizeColumn(j);
}
}
/**
* 方法功能描述: 判断是否是IE浏览器
* @param request
* @return
*/
private static boolean isMSBrowser(HttpServletRequest request) {
String[] IEBrowserSignals = {"MSIE", "Trident", "Edge"};
String userAgent = request.getHeader("User-Agent");
for (String signal : IEBrowserSignals) {
if (userAgent.contains(signal)){
return true;
}
}
return false;
}
}
Controller:
/**
* @Title DownloadDoctorWork
* @Description
* @Date 2018/9/28
* @Param [map, request, response]
* @Return org.springframework.http.ResponseEntity<byte[]>
* @Author Tony.Tong
*/
@RequestMapping("exportExcel.action")
public ResponseEntity<byte[]> DownloadDoctorWork(@RequestParam Map<String,String> map, HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("start导出");
long start = System.currentTimeMillis();
LinkedHashMap<String, String> titleMap = new LinkedHashMap<>(7);
//此处是自己根据业务场景查询的表单list,根据自己需求改动即可
List<LinkedHashMap<String,String>> dataList = userServiceService.findDoctorWorkCountExcel(map);
ResponseEntity<byte[]> filebyte =null;
titleMap.put("title_one", "序号");
titleMap.put("title_two", "健康管家");
titleMap.put("title_three", "所属区");
titleMap.put("title_four", "服务站");
titleMap.put("title_five", "已服务人数");
titleMap.put("title_six", "服务人次");
titleMap.put("title_seven", "服务时长(小时)");
try {
filebyte = ExportExcel.excelExport(dataList,titleMap,map.get("sheetName"),map.get("timeRange"),request,response);
}catch (IOException e){
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("end导出");
System.out.println("耗时:"+(end-start)+"s");
return filebyte;
}
dataList截图:
web页面表单截图:
导出Excel截图: