POI-HSSFWorkbook合并单元格及文字居中问题
// 合并单元格:参数:起始行, 终止行, 起始列, 终止列
CellRangeAddress cra = new CellRangeAddress(rowIndex, rowIndex, 0, k);
sheet.addMergedRegion(cra);
//注意:边框样式需要重新设置一下
RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, cra, sheet, wb);
//合并的单元格样式
HSSFCellStyle boderStyle = wb.createCellStyle();
//垂直居中
boderStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
//水平居中
boderStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
导出模板
实现代码
response.setHeader("Access-Control-Allow-Origin", "*");response.setHeader("Cache-Control", "no-cache");// 定义导出的excel名字String excelName = "专题分析报表";try {@SuppressWarnings("resource")HSSFWorkbook wb = new HSSFWorkbook();// 工作簿HSSFSheet sheet = wb.createSheet("专题分析");HSSFRow row = null;int columnIndex = 0;int rowIndex = 0;ThemeAnalyseReportResp themeAnalyseReport = themeAnalysisService.getThemeAnalyseReportRecord(req);// 总数Long total = themeAnalyseReport.getTotal();// 管道数据AnalyseReportData pipeLineData = themeAnalyseReport.getPipeLineData();// 雨河数据AnalyseReportData rainRiverData = themeAnalyseReport.getRainRiverData();// 雨污数据AnalyseReportData rainSewageData = themeAnalyseReport.getRainSewageData();Long pipeTotal = pipeLineData.getPipeTotal();Long rainSewageTotal = rainSewageData.getPipeTotal();Long rainRiverTotal = rainRiverData.getPipeTotal();// 时间范围Date startTime = req.getStartTime();Date endTime = req.getEndTime();SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");String startTimeFormat = sdf.format(startTime);String endTimeFormat = sdf.format(endTime);String timeStr = startTimeFormat + "-" + endTimeFormat;// 创建所有行数// 标题、名称所占行数 至少一行if (total != 0) {Long n = 0l;if (pipeTotal == 0) {n++;}if (rainSewageTotal == 0) {n++;}if (rainRiverTotal == 0) {n++;}// 导出行数为最大值if (total > 65535) {total = 65530l;}for (int m = 0; m < total + n; m++) {row = sheet.createRow(m);}} else {for (int m = 0; m < 5; m++) {row = sheet.createRow(m);}}// 合并单元格后居中HSSFCellStyle cellStyle = wb.createCellStyle();// 垂直居中cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置边框// 表格标题// HSSFRow row0 = sheet.createRow(rowIndex);row = sheet.getRow(rowIndex);HSSFCell cell = row.createCell(0);// 加载单元格样式// cell.setCellStyle(headStyle);cell.setCellValue("智水系统/专题分析报表");cell.setCellStyle(cellStyle);// 定义表头rowIndex++;row = sheet.createRow(rowIndex);row.setHeight((short) (22.50 * 20));// 设置行高columnIndex = 0;String str0 = "专题分析名称";row.createCell(columnIndex).setCellValue("专题分析名称");row.createCell(++columnIndex).setCellValue("报表周期");row.createCell(++columnIndex).setCellValue("总数");row.createCell(++columnIndex).setCellValue("数据名称");row.createCell(++columnIndex).setCellValue("总发生次数");row.createCell(++columnIndex).setCellValue("站点名称");row.createCell(++columnIndex).setCellValue("发生次数");row.createCell(++columnIndex).setCellValue("相关性站点");row.createCell(++columnIndex).setCellValue("日期");// 设置列宽int length = str0.getBytes().length;sheet.setColumnWidth(0, (short) (length * 256));sheet.setColumnWidth(1, (short) (length * 256));sheet.setColumnWidth(2, (short) (length * 128));sheet.setColumnWidth(3, (short) (length * 256));sheet.setColumnWidth(4, (short) (length * 128));sheet.setColumnWidth(5, (short) (length * 256));sheet.setColumnWidth(6, (short) (length * 128));sheet.setColumnWidth(7, (short) (length * 256));sheet.setColumnWidth(8, (short) (length * 256));// 单元格合并 起始行,结束行,起始列,结束列// 标题CellRangeAddress callRangeAddress0 = new CellRangeAddress(0, 0, 0, 8);sheet.addMergedRegion(callRangeAddress0);// 重新设置边框样式// RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, callRangeAddress0,// sheet, wb);// 第三行数据rowIndex++;// row = sheet.createRow(rowIndex);row = sheet.getRow(rowIndex);if (total.intValue() > 0) {// 专题分析名称CellRangeAddress callRangeAddress = new CellRangeAddress(rowIndex, total.intValue() + rowIndex - 1, 0,0);sheet.addMergedRegion(callRangeAddress);// 重新设置边框样式RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, callRangeAddress, sheet, wb);// 报表周期CellRangeAddress callRangeAddress1 = new CellRangeAddress(rowIndex, total.intValue() + rowIndex - 1, 1,1);sheet.addMergedRegion(callRangeAddress1);// 重新设置边框样式RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, callRangeAddress1, sheet, wb);// 总数CellRangeAddress callRangeAddress2 = new CellRangeAddress(rowIndex, total.intValue() + rowIndex - 1, 2,2);sheet.addMergedRegion(callRangeAddress2);// 重新设置边框样式// RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, callRangeAddress2,// sheet, wb);} else {// 专题分析名称CellRangeAddress callRangeAddress = new CellRangeAddress(2, 4, 0, 0);sheet.addMergedRegion(callRangeAddress);// 重新设置边框样式RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, callRangeAddress, sheet, wb);// 报表周期CellRangeAddress callRangeAddress1 = new CellRangeAddress(2, 4, 1, 1);sheet.addMergedRegion(callRangeAddress1);// 重新设置边框样式RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, callRangeAddress1, sheet, wb);// 总数CellRangeAddress callRangeAddress2 = new CellRangeAddress(2, 4, 2, 2);sheet.addMergedRegion(callRangeAddress2);}columnIndex = 0;cell = row.createCell(columnIndex);cell.setCellValue("专题分析报表概览");cell.setCellStyle(cellStyle);cell = row.createCell(++columnIndex);cell.setCellValue(timeStr);cell.setCellStyle(cellStyle);cell = row.createCell(++columnIndex);cell.setCellValue(total);cell.setCellStyle(cellStyle);// 表格数据填充// 雨污if (rainSewageData != null) {if (rainSewageTotal.intValue() > 0) { // 合并单元格行// 雨污相关性CellRangeAddress callRangeAddress3 = new CellRangeAddress(rowIndex,rainSewageTotal.intValue() + rowIndex - 1, 3, 3);sheet.addMergedRegion(callRangeAddress3);// 重新设置边框样式// RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, callRangeAddress3,// sheet, wb);// 数目CellRangeAddress callRangeAddress4 = new CellRangeAddress(rowIndex,rainSewageTotal.intValue() + rowIndex - 1, 4, 4);sheet.addMergedRegion(callRangeAddress4);// 重新设置边框样式// RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, callRangeAddress4,// sheet, wb);}columnIndex = 3;cell = row.createCell(columnIndex);cell.setCellValue("雨污相关性");cell.setCellStyle(cellStyle);cell = row.createCell(++columnIndex);cell.setCellValue(rainSewageTotal.intValue());cell.setCellStyle(cellStyle);if (rainSewageTotal.intValue() > 0) {// 4列后List<AnalyseMsgListVo> analyseData = rainSewageData.getAnalyseData();if (analyseData != null && analyseData.size() > 0) {for (int i = 0; i < analyseData.size(); i++) {AnalyseMsgListVo analyseMsgListVo = analyseData.get(i);String stationName = analyseMsgListVo.getStationName();List<AnalyseRecordVo> resMsg = analyseMsgListVo.getResMsg();// 站点名称 大于1的情况if (resMsg != null && resMsg.size() > 0) {// 合并 单元格// 站点名称 包含开始点 应该+1if (i != 0) {rowIndex = rowIndex + 1;}row = sheet.getRow(rowIndex);columnIndex = 5;if (stationName == null) {stationName = "";}cell = row.createCell(columnIndex);cell.setCellValue(stationName);cell.setCellStyle(cellStyle);cell = row.createCell(++columnIndex);cell.setCellValue(resMsg.size());cell.setCellStyle(cellStyle);if (resMsg.size() > 1) {CellRangeAddress callRangeAddress5 = new CellRangeAddress(rowIndex,resMsg.size() + rowIndex - 1, 5, 5);sheet.addMergedRegion(callRangeAddress5);// 重新设置边框样式// RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, callRangeAddress5,// sheet,// wb);// 次数CellRangeAddress callRangeAddress6 = new CellRangeAddress(rowIndex,resMsg.size() + rowIndex - 1, 6, 6);sheet.addMergedRegion(callRangeAddress6);// 重新设置边框样式// RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, callRangeAddress6,// sheet,// wb);}/*** 两种情况 1 三大类 第一个站点的 第一个相关性 站点 2 其他站点的*/for (int j = 0; j < resMsg.size(); j++) {// 除开第一个站点的第一个时间 其余都新增行数if (j != 0) {rowIndex++;}// row = sheet.createRow(rowIndex);row = sheet.getRow(rowIndex);if (row == null) {row = sheet.createRow(rowIndex);}AnalyseRecordVo analyseRecordVo = resMsg.get(j);String stationName2 = analyseRecordVo.getStationName();if (stationName2 == null) {stationName2 = "";}String date = analyseRecordVo.getDate();if (date == null) {date = "";}columnIndex = 7;// 相关站点row.createCell(columnIndex).setCellValue(stationName2);// 日期row.createCell(++columnIndex).setCellValue(date);if (rowIndex >= total) {break;}}}}}}}// 雨河if (rainRiverData != null) {// 雨污河连通第一行rowIndex++;// row = sheet.createRow(rowIndex);row = sheet.getRow(rowIndex);// 合并单元格行if (rainRiverTotal.intValue() > 0) {// 雨污河连通CellRangeAddress callRangeAddress3 = new CellRangeAddress(rowIndex,rainRiverTotal.intValue() + rowIndex - 1, 3, 3);sheet.addMergedRegion(callRangeAddress3);// 重新设置边框样式// RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, callRangeAddress3,// sheet, wb);// 数目CellRangeAddress callRangeAddress4 = new CellRangeAddress(rowIndex,rainRiverTotal.intValue() + rowIndex - 1, 4, 4);sheet.addMergedRegion(callRangeAddress4);// 重新设置边框样式// RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, callRangeAddress4,// sheet, wb);}columnIndex = 3;cell = row.createCell(columnIndex);cell.setCellValue("雨污河连通");cell.setCellStyle(cellStyle);cell = row.createCell(++columnIndex);cell.setCellValue(rainRiverTotal.intValue());cell.setCellStyle(cellStyle);if (rainRiverTotal.intValue() > 0) {// 4列后List<AnalyseMsgListVo> analyseData = rainRiverData.getAnalyseData();if (analyseData != null && analyseData.size() > 0) {for (int i = 0; i < analyseData.size(); i++) {AnalyseMsgListVo analyseMsgListVo = analyseData.get(i);String stationName = analyseMsgListVo.getStationName();List<AnalyseRecordVo> resMsg = analyseMsgListVo.getResMsg();// 站点名称 大于1的情况if (resMsg != null && resMsg.size() > 0) {// 合并 单元格// 站点名称 包含开始点 应该+1if (i != 0) {rowIndex = rowIndex + 1;}if (resMsg.size() > 1) {CellRangeAddress callRangeAddress5 = new CellRangeAddress(rowIndex,resMsg.size() + rowIndex - 1, 5, 5);sheet.addMergedRegion(callRangeAddress5);// 重新设置边框样式// RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, callRangeAddress5,// sheet,// wb);// 次数CellRangeAddress callRangeAddress6 = new CellRangeAddress(rowIndex,resMsg.size() + rowIndex - 1, 6, 6);sheet.addMergedRegion(callRangeAddress6);// 重新设置边框样式// RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, callRangeAddress6,// sheet,// wb);}if (stationName == null) {stationName = "";}row = sheet.getRow(rowIndex);columnIndex = 5;// 站点cell = row.createCell(columnIndex);cell.setCellValue(stationName);cell.setCellStyle(cellStyle);// 次数cell = row.createCell(++columnIndex);cell.setCellValue(resMsg.size());cell.setCellStyle(cellStyle);for (int j = 0; j < resMsg.size(); j++) {if (j != 0) {rowIndex++;}// row = sheet.createRow(rowIndex);row = sheet.getRow(rowIndex);AnalyseRecordVo analyseRecordVo = resMsg.get(j);String stationName2 = analyseRecordVo.getStationName();if (stationName2 == null) {stationName2 = "";}String date = analyseRecordVo.getDate();if (date == null) {date = "";}columnIndex = 7;// 相关站点row.createCell(columnIndex).setCellValue(stationName2);// 日期row.createCell(++columnIndex).setCellValue(date);if (rowIndex >= total) {break;}}}}}}}// 管道if (pipeLineData != null) {// 管道堵塞风险第一行rowIndex++;// row = sheet.createRow(rowIndex);row = sheet.getRow(rowIndex);// 大于最大值if (total >= 65530) {// 合并单元格行// 雨污河连通CellRangeAddress callRangeAddress3 = new CellRangeAddress(rowIndex, 65530, 3, 3);sheet.addMergedRegion(callRangeAddress3);// 重新设置边框样式// RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, callRangeAddress3,// sheet, wb);// 数目CellRangeAddress callRangeAddress4 = new CellRangeAddress(rowIndex, 65530, 4, 4);sheet.addMergedRegion(callRangeAddress4);// 重新设置边框样式// RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, callRangeAddress4,// sheet, wb);} else {if (pipeTotal.intValue() > 0) {// 合并单元格行// 雨污河连通CellRangeAddress callRangeAddress3 = new CellRangeAddress(rowIndex,pipeTotal.intValue() + rowIndex - 1, 3, 3);sheet.addMergedRegion(callRangeAddress3);// 重新设置边框样式// RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, callRangeAddress3,// sheet, wb);// 数目CellRangeAddress callRangeAddress4 = new CellRangeAddress(rowIndex,pipeTotal.intValue() + rowIndex - 1, 4, 4);sheet.addMergedRegion(callRangeAddress4);// 重新设置边框样式// RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, callRangeAddress4,// sheet, wb);}}columnIndex = 3;cell = row.createCell(columnIndex);cell.setCellValue("管道堵塞风险");cell.setCellStyle(cellStyle);cell = row.createCell(++columnIndex);cell.setCellValue(pipeTotal.intValue());cell.setCellStyle(cellStyle);if (pipeTotal.intValue() > 0) {// 4列后List<AnalyseMsgListVo> analyseData = pipeLineData.getAnalyseData();if (analyseData != null && analyseData.size() > 0) {for (int i = 0; i < analyseData.size(); i++) {AnalyseMsgListVo analyseMsgListVo = analyseData.get(i);String stationName = analyseMsgListVo.getStationName();List<AnalyseRecordVo> resMsg = analyseMsgListVo.getResMsg();// 站点名称 大于1的情况if (resMsg != null && resMsg.size() > 0) {// 合并 单元格// 站点名称 包含开始点 应该+1if (i != 0) {rowIndex = rowIndex + 1;}if (resMsg.size() + rowIndex < 65530) {if (resMsg.size() > 1) {CellRangeAddress callRangeAddress5 = new CellRangeAddress(rowIndex,resMsg.size() + rowIndex - 1, 5, 5);sheet.addMergedRegion(callRangeAddress5);// 重新设置边框样式// RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, callRangeAddress5,// sheet, wb);// 次数CellRangeAddress callRangeAddress6 = new CellRangeAddress(rowIndex,resMsg.size() + rowIndex - 1, 6, 6);sheet.addMergedRegion(callRangeAddress6);// 重新设置边框样式// RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, callRangeAddress6,// sheet, wb);}} else {if (rowIndex < 65530) {CellRangeAddress callRangeAddress5 = new CellRangeAddress(rowIndex, 65530, 5,5);sheet.addMergedRegion(callRangeAddress5);// 重新设置边框样式// RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, callRangeAddress5,// sheet, wb);// 次数CellRangeAddress callRangeAddress6 = new CellRangeAddress(rowIndex, 65530, 6,6);sheet.addMergedRegion(callRangeAddress6);// 重新设置边框样式// RegionUtil.setBorderTop(HSSFBorderFormatting.BORDER_THICK, callRangeAddress6,// sheet, wb);} else {break;}}if (stationName == null) {stationName = "";}columnIndex = 5;row = sheet.getRow(rowIndex);// 站点cell = row.createCell(columnIndex);cell.setCellValue(stationName);cell.setCellStyle(cellStyle);// 次数cell = row.createCell(++columnIndex);cell.setCellValue(resMsg.size());cell.setCellStyle(cellStyle);for (int j = 0; j < resMsg.size(); j++) {if (j != 0) {rowIndex++;}// row = sheet.createRow(rowIndex);row = sheet.getRow(rowIndex);if (row == null) {row = sheet.createRow(rowIndex);}AnalyseRecordVo analyseRecordVo = resMsg.get(j);String stationName2 = analyseRecordVo.getStationName();if (stationName2 == null) {stationName2 = "";}String date = analyseRecordVo.getDate();if (date == null) {date = "";}columnIndex = 7;// 相关站点row.createCell(columnIndex).setCellValue(stationName2);// 日期row.createCell(++columnIndex).setCellValue(date);// System.out.println(row.toString());if (rowIndex >= total) {break;}}}}}}}sheet.setDefaultRowHeight((short) (16.5 * 20));// 列宽自适应 有中文不适用// for (int i = 0; i <= 7; i++) {// sheet.autoSizeColumn(i);// }String title = "czjl_all";response.setHeader("Content-disposition", "attachment;fileName=" + title + ".xls");response.setContentType("application/octet-stream;charset=utf-8");OutputStream ouputStream = response.getOutputStream();wb.write(ouputStream);ouputStream.flush();ouputStream.close();} catch (Exception e) {e.printStackTrace();}
前端实现
export function exportExcelOrder(data) {return request2({url: 'http://192.168.2.50:8888/v2/export/exportExcelOrder',method: 'POST',data,responseType: 'blob' // 表明返回的数据类型})
}workOrderExcel(){exportExcelOrder().then(()=>{const blob = new Blob([res])const fileName = '工单数据.xls'const elink = document.createElement('a')elink.download = fileNameelink.style.display = 'none'elink.href = URL.createObjectURL(blob)document.body.appendChild(elink)elink.click()URL.revokeObjectURL(elink.href) // 释放URL 对象document.body.removeChild(elink)})},
POI-HSSFWorkbook合并单元格及文字居中问题相关推荐
- 用Xlsx xlsx-style 导出excel表格,附带合并单元格,文字居中,文字颜色字体大小等样式 (复制即可实现)
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一.用Xlsx xlsx-style 导出excel表格 二.使用步骤 1.安装插件 2.引入 总结 前 ...
- Latex合并单元格并文字居中
目录 问题描述 问题解决 问题描述 latex合并单元格(分为合并行和合并列两种情况)之后,如何使文字居中显示. 问题解决 \begin{table}[!h] \small \centering \c ...
- POI获取合并单元格的值
POI获取合并单元格时,如果是遍历获取合并单元格的所有子单元格的值,office的excel都会有值,wps的excel只会第一个子单元格有值,其他子单元格都没值,即cell=null.故意凡是获取合 ...
- poi读取合并单元格
poi读取合并单元格 学习了:http://blog.csdn.net/ycb1689/article/details/9764191 进行了列合并单元格的修正:原来是我自己找错了地方: import ...
- Apache POI读合并单元格
转载请注明来源-作者@loongshawn:http://blog.csdn.net/loongshawn/article/details/77193464,建议读者阅读原文,确保获得完整的信息 场景 ...
- php td居中显示文字,【html】合并单元格,并居中显示文本
现状: 想要实现的效果: 代码实现: 用例失败为0,无测试详情 知识点: 合并单元格 rowspan是合并行,colspan 是合并列 456 实例: 1 2 3 456 效果: 2.单元格内容居中: ...
- JXL导出EXCEL合并单元格、文字对齐方式 .
public void createNoLotteryAlarmExcel(String filePath,String fileName,List<NoLotteryAlarm> ala ...
- JXL导出EXCEL合并单元格、文字对齐方式
这次能做出来,主要是感谢各位在网上提供的资料,在此记录 导出的结果是,大家看哈,若有可取之处可继续 代码比较多,大家主要看哈我用红色标注部分即可 --------------------------- ...
- java POI 实现合并单元格
合并单元格所使用的方法: sheet.addMergedRegion( CellRangeAddress cellRangeAddress ); CellRangeAddress 对象的构造方法 ...
最新文章
- matlab nt什么意思,胎儿nt是什么意思
- appium python框架结构,GitHub - wyybingo/python-appium: 基于PageObject UI自动化测试框架,支持Android/iOS...
- J2EE学习笔记三:EJB基础概念和知识 收藏
- php 接口的定义与实现,PHP接口定义与用法示例
- 《幸福资本论》读书笔记
- 解决“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”(转贴)...
- ios NSString 正则表达式 其它字符
- JavaSE各阶段练习题----集合-Collection-Set-List
- hadoop中如何控制map的数量
- 深度学习修炼(三)——自动求导机制
- 谷歌浏览器检查更新时出错:无法启动更新检查(错误代码为 3: 0x80080005 -- system level)
- InnoDB原理篇:Change Buffer是如何提升索引性能的?
- gm怎么刷东西 rust_RUST:2020年7月第三周 修补和更新
- Web前端开发必学15大技术
- 模幂运算问题,使用朴素算法和重复-平方算法(快速幂+C#计算程序运行时间)
- []TLD code run
- go语言练习:条件语句和循环语句
- nginx 文件服务器_Nginx必不可少啊!!!
- 信号检测与估计理论_校对招募 | 信号检测论的贝叶斯估计
- 【Linux初始化init系统】