/**
* 列表导出
* @param userForm
* @param session
* @return
*/
@RequestMapping(value = "/download", method = RequestMethod.POST)
public void download(@RequestBody UserForm userForm,HttpSession session,HttpServletResponse response ) {
try {
SysUserBean sysUser =(SysUserBean) session.getAttribute("loginuser");
if(userForm.getAreaid()==null || "".equals(userForm.getAreaid())) {
userForm.setAreaid(sysUser.getAREA_ID());
}
List<Map<String,Object>> list1= //数据源
List<Map<String,Object>> list2= //数据源
//Excel导出工具类
ExcelTools excelTools = ExcelTools.newInstance();
//设置workbook和数据源
excelTools.setData(new XSSFWorkbook(), list1, list2);
System.out.println("list1.size "+list1.size());
String fileName = "导出表单名称";
//设置sheet的名称
excelTools.setSheetName(fileName);
//执行 创建Excel
excelTools.execute();
Date date = new Date();
SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
fileName = fileName+"&"+ft.format(date)+".xlsx";
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName,"UTF-8"));
//允许前端可以从header中取出"Content-Disposition" 的值
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "0");
response.setContentType("application/octet-stream");
XSSFWorkbook workbook = excelTools.getWorkbook();
workbook.write(response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
Excel导出工具类:
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
* Excel导出工具类
* @author chai
*
*/
public class ExcelTools {
private XSSFWorkbook wb;
private List<Map<String,Object>> list1;
private List<Map<String,Object>> list2;
private String sheetName;
// 单元格样式
public XSSFCellStyle style0,style1, style2,style3;
// 字体样式
public XSSFFont font0,font1, font2,font3;
//格式设置
public DataFormat format;
private ExcelTools() {
}
public static ExcelTools newInstance() {
return new ExcelTools();
}
public void setData(XSSFWorkbook wb,List<Map<String,Object>> list1,List<Map<String,Object>> list2) {
setWorkbook(wb);
setAreaList(list1);
setPaymentList(list2);
}
public void setWorkbook(XSSFWorkbook wb) {
this.wb = wb;
}
public XSSFWorkbook getWorkbook() {
return wb;
}
public void setAreaList(List<Map<String,Object>> list1) {
this.list1= list1;
}
public void setPaymentList(List<Map<String,Object>> list2) {
this.list2= list2;
}
//设置sheet的名称
public void setSheetName(String sheetName) {
this.sheetName = sheetName;
}
/**
* 执行
*/
public void execute() {
//初始化一些单元格样式
initCellStyle();
//创建sheet并填充数据
createSheet();
}
public void initCellStyle() {
setFormat();
setStyle0();
setStyle1();
setStyle2();
setStyle3();
}
public void createSheet() {
XSSFSheet sheet = null;
try {
sheet = wb.createSheet(sheetName);
} catch (Exception e) {
System.out.println("创建sheet异常 ");
}
int columnNum = list1.size()*3+1;
for(int i = 0 ; i < columnNum; i++) {
sheet.setColumnWidth(i, 256 * 12 + 140);
if (i == 0) {
sheet.setColumnWidth(i, 256 * 34 + 155);
}
}
int rowNumber = 0;
//整个表的名称
XSSFRow row = sheet.createRow(rowNumber++);
row.setHeight((short) (256 * 2 + 208));
XSSFCell cell = null;
for(int i = 0; i < columnNum; i++) {
cell = row.createCell(i);
cell.setCellStyle(style0);
if(i == 0) {
cell.setCellValue(sheetName);
}
}
//合并单元格
CellRangeAddress region = new CellRangeAddress(0, 0, 0, columnNum-1);
sheet.addMergedRegion(region);
//表头
row = sheet.createRow(rowNumber++);
for(int i = 0; i < columnNum; i++) {
cell = row.createCell(i);
cell.setCellStyle(style1);
if(i == 0) {
cell.setCellValue("填充内容");
}else if(i%3 == 1) {
cell.setCellValue(list1.get(i/3).get("****").toString());
}else if(i%3 == 0) {
region = new CellRangeAddress(rowNumber-1, rowNumber-1, i-2, i);
sheet.addMergedRegion(region);
}
}
row = sheet.createRow(rowNumber++);
row.setHeight((short) (256 * 1 + 208));
for(int i = 0; i < columnNum; i++) {
cell = row.createCell(i);
cell.setCellStyle(style1);
if(i == 0) {
region = new CellRangeAddress(rowNumber-2, rowNumber-1, 0, 0);
sheet.addMergedRegion(region);
}else if(i%3 == 1) {
cell.setCellValue("填充内容1");
}else if(i%3 == 2) {
cell.setCellValue("填充内容2");
}else if(i%3 == 0 ) {
cell.setCellValue("填充内容3");
}
}
//将list1对应的id进行缓存
List<String> cacheList = new ArrayList<>();
cacheList.add("TYPE_NAME");
for(int i = 0; i < columnNum-1; i++) {
String id = null;
id = list1.get(i/3).get("ID").toString();
if(i%3 == 0) {
cacheList.add(id+"****");
}else if(i%3 == 1) {
cacheList.add(id+"****");
}else if(i%3 == 2) {
cacheList.add(id+"****");
}
}
//表体
int rowNum = list2.size()+3;
String id = null;
Map<String,Object> list2Item= null;
String areaId = null;
for(;rowNumber < rowNum;) {
row = sheet.createRow(rowNumber++);
list2Item= list2.get(rowNumber-4);
for(int i = 0; i < columnNum; i++) {
cell = row.createCell(i);
cell.setCellStyle(style3);
if(i == 0) {
cell.setCellStyle(style2);
areaId = cacheList.get(i).toString();
cell.setCellValue(paymenListItem.get(areaId) == null ? "0":list2Item.get(areaId).toString());
}else {
areaId = cacheList.get(i).toString();
cell.setCellValue(Double.valueOf(list2Item.get(areaId) == null ? "0":list2Item.get(areaId).toString()));
}
}
}
}
public void setFormat() {
format = wb.createDataFormat();
}
/**
* 居中 无边框 白色背景 宋体 16号 加粗 自动换行
* 单元格类型 文本
*/
public void setStyle0() {
style0 = wb.createCellStyle();
// 边框
// 居中
style0.setAlignment(HorizontalAlignment.CENTER);
style0.setVerticalAlignment(VerticalAlignment.CENTER);
// 自动换行
style0.setWrapText(true);
//字体
font0 = wb.createFont();
font0.setBold(true);//粗体
font0.setFontName("宋体");
font0.setFontHeightInPoints((short) 16);
style0.setFont(font0);
// 单元格类型 @ 表示文本
style0.setDataFormat(format.getFormat("@"));
}
/**
* 居中 黑色边框 白色背景 宋体 9号 加粗 自动换行
* 单元格类型 文本
*/
public void setStyle1() {
style1 = wb.createCellStyle();
// 边框
style1.setBorderLeft(CellStyle.BORDER_THIN);
style1.setBorderTop(CellStyle.BORDER_THIN);
style1.setBorderRight(CellStyle.BORDER_THIN);
style1.setBorderBottom(CellStyle.BORDER_THIN);
// 居中
style1.setAlignment(HorizontalAlignment.CENTER);
style1.setVerticalAlignment(VerticalAlignment.CENTER);
// 自动换行
style1.setWrapText(true);
font1 = wb.createFont();
font1.setBold(true);
font1.setFontName("宋体");
font1.setFontHeightInPoints((short) 9);
style1.setFont(font1);
// 背景色
// style1.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
// style1.setFillForegroundColor(new XSSFColor(new java.awt.Color(0, 176, 240)));
// 单元格类型 @ 表示文本
style1.setDataFormat(format.getFormat("@"));
}
/**
* 靠左 黑色边框 白色背景 宋体 9号 加粗 自动换行
*/
public void setStyle2() {
style2 = wb.createCellStyle();
// 边框
style2.setBorderLeft(CellStyle.BORDER_THIN);
style2.setBorderTop(CellStyle.BORDER_THIN);
style2.setBorderRight(CellStyle.BORDER_THIN);
style2.setBorderBottom(CellStyle.BORDER_THIN);
// 居中
style2.setAlignment(HorizontalAlignment.LEFT);
style2.setVerticalAlignment(VerticalAlignment.CENTER);
// 自动换行
style2.setWrapText(true);
font2 = wb.createFont();
font2.setFontName("宋体");
font2.setFontHeightInPoints((short) 9);
// font2.setBold(true);
style2.setFont(font2);
// 单元格类型 @ 表示文本
style2.setDataFormat(format.getFormat("@"));
}
/**
* 靠右 黑色边框 白色背景 宋体 9号 加粗 自动换行
*/
public void setStyle3() {
style3 = wb.createCellStyle();
// 边框
style3.setBorderLeft(CellStyle.BORDER_THIN);
style3.setBorderTop(CellStyle.BORDER_THIN);
style3.setBorderRight(CellStyle.BORDER_THIN);
style3.setBorderBottom(CellStyle.BORDER_THIN);
// 居中
style3.setAlignment(HorizontalAlignment.RIGHT);
style3.setVerticalAlignment(VerticalAlignment.CENTER);
// 自动换行
style3.setWrapText(true);
font3 = wb.createFont();
font3.setFontName("宋体");
font3.setFontHeightInPoints((short) 9);
// font3.setBold(true);
style3.setFont(font3);
// 单元格类型 @ 表示文本
// style3.setDataFormat(format.getFormat("@"));
}
}