导出Excel工具类
package ky.settle.util;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
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;
/**
*
* List集合导出成Excel表格工具类
* @className ExportExcel
* @author zhangxianqian
* @date 2019年8月28日
*/
public final class ExportExcel {
/**
* 构造方法
*/
private ExportExcel() {
}
/***
* 工作簿
*/
private static HSSFWorkbook workbook;
/***
* sheet
*/
private static HSSFSheet sheet;
/**
*
* @param response
* response
* @param dataList
* 对象集合
* @param headMap
* 表头信息(对象属性名称->要显示的标题值)[按顺序添加]
* @param sheetName
* sheet名称和表头值
* @param fileName
* 生成文件名
*/
public static void excelExportWeb(HttpServletResponse response,List<?> dataList, LinkedHashMap<String, String> headMap, String sheetName,String fileName) {
// 初始化workbook
initHSSFWorkbook(sheetName);
// 标题行
createTitleRow(0,headMap, sheetName);
// 时间行
createDateHeadRow(1,headMap);
// 表头行
createHeadRow(2,headMap);
// 文本行
createContentRow(3,dataList, headMap);
//设置自动伸缩
//autoSizeColumn(headMap.size());
// 写入处理结果
try {
OutputStream out = response.getOutputStream();// 取得输出流
response.reset();// 清空输出流
response.setHeader("Content-disposition","attachment; filename="+fileName+".xls");// 设定输出文件头
response.setContentType("application/msexcel");// 定义输出类型
workbook.write(out);
out.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
*
* @param dataList
* 对象集合
* @param headMap
* 表头信息(对象属性名称->要显示的标题值)[按顺序添加]
* @param sheetName
* sheet名称和表头值
* @param fileName
* 生成文件名(包括文件路径,不包括后缀)
*/
public static void excelExport(List<?> dataList, LinkedHashMap<String, String> headMap, String sheetName,String fileName) {
// 初始化workbook
initHSSFWorkbook(sheetName);
// 标题行
createTitleRow(0,headMap, sheetName);
// 时间行
createDateHeadRow(1,headMap);
// 表头行
createHeadRow(2,headMap);
// 文本行
createContentRow(3,dataList, headMap);
//设置自动伸缩
//autoSizeColumn(headMap.size());
// 写入处理结果
try {
String filedisplay = fileName+".xls";
OutputStream out = new FileOutputStream(filedisplay);
workbook.write(out);
out.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
*
* @param response
* response
* @param dataList
* 对象集合
* @param headMap
* 表头信息(对象属性名称->要显示的标题值)[按顺序添加]
* @param sheetName
* sheet名称
* @param fileName
* 生成文件名
*/
public static void excelExportWebWithoutTitle(HttpServletResponse response,List<?> dataList, LinkedHashMap<String, String> headMap, String sheetName,String fileName) {
// 初始化workbook
initHSSFWorkbook(sheetName);
// 表头行
createHeadRow(0,headMap);
// 文本行
createContentRow(1,dataList, headMap);
//设置自动伸缩
//autoSizeColumn(headMap.size());
// 写入处理结果
try {
OutputStream out = response.getOutputStream();// 取得输出流
response.reset();// 清空输出流
response.setHeader("Content-disposition","attachment; filename="+fileName+".xls");// 设定输出文件头
response.setContentType("application/msexcel");// 定义输出类型
workbook.write(out);
out.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
/***
* 初始化workbook
* @param sheetName
* sheetName
*/
private static void initHSSFWorkbook(String sheetName) {
workbook = new HSSFWorkbook();
sheet = workbook.createSheet(sheetName);
}
/**
* 生成标题(第零行创建)
* @param startRow 标题行开始位置
* @param headMap 对象属性名称->表头显示名称
* @param sheetName sheet名称
*/
private static void createTitleRow(int startRow,LinkedHashMap<String, String> headMap, String sheetName) {
CellRangeAddress titleRange = new CellRangeAddress(0, 0, 0, headMap.size() - 1);
sheet.addMergedRegion(titleRange);
HSSFRow titleRow = sheet.createRow(startRow);
HSSFCell titleCell = titleRow.createCell(0);
titleCell.setCellValue(sheetName);
}
/**
* 创建时间行(第一行创建)
* @param startRow 时间行开始位置
* @param headMap 对象属性名称->表头显示名称
*/
private static void createDateHeadRow(int startRow,LinkedHashMap<String, String> headMap) {
CellRangeAddress dateRange = new CellRangeAddress(1, 1, 0, headMap.size() - 1);
sheet.addMergedRegion(dateRange);
HSSFRow dateRow = sheet.createRow(startRow);
HSSFCell dateCell = dateRow.createCell(0);
dateCell.setCellValue(new SimpleDateFormat("yyyy年MM月dd日").format(new Date()));
}
/**
* 创建表头行(第二行创建)
* @param startRow 表头行开始位置
* @param headMap 对象属性名称->表头显示名称
*/
private static void createHeadRow(int startRow,LinkedHashMap<String, String> headMap) {
HSSFRow headRow = sheet.createRow(startRow);
int i = 0;
for (String entry : headMap.keySet()) {
HSSFCell headCell = headRow.createCell(i);
headCell.setCellValue(headMap.get(entry));
i++;
}
}
/**
* 创建内容行(第三行创建)
* @param startRow 内容行开始位置
* @param dataList 对象数据集合
* @param headMap 表头信息
*/
private static void createContentRow(int startRow,List<?> dataList, LinkedHashMap<String, String> headMap) {
try {
int i=0;
for (Object obj : dataList) {
HSSFRow textRow = sheet.createRow(startRow + i);
int j = 0;
for (String entry : headMap.keySet()) {
String method = "get" + entry.substring(0, 1).toUpperCase() + entry.substring(1);
Method m = obj.getClass().getMethod(method, null);
Object valObj = m.invoke(obj, null);
String value = valObj == null ? null : valObj.toString();
HSSFCell textcell = textRow.createCell(j);
textcell.setCellValue(value);
j++;
}
i++;
}
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
* 自动伸缩列(如非必要,请勿打开此方法,耗内存)
* @param size 列数
*/
private static void autoSizeColumn(Integer size) {
for (int j = 0; j < size; j++) {
sheet.autoSizeColumn(j);
}
}
}