参考link
1.ExportUtils
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
package com.hz.utils;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hpsf.DocumentSummaryInformation;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
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 com.alibaba.fastjson.JSONObject;
/**
* 导出功能的工具类
*
* @author Administrator
*
*/
public class ExportUtils {
// cols:example(id:项目id),(name:项目名称),(deviceName:设备名称),(startOfflineTime:设备开始离线时间)
// map<k,v>:example(sheet名称,数据list)
public static <T> void exportExcel(HttpServletResponse response, String excelName, String[] cols,
Map<String, List<T>> map) {
try {
HSSFWorkbook workbook = new HSSFWorkbook();
fillDatasToWorkbook(workbook, cols, map);
setWorkbookNature(workbook);
responseToBrowser(workbook, response, excelName);
} catch (Exception e) {
e.printStackTrace();
}
}
// 将数据填充到表格中
private static <T> void fillDatasToWorkbook(HSSFWorkbook workbook, String[] cols, Map<String, List<T>> map) {
Set<String> sheetNames = map.keySet();
HSSFCellStyle titleStyle = createCellStyle(workbook, 20);
HSSFCellStyle cellStyle = createCellStyle(workbook, 16);
for (String sheetName : sheetNames) {
HSSFSheet sheet = workbook.createSheet(sheetName);
List<T> dataList = map.get(sheetName);
// 记录上一行数据
JSONObject previousRowData = null;
// 记录本行数据
JSONObject rowData = null;
// 记录是否需要合并行
boolean booleanMegre = false;
// 用于记录合并行的数组
String[] megreCols = new String[cols.length];
// 创建行数 y轴
for (int y = 0; y < dataList.size() + 1; y++) {
HSSFRow row = sheet.createRow(y);
row.setHeightInPoints(50);// 设置行的高度是50个点
if (y != 0) {
rowData = (JSONObject) JSONObject.toJSON(dataList.get(y - 1));
}
// 创建列数 x轴
for (int x = 0; x < cols.length; x++) {
String[] col = cols[x].split(":");
HSSFCell cell = row.createCell(x);
if (y == 0) {
// 设置标题样式和值
cell.setCellValue(col[1]);
cell.setCellStyle(titleStyle);
} else {
// 设置内容样式和值
String currentValue = rowData.getString(col[0]);
cell.setCellValue(currentValue);
cell.setCellStyle(cellStyle);
if (y > 1) {
String previousValue = previousRowData.getString(col[0]);
// 记录合并行的详细坐标
if (previousValue != null && currentValue != null && previousValue.equals(currentValue)) {
String megreCol = megreCols[x];
if (megreCol == null && !booleanMegre) {
megreCols[x] = (y - 1) + ",";
}
if (megreCol != null && !booleanMegre && !megreCol.endsWith(",")) {
megreCols[x] += "," + (y - 1) + ",";
}
}
if (previousValue != null && currentValue != null && !previousValue.equals(currentValue)) {
String megreCol = megreCols[x];
if (x == 0) {
booleanMegre = true;
}
if (null != megreCol && megreCol.endsWith(",")) {
megreCols[x] += (y - 1);
}
}
}
}
// 开始合并
if (booleanMegre && x == cols.length - 1) {
for (int c = 0; c < megreCols.length; c++) {
String megre = megreCols[c];
if (null != megre) {
if (megre.endsWith(","))
megre += y - 1;
String[] split = megre.split(",");
if (split.length > 2) {
for (int l = 0; l < split.length / 2; l++) {
CellRangeAddress region = new CellRangeAddress(Integer.valueOf(split[l * 2]),
Integer.valueOf(split[l * 2 + 1]), c, c);
sheet.addMergedRegion(region);
}
} else {
CellRangeAddress region = new CellRangeAddress(Integer.valueOf(split[0]),
Integer.valueOf(split[1]), c, c);
sheet.addMergedRegion(region);
}
}
}
// 清除之前的记录
megreCols = new String[cols.length];
booleanMegre = false;
}
}
previousRowData = rowData;
}
for (int x = 0; x < cols.length; x++) {
sheet.setColumnWidth(x, 31 * 256);// 设置列的宽度是31个字符宽度
}
}
}
// 创建单元格样式
private static HSSFCellStyle createCellStyle(HSSFWorkbook workBook, int fontSize) {
HSSFCellStyle style = workBook.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平居中
style.setWrapText(true);// 自动换行
HSSFFont font = workBook.createFont();
font.setFontName("华文行楷");// 设置字体名称
font.setFontHeightInPoints((short) fontSize);// 设置字号
// font.setColor(HSSFColor.RED.index);//设置字体颜色
style.setFont(font);
style.setBorderTop(HSSFCellStyle.BORDER_DOTTED);// 上边框
style.setBorderBottom(HSSFCellStyle.BORDER_THICK);// 下边框
style.setBorderLeft(HSSFCellStyle.BORDER_DOUBLE);// 左边框
style.setBorderRight(HSSFCellStyle.BORDER_SLANTED_DASH_DOT);// 右边框
return style;
}
// 设置文件属性
private static void setWorkbookNature(HSSFWorkbook workbook) {
workbook.createInformationProperties();
DocumentSummaryInformation documentSummaryInformation = workbook.getDocumentSummaryInformation();
documentSummaryInformation.setCategory("Excel");// 类别
documentSummaryInformation.setManager("GSTAR");// 管理者
documentSummaryInformation.setCompany("YC-TECHNOLOGY");// 公司
}
// 响应给浏览器
private static void responseToBrowser(HSSFWorkbook workbook, HttpServletResponse response, String excelName)
throws IOException {
response.setContentType("application/msexcel;charset=GBK");
response.setHeader("Content-Type", "application/msexcel");
response.setHeader("Content-disposition",
"attachment; filename=" + new String((excelName + ".xls").getBytes(), "ISO-8859-1"));
OutputStream out = response.getOutputStream();
workbook.write(out);
out.flush();
out.close();
}
}