Java poi实现Excel多级表头导出

后端开发 2023-09-13 14:00:40
565阅读

最近遇到一个导出,相当麻烦。我也查询了很多博客,并根据其中一篇博客进行修改,达到了最终想要的效果。话不多说,直接上效果图

java  poi实现Excel多级表头导出_测试类

上面的代码:

1、主要代码:

ListMapString,对象convertListMap=toListConvertListMap(tableTitleList,列表);

//第一步创建一个Excel文件对应的Workbook

XSSFWorkbook wb=new XSSFWorkbook();

//第二步,在Workbook中添加一个sheet,对应Excel文件中的sheet。

XSSFSheet Sheet=wb.createSheet('sheet');

//第三步设置样式和字体样式

XSSFCellStyle titleStyle=createTitleCellStyle(wb);

XSSFCellStyle headerStyle=createHeadCellStyle(wb);

XSSFCellStyle contentStyle=createContentCellStyle(wb);

//电话号码

int 行数=0;

//创建第一页第一行,索引从0开始

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

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

sheet.setColumnWidth(2, 8000);

sheet.setColumnWidth(3, 8000);

//第二行

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

row2.setHeight((短)700);

//todo: 第三行

XSSFRow row3=Sheet.createRow(rowNum++);

row3.setHeight((短)700);

字符串[] row_one=null;

字符串[] row_two=null;

字符串[] row_ Three=null;

int 单元格大小=0;

if (tableTitleList.size()==2) { //全部

row_one=new String[]{'序列号', '模块', '单元名称', '统计数据', '总计', '', '',

'测试类型A', '', '', '', '', '', '', '', '', '', '', '',

'测试类型B', '', '', '', '', '', '', '', '', '', '', '',};

row_two=new String[]{'', '', '', '', '总计A', '总计B', '总计C',

'测试类型A1', '', '', '',

'测试类型A2', '', '', '',

'测试类型A3', '', '', '',

'测试类型B1', '', '', '',

'测试类型B2', '', '', '',

'测试类型B3', '', '', ''};

row_two=new String[]{'', '', '', '', '', '', '',

‘起床’、‘洗漱’、‘吃饭’、‘上班’、

‘起床’、‘洗漱’、‘吃饭’、‘上班’、

‘起床’、‘洗漱’、‘吃饭’、‘上班’、

‘起床’、‘洗漱’、‘吃饭’、‘上班’、

‘起床’、‘洗漱’、‘吃饭’、‘上班’、

'起床','洗漱','吃饭','上班',};

//合并单元格

提取(表);

}

//创建第一行单元格

for (int i=0; i row_one.length; i++) {

XSSFCell c00=row0.createCell(i);

c00.setCellValue(row_one[i]);

c00.setCellStyle(headerStyle);

}

//创建第二行单元格

for (int i=0; i row_two.length; i++) {

XSSFCell tempCell=row2.createCell(i);

tempCell.setCellValue(row_two[i]);

tempCell.setCellStyle(headerStyle);

}

//创建第三行单元格

for (int i=0; i row_ Three.length; i++) {

XSSFCell tempCell=row3.createCell(i);

tempCell.setCellValue(row_ Three[i]);

tempCell.setCellStyle(headerStyle);

}

//设置表头单元格的宽度

表标题样式列宽度(表);

//todo: 填写数据

approvalMethodfillInData(convertListMap,sheet,contentStyle,rowNum,row_two,tableTitleList);//approvalMethodfillInData(convertListMap,sheet,contentStyle,rowNum,cellSize,tableTitleList);

//导出到浏览器下载

buildExcelDocument('监控数据.xlsx', wb, response);

2. 合并单元格

