POI原生方法导出复杂Excel示例代码

public ResponseBean exportExcel(QueryData data, HttpServletResponse response) {

//省略数据准备代码,根据具体业务完成数据准备
//导出模板
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();

//表头,createHeadCellStyle方法见下方代码,主要就是关于excel样式的设置
HSSFCellStyle headerStyle = ExcelUtil.createHeadCellStyle(wb);

//数据内容,createContentCellStyle方法见下代码,主要就是关于excel样式的设置
HSSFCellStyle contentStyle = ExcelUtil.createContentCellStyle(wb);

//声明一个变量来保存Excel的行数
int rowNum=0;

//使用sheet的createRow方法画下第一行
HSSFRow row = sheet.createRow(rowNum++);
//设置每一个单元格的宽高
sheet.setColumnWidth(0,180*55);
sheet.setColumnWidth(1,143*55);
sheet.setColumnWidth(2,143*55);
sheet.setColumnWidth(3,143*55);
sheet.setColumnWidth(4,143*55);
sheet.setColumnWidth(5,143*55);
sheet.setColumnWidth(6,143*55);
sheet.setColumnWidth(7,143*55);
sheet.setColumnWidth(8,143*55);
//声明row_first数组,保存每一个单元格的内容
String[] row_first={"",examName,"","","","","","",""};
for(int i=0;i<row_first.length;i++){

//使用行的方法创建单元格   
 HSSFCell tempCell = row.createCell(i);
//给单元格设置内容值
    tempCell.setCellValue(row_first[i]);
//给单元格设置表头样式
    tempCell.setCellStyle(headerStyle);
}
//可以简单总结为:sheet.createRow(rowNum++)方法画行;
//row.createCell(i)方法画每一行的单元格。


//最后复杂表头肯定少不了合并单元格了;
//使用sheet的addMergedRegion()方法设置单元格合并,注意同一个格子不能存在于两个合并单元格中,会发生错误,行和列的计数都是由0开始;
//四个入参分别是:起始行,终止行,起始列,终止列。

sheet.addMergedRegion(new CellRangeAddress(0, 0, 1, 8));
sheet.addMergedRegion(new CellRangeAddress(1, 1, 1, 2));
sheet.addMergedRegion(new CellRangeAddress(1, 1, 3, 7));
sheet.addMergedRegion(new CellRangeAddress(2, 3, 8, 8));
//定义一个到处的Excel文件名
String fileName = "导出结果详情.xls";
try {

    //设置返回的response参数
    response.setCharacterEncoding("UTF-8");
    response.setHeader("content-Type", "application/vnd.ms-excel");
    response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
    response.setHeader( "Access-Control-Expose-Headers", "Content-disposition");
    wb.write(response.getOutputStream());

} catch (IOException e) {

//写你的异常处理逻辑

}

}

/**
 * 创建表头样式
 * @param wb
 * @return
 */

public static HSSFCellStyle createHeadCellStyle(Workbook wb){
    HSSFCellStyle cellStyle = (HSSFCellStyle)wb.createCellStyle();
    //设置自动换行
    cellStyle.setWrapText(true);
    //设置背景颜色
     cellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
    //水平居中
    cellStyle.setAlignment(HorizontalAlignment.CENTER);
    //垂直对齐
    cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
    cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
    cellStyle.setBottomBorderColor(IndexedColors.BLACK.index);
    //下边框
    cellStyle.setBorderBottom(BorderStyle.THIN);
    //左边框
    cellStyle.setBorderLeft(BorderStyle.THIN);
    //右边框
    cellStyle.setBorderRight(BorderStyle.THIN);
    //上边框
    cellStyle.setBorderTop(BorderStyle.THIN);

    //创建字体样式
    HSSFFont headerFont = (HSSFFont)wb.createFont();
    //字体加粗
    headerFont.setBold(true);
    //字体类型
    headerFont.setFontName("黑体");
    //字体大小
    headerFont.setFontHeightInPoints((short)12);
    //为标题样式添加字体样式
    cellStyle.setFont(headerFont);

    return cellStyle;
}
/**
 *  设置表格内容样式
 * @param wb
 * @return
 */
public static HSSFCellStyle createContentCellStyle(Workbook wb){
    HSSFCellStyle cellStyle = (HSSFCellStyle)wb.createCellStyle();
    //水平居中
    cellStyle.setAlignment(HorizontalAlignment.CENTER);
    //垂直居中
    cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);

    //设置自动换行
    cellStyle.setWrapText(true);
    //设置背景颜色
    cellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());

    //设置边框
    cellStyle.setBottomBorderColor(IndexedColors.BLACK.index);

    //上边框
    cellStyle.setBorderTop(BorderStyle.THIN);
    //下边框
    cellStyle.setBorderBottom(BorderStyle.THIN);
    //左边框
    cellStyle.setBorderLeft(BorderStyle.THIN);
    //右边框
    cellStyle.setBorderRight(BorderStyle.THIN);

    //设置字体
    HSSFFont font = (HSSFFont)wb.createFont();
    font.setColor((short)8);
    font.setFontHeightInPoints((short)12);

    return cellStyle;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值