java导出复杂excel表格_复杂的POI导出Excel表格(多行表头、合并单元格)

该博客详细介绍了如何利用Java的POI库来创建复杂的Excel表格,包括设置多行表头、合并单元格等功能。示例代码展示了从创建Workbook到设置各种样式的步骤,以及填充数据并导出Excel文件的过程。
摘要由CSDN通过智能技术生成

/*** 导出excel (HSSFWorkbook)*/

public voidexportExcel() {/**第一步,创建一个Workbook,对应一个Excel文件*/HSSFWorkbook wb= newHSSFWorkbook();/**第二步,在Workbook中添加一个sheet,对应Excel文件中的sheet*/HSSFSheet sheet= wb.createSheet("excel导出标题");/**第三步,设置样式以及字体样式*/HSSFCellStyle titleStyle=createTitleCellStyle(wb);

HSSFCellStyle headerStyle=createHeadCellStyle(wb);

HSSFCellStyle contentStyle=createContentCellStyle(wb);/**第四步,创建标题 ,合并标题单元格*/

//行号

int rowNum = 0;//创建第一页的第一行,索引从0开始

HSSFRow row0 = sheet.createRow(rowNum++);

row0.setHeight((short) 800);//设置行高

String title= "excel导出标题";

HSSFCell c00= row0.createCell(0);

c00.setCellValue(title);

c00.setCellStyle(titleStyle);//合并单元格,参数依次为起始行,结束行,起始列,结束列 (索引0开始)

sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 6));//标题合并单元格操作,6为总列数//第二行

HSSFRow row1 = sheet.createRow(rowNum++);

row1.setHeight((short) 500);

String[] row_first= {"填表单位:", "", "", "", "", " 2019年第2季度 ", ""};for (int i = 0; i < row_first.length; i++) {

HSSFCell tempCell=row1.createCell(i);

tempCell.setCellStyle(headerStyle);if (i == 0) {

tempCell.setCellValue(row_first[i]+ "测试单位");

}else if (i == 5) {

tempCell.setCellStyle(headerStyle);

tempCell.setCellValue(row_first[i]);

}else{

tempCell.setCellValue(row_first[i]);

}

}//合并

sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 4));

sheet.addMergedRegion(new CellRangeAddress(1, 1, 5, 6));//第三行

HSSFRow row2 = sheet.createRow(rowNum++);

row2.setHeight((short) 700);

String[] row_second= {"名称", "采集情况", "", "", "登记情况", "", "备注"};for (int i = 0; i < row_second.length; i++) {

HSSFCell tempCell=row2.createCell(i);

tempCell.setCellValue(row_second[i]);

tempCell.setCellStyle(headerStyle);

}//合并

sheet.addMergedRegion(new CellRangeAddress(2, 3, 0, 0));//名称

sheet.addMergedRegion(new CellRangeAddress(2, 2, 1, 3));//人数情况

sheet.addMergedRegion(new CellRangeAddress(2, 2, 4, 5));//登记情况

sheet.addMergedRegion(new CellRangeAddress(2, 3, 6, 6));//备注//第三行

HSSFRow row3 = sheet.createRow(rowNum++);

row3.setHeight((short) 700);

String[] row_third= {"", "登记数(人)", "办证总数(人)", "办证率(%)", "登记户数(户)", "签订数(份)", ""};for (int i = 0; i < row_third.length; i++) {

HSSFCell tempCell=row3.createCell(i);

tempCell.setCellValue(row_third[i]);

tempCell.setCellStyle(headerStyle);

}//循环每一行数据

List> dataList = new ArrayList>(); //查询出来的数据

Map map = new HashMap();

map.put("name", "测试名称1");

map.put("r1", "111");

map.put("r2", "222");

map.put("r3", "333");

map.put("r4", "444");

map.put("r5", "555");

map.put("r6", "666");

dataList.add(map);

dataList.add(map);//加多一条list

for (MapexcelData : dataList) {

HSSFRow tempRow= sheet.createRow(rowNum++);

tempRow.setHeight((short) 500);//循环单元格填入数据

for (int j = 0; j < 7; j++) {

HSSFCell tempCell=tempRow.createCell(j);

tempCell.setCellStyle(contentStyle);

String tempValue;if (j == 0) {//乡镇、街道名称

tempValue = excelData.get("name").toString();

}else if (j == 1) {//登记数(人)

tempValue = excelData.get("r1").toString();

}else if (j == 2) {//办证总数(人)

tempValue = excelData.get("r2").toString();

}else if (j == 3) {//办证率(%)

tempValue = excelData.get("r3").toString();

}else if (j == 4) {//登记户数(户)

tempValue = excelData.get("r4").toString();

}else if (j == 5) {//签订数(份)

tempValue = excelData.get("r5").toString();

}else{//备注

tempValue = excelData.get("r6").toString();

}

tempCell.setCellValue(tempValue);

}

}//注释行

HSSFRow remark = sheet.createRow(rowNum++);

remark.setHeight((short) 500);

String[] row_remark= {"注:表中的“办证率=办证总数÷登记数×100%”", "", "", "", "", "", ""};for (int i = 0; i < row_remark.length; i++) {

HSSFCell tempCell=remark.createCell(i);if (i == 0) {

tempCell.setCellStyle(headerStyle);

}else{

tempCell.setCellStyle(contentStyle);

}

tempCell.setCellValue(row_remark[i]);

}int remarkRowNum = dataList.size() + 4;

sheet.addMergedRegion(new CellRangeAddress(remarkRowNum, remarkRowNum, 0, 6));//注释行合并单元格//尾行

HSSFRow foot = sheet.createRow(rowNum++);

foot.setHeight((short) 500);

String[] row_foot= {"审核人:", "", "填表人:", "", "填表时间:", "", ""};for (int i = 0; i < row_foot.length; i++) {

HSSFCell tempCell=foot.createCell(i);

tempCell.setCellStyle(contentStyle);if (i == 0) {

tempCell.setCellValue(row_foot[i]+ "张三");

}else if (i == 2) {

tempCell.setCellValue(row_foot[i]+ "李四");

}else if (i == 4) {

tempCell.setCellValue(row_foot[i]+ "xxxx");

}else{

tempCell.setCellValue(row_foot[i]);

}

}int footRowNum = dataList.size() + 5;//注

sheet.addMergedRegion(new CellRangeAddress(footRowNum, footRowNum, 0, 1));

sheet.addMergedRegion(new CellRangeAddress(footRowNum, footRowNum, 2, 3));

sheet.addMergedRegion(new CellRangeAddress(footRowNum, footRowNum, 4, 6));//导出

HttpServletResponse response = this.getResponse();

String fileName= "报表名称.xls";try{

fileName= new String(fileName.getBytes("UTF-8"), "ISO-8859-1");

response.setHeader("Content-disposition", "attachment;filename=\"" + fileName + "\"");

OutputStream stream=response.getOutputStream();if (null != wb && null !=stream) {

wb.write(stream);//将数据写出去

wb.close();

stream.close();

}

}catch(Exception e) {

e.printStackTrace();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值