私有静态无效提取(XSSFSheet 表){

//todo:合并参数为:起始行、结束行、起始列、结束列

//将第一行合并到第一列的第三行

sheet.addMergedRegion(new CellRangeAddress(0, 2, 0, 0));

//合并第二列的第一行到第三行

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

//将第一行合并到第三行第三列

sheet.addMergedRegion(new CellRangeAddress(0, 2, 2, 2));

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

//全部的

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

//总计下的单元格

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

sheet.addMergedRegion(new CellRangeAddress(1, 2, 5, 5));

sheet.addMergedRegion(new CellRangeAddress(1, 2, 6, 6));

sheet.addMergedRegion(new CellRangeAddress(0, 0, 7, 18));

sheet.addMergedRegion(new CellRangeAddress(0, 0, 19, 30));

sheet.addMergedRegion(new CellRangeAddress(1, 1, 7, 10));

sheet.addMergedRegion(new CellRangeAddress(1, 1, 11, 14));

sheet.addMergedRegion(new CellRangeAddress(1, 1, 15, 18));

sheet.addMergedRegion(new CellRangeAddress(1, 1, 19, 22));

sheet.addMergedRegion(new CellRangeAddress(1, 1, 23, 26));

sheet.addMergedRegion(new CellRangeAddress(1, 1, 27, 30));

}3.设置表头单元格的宽度

私有静态无效tableTitleStyleColumnwidth(XSSFSheet表){

sheet.setColumnWidth(2, 8000);

sheet.setColumnWidth(3, 8000);

sheet.setColumnWidth(7, 3000);

sheet.setColumnWidth(8, 3000);

sheet.setColumnWidth(9, 3000);

sheet.setColumnWidth(10, 3000);

sheet.setColumnWidth(11, 3000);

sheet.setColumnWidth(12, 3000);

sheet.setColumnWidth(13, 3000);

sheet.setColumnWidth(14, 3000);

sheet.setColumnWidth(15, 3000);

sheet.setColumnWidth(16, 3000);

sheet.setColumnWidth(17, 3000);

sheet.setColumnWidth(18, 3000);

sheet.setColumnWidth(19, 3000);

sheet.setColumnWidth(20, 3000);

sheet.setColumnWidth(21, 3000);

sheet.setColumnWidth(22, 3000);

sheet.setColumnWidth(23, 3000);

sheet.setColumnWidth(24, 3000);

sheet.setColumnWidth(25, 3000);

sheet.setColumnWidth(26, 3000);

sheet.setColumnWidth(27, 3000);

sheet.setColumnWidth(28, 3000);

sheet.setColumnWidth(29, 3000);

sheet.setColumnWidth(30, 3000);

}4.填写数据(注:这里的数据格式为ListMapString,Object类型,您可以根据自己的实际情况封装数据)

私人静态无效的approvalMethodfillInData(ListMapString,对象convertListMap,XSSFSheet工作表,XSSFCellStyle contentStyle,int rowNum,String [] cellSize,列表

for (MapString, 对象映射: ConvertListMap) {

XSSFRow tempRow=Sheet.createRow(rowNum++);

tempRow.setHeight((短) 500);

//判断选择类型

if (tableTitleList.size()==2 || 'enterprise'.equals(tableTitleList.get(0).toString())) {

//循环单元格填充数据

for (int i=0; i cellSize.length; i++) {

//列宽自适应,j为自适应列,true表示自适应,false表示不自适应,默认不自适应

sheet.autoSizeColumn(i, true);

XSSFCell tempCell=tempRow.createCell(i);

tempCell.setCellStyle(contentStyle);

字符串临时值='';

开关(一){

案例0:

tempValue=map.get('indexNum').toString();

休息;

案例1:

tempValue=map.get('platName').toString();

休息;

案例2:

tempValue=map.get('deptName').toString();

休息;

案例3:

tempValue=map.get('type').toString();

休息;

案例4:

tempValue=map.get('totalProNum').toString();

休息;

案例5:

tempValue=map.get('totalBidNum').toString();

休息;

案例6:

tempValue=map.get('totalAmount').toString();

休息;

案例7:

tempValue=map.get('enterpriseEngineeringProNum').toString();

休息;

案例8:

tempValue=map.get('enterpriseEngineeringBidNum').toString();

休息;

案例9:

tempValue=map.get('企业采购金额').toString();

休息;

案例10:

tempValue=map.get('planEnterprisePurchaseAmount').toString();

休息;

案例11:

tempValue=map.get('enterprisePurchaseProNum').toString();

休息;

案例12:

tempValue=map.get('enterprisePurchaseBidNum').toString();

休息;

案例13:

tempValue=map.get('企业采购金额').toString();

休息;

案例14:

tempValue=map.get('planEnterprisePurchaseAmount').toString();

休息;

案例15:

tempValue=map.get('enterpriseServiceProNum').toString();

休息;

案例16:

tempValue=map.get('enterpriseServiceBidNum').toString();

休息;

案例17:

tempValue=map.get('enterpriseServiceAmount').toString();

休息;

案例18:

tempValue=map.get('planEnterpriseServiceAmount').toString();

休息;

案例19:

tempValue=map.get('groupEngineeringProNum').toString();

休息;

案例20:

tempValue=map.get('grouppurchaseBidNum').toString();

休息;

案例21:

tempValue=map.get('groupPurchaseAmount').toString();

休息;

案例22:

tempValue=map.get('palnGroupPurchaseAmount').toString();

休息;

案例23:

tempValue=map.get('groupPurchaseProNum').toString();

休息;

案例24:

tempValue=map.get('groupEngineeringBidNum').toString();

休息;

案例25:

tempValue=map.get('groupEngineeringAmount').toString();

休息;

案例26:

tempValue=map.get('planGroupEngineeringAmount').toString();

休息;

案例27:

tempValue=map.get('groupServiceProNum').toString();

休息;

案例28:

tempValue=map.get('groupServiceBidNum').toString();

休息;

案例29:

tempValue=map.get('groupServiceAmount').toString();

休息;

案例30:

tempValue=map.get('planGroupServiceAmount').toString();

休息;

}

tempCell.setCellValue(tempValue);

}

}}

5.Web下载并导出到浏览器

私有静态无效buildExcelDocument(字符串文件名,工作簿wb,HttpServletResponse响应){

尝试{

response.setContentType('application/octet-stream');

//可以自己定义编码格式

response.setHeader('Content-Disposition', 'attachment;filename=' + URLEncoder.encode(fileName, 'utf-8'));

//清除jsp编译的html文件中的空格,防止excel中出现空行

响应.flushBuffer();

//写出

wb.write(response.getOutputStream());

} catch (IOException e) {

e.printStackTrace();

} 最后{

IOUtils.closeQuietly(wb);

}

}

6.提供标题样式、内容样式和标题样式

/**

*创建标题样式

*

* @参数wb

* @返回

*/

私有静态XSSFCellStyle createTitleCellStyle(XSSFWorkbook wb) {

XSSFCellStyle cellStyle=wb.createCellStyle();

cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中

cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直对齐

cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

//cellStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex());//背景颜色

XSSFFont headerFont1=(XSSFFont) wb.createFont(); //创建字体样式

headerFont1.setBold(true); //粗体

headerFont1.setFontName('Helvetica'); //设置字体类型

headerFont1.setFontHeightInPoints((短) 15); //设置字体大小

cellStyle.setFont(headerFont1); //设置标题样式的字体样式

返回单元格样式;

}

/**

*创建标题样式

*

* @参数wb

* @返回

*/

私有静态XSSFCellStyle createHeadCellStyle(XSSFWorkbook wb) {

XSSFCellStyle cellStyle=wb.createCellStyle();

cellStyle.setWrapText(true);//设置自动换行

cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.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); //上边框

XSSFFont headerFont=(XSSFFont) wb.createFont(); //创建字体样式

headerFont.setBold(true); //粗体

headerFont.setFontName('Helvetica'); //设置字体类型

headerFont.setFontHeightInPoints((短) 12); //设置字体大小

cellStyle.setFont(headerFont); //设置标题样式的字体样式

返回单元格样式;

}

/**

* 创建内容样式

*

* @参数wb

* @返回

*/

私有静态XSSFCellStyle createContentCellStyle(XSSFWorkbook wb) {

XSSFCellStyle cellStyle=wb.createCellStyle();

cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中

cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中

cellStyle.setWrapText(true);//设置自动换行

cellStyle.setBorderBottom(BorderStyle.THIN); //下边框

cellStyle.setBorderLeft(BorderStyle.THIN); //左边框

cellStyle.setBorderRight(BorderStyle.THIN); //右边框

cellStyle.setBorderTop(BorderStyle.THIN); //上边框

//生成12号字体

XSSFFont 字体=wb.createFont();

字体.setColor((短)8);

font.setFontHeightInPoints((短) 12);

cellStyle.setFont(字体);

返回单元格样式;

}至此,你就完成了!如果您有好的实现方法,请分享!

the end
免责声明:本文不代表本站的观点和立场,如有侵权请联系本站删除!本站仅提供信息存储空间服务。