poi导出Excel报表多表头双层表头、合并单元格
效果图:
controller层方法:
/**
*
* 导出Excel报表
* @param request
* @return
*
*/
@RequestMapping("/export")
@ResponseBody
public void export(HttpServletRequest request,
HttpServletResponse response, String yearMonth) {
try {
SimpleDateFormat dateFmt = new SimpleDateFormat("yyyy-MM-dd");
Map<String, Object> params = new HashMap<String, Object>();
params.put("yearMonth", yearMonth + "%");
List<TemperHumidityModel> list = temperHumidityService
.getList(params);
for (int i = 0; i < list.size(); i++) {
Date date = list.get(i).getRecordDate();
String dateStr = dateFmt.format(date);
dateStr = dateStr.replace(yearMonth + "-", "");
list.get(i).setRecordDay(dateStr);
}
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "晴");
map.put(2, "多云");
map.put(3, "阴");
map.put(4, "小雨");
map.put(5, "中雨");
map.put(6, "大雨");
map.put(7, "大到暴雨");
map.put(8, "雾");
map.put(9, "霾");
// 构造导出数据
List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
for (int i = 0; i < list.size(); i++) {
TemperHumidityModel model = list.get(i);
Map<String, Object> tmpMap = new HashMap<String, Object>();
tmpMap.put("date", model.getRecordDay());
if(model.getWeather() == 1) {
tmpMap.put("weather", map.get(1));
}else if(model.getWeather() == 2) {
tmpMap.put("weather", map.get(2));
}else if(model.getWeather() == 3) {
tmpMap.put("weather", map.get(3));
}else if(model.getWeather() == 4) {
tmpMap.put("weather", map.get(4));
}else if(model.getWeather() == 5) {
tmpMap.put("weather", map.get(5));
}else if(model.getWeather() == 6) {
tmpMap.put("weather", map.get(6));
}else if(model.getWeather() == 7) {
tmpMap.put("weather", map.get(7));
}else if(model.getWeather() == 8) {
tmpMap.put("weather", map.get(8));
}else if(model.getWeather() == 9) {
tmpMap.put("weather", map.get(9));
}
tmpMap.put("natureTem", model.getNatureTem());
tmpMap.put("natureHum", model.getNatureHum());
tmpMap.put("adjustTem", model.getAdjustTem());
tmpMap.put("adjustHum", model.getAdjustHum());
tmpMap.put("remark", model.getRemark());
tmpMap.put("creator", model.getRealname());
dataList.add(tmpMap);
}
String sheetName = "温湿度日记录";
String date = yearMonth;
String[] head0 = new String[] { "日期", "天气", "自然", "自然", "调整", "调整",
"备注", "记录人" }; //在excel中的第3行每列的参数
String[] head1 = new String[] { "温度℃", "湿度%", "温度℃", "湿度%" }; //在excel中的第4行每列(合并列)的参数
String[] headnum0 = new String[] { "2,3,0,0", "2,3,1,1", "2,2,2,3",
"2,2,4,5", "2,3,6,6", "2,3,7,7" }; //对应excel中的行和列,下表从0开始{"开始行,结束行,开始列,结束列"}
String[] headnum1 = new String[] { "3,3,2,2", "3,3,3,3", "3,3,4,4",
"3,3,5,5" };
String[] colName = new String[] { "date", "weather", "natureTem",
"natureHum", "adjustTem", "adjustHum", "remark", "creator" }; //需要显示在excel中的参数对应的值,因为是用map存的,放的都是对应的key
reportMergeXls(request, response, dataList, sheetName, head0,
headnum0, head1, headnum1, colName, date); //utils类需要用到的参数
} catch (Exception e) {
e.printStackTrace();
}
}
utils类:
package org.base.controller;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellRangeAddress;
import org.base.util.CellUtil;
import org.core.controller.BaseController;
/**
* 多行表头
* dataList:导出的数据;sheetName:表头名称; head0:表头第一行列名;headnum0:第一行合并单元格的参数
* head1:表头第二行列名;headnum1:第二行合并单元格的参数;detail:导出的表体字段
*
*/
public void reportMergeXls(HttpServletRequest request,
HttpServletResponse response, List<Map<String, Object>> dataList,
String sheetName, String[] head0, String[] headnum0,
String[] head1, String[] headnum1, String[] detail , String date)
throws Exception {
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet(sheetName);// 创建一个表
// 表头标题样式
HSSFFont headfont = workbook.createFont();
headfont.setFontName("宋体");
headfont.setFontHeightInPoints((short) 22);// 字体大小
HSSFCellStyle headstyle = workbook.createCellStyle();
headstyle.setFont(headfont);
headstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中
headstyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中
headstyle.setLocked(true);
// 表头时间样式
HSSFFont datefont = workbook.createFont();
datefont.setFontName("宋体");
datefont.setFontHeightInPoints((short) 12);// 字体大小
HSSFCellStyle datestyle = workbook.createCellStyle();
datestyle.setFont(datefont);
datestyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中
datestyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中
datestyle.setLocked(true);
// 列名样式
HSSFFont font = workbook.createFont();
font.setFontName("宋体");
font.setFontHeightInPoints((short) 12);// 字体大小
HSSFCellStyle style = workbook.createCellStyle();
style.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
style.setFont(font);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中
style.setLocked(true);
// 普通单元格样式(中文)
HSSFFont font2 = workbook.createFont();
font2.setFontName("宋体");
font2.setFontHeightInPoints((short) 12);
HSSFCellStyle style2 = workbook.createCellStyle();
style2.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
style2.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
style2.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
style2.setFont(font2);
style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中
style2.setWrapText(true); // 换行
style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中
// 设置列宽 (第几列,宽度)
sheet.setColumnWidth( 0, 1600);
sheet.setColumnWidth( 1, 3600);
sheet.setColumnWidth( 2, 2800);
sheet.setColumnWidth( 3, 2800);
sheet.setColumnWidth( 4, 2800);
sheet.setColumnWidth( 5, 2800);
sheet.setColumnWidth( 6, 4500);
sheet.setColumnWidth( 7, 3600);
sheet.setDefaultRowHeight((short)360);//设置行高
// 第一行表头标题
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, head0.length-1));
HSSFRow row = sheet.createRow(0);
row.setHeight((short) 0x349);
HSSFCell cell = row.createCell(0);
cell.setCellStyle(headstyle);
CellUtil.setCellValue(cell, sheetName);
// 第二行时间
sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, head0.length-1));
HSSFRow row1 = sheet.createRow(1);
row.setHeight((short) 0x349);
HSSFCell cell1 = row1.createCell(0);
cell1.setCellStyle(datestyle);
CellUtil.setCellValue(cell1, date);
// 第三行表头列名
row = sheet.createRow(2);
for (int i = 0; i < 8; i++) {
cell = row.createCell(i);
cell.setCellValue(head0[i]);
cell.setCellStyle(style);
}
//动态合并单元格
for (int i = 0; i < headnum0.length; i++) {
String[] temp = headnum0[i].split(",");
Integer startrow = Integer.parseInt(temp[0]);
Integer overrow = Integer.parseInt(temp[1]);
Integer startcol = Integer.parseInt(temp[2]);
Integer overcol = Integer.parseInt(temp[3]);
sheet.addMergedRegion(new CellRangeAddress(startrow, overrow,
startcol, overcol));
}
//设置合并单元格的参数并初始化带边框的表头(这样做可以避免因为合并单元格后有的单元格的边框显示不出来)
row = sheet.createRow(3); //因为下标从0开始,所以这里表示的是excel中的第四行
for (int i = 0; i < head0.length; i++) {
cell = row.createCell(i);
cell.setCellStyle(style); //设置excel中第四行的1、2、7、8列的边框
if(i > 1 && i< 6) {
for (int j = 0; j < head1.length; j++) {
cell = row.createCell(j + 2);
cell.setCellValue(head1[j]); //给excel中第四行的3、4、5、6列赋值("温度℃", "湿度%", "温度℃", "湿度%")
cell.setCellStyle(style); //设置excel中第四行的3、4、5、6列的边框
}
}
}
//动态合并单元格
for (int i = 0; i < headnum1.length; i++) {
String[] temp = headnum1[i].split(",");
Integer startrow = Integer.parseInt(temp[0]);
Integer overrow = Integer.parseInt(temp[1]);
Integer startcol = Integer.parseInt(temp[2]);
Integer overcol = Integer.parseInt(temp[3]);
sheet.addMergedRegion(new CellRangeAddress(startrow, overrow,
startcol, overcol));
}
// 设置列值-内容
for (int i = 0; i < dataList.size(); i++) {
row = sheet.createRow(i + 4);//标题、时间、表头字段共占了4行,所以在填充数据的时候要加4,也就是数据要从第5行开始填充
for (int j = 0; j < detail.length; j++) {
Map tempmap = (HashMap) dataList.get(i);
Object data = tempmap.get(detail[j]);
cell = row.createCell(j);
cell.setCellStyle(style2);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
CellUtil.setCellValue(cell, data);
}
}
String fileName = new String(sheetName.getBytes("gb2312"), "ISO8859-1");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
workbook.write(baos);
response.setContentType("application/x-download;charset=utf-8");
response.addHeader("Content-Disposition", "attachment;filename="
+ fileName + ".xls");
OutputStream os = response.getOutputStream();
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
byte[] b = new byte[1024];
while ((bais.read(b)) > 0) {
os.write(b);
}
bais.close();
os.flush();
os.close();
}
CellUtil类:
package org.base.util;
import java.math.BigDecimal;
import java.sql.Date;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.regex.Pattern;
import org.apache.poi.hssf.usermodel.HSSFCell;
public class CellUtil {
public static String returnCellValue(HSSFCell cell){
String cellvalue = "";
if (null != cell) {
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_NUMERIC: // 数字
return String.valueOf(cell.getNumericCellValue()).trim();
case HSSFCell.CELL_TYPE_STRING: // 字符串
return String.valueOf(cell.getStringCellValue()).trim();
case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
return String.valueOf(cell.getBooleanCellValue()).trim();
case HSSFCell.CELL_TYPE_FORMULA: // 公式
return String.valueOf(cell.getCellFormula()).trim();
case HSSFCell.CELL_TYPE_BLANK: // 空值
return "";
case HSSFCell.CELL_TYPE_ERROR: // 故障
return "";
default:
return "";
}
} else {
}
return cellvalue;
}
//避免cell.setCellValue(checkOrderQmSave.getSellOrderNo())中参数为空就会报错
public static void setCellValue(HSSFCell cell, Object object){
if(object == null){
cell.setCellValue("");
}else{
if (object instanceof String) {
cell.setCellValue(String.valueOf(object));
}else if(object instanceof Long){
Long temp = (Long)object;
String cellvalue = new DecimalFormat("#0.00").format(temp.doubleValue());
cell.setCellValue(cellvalue);
}else if(object instanceof Double){
Double temp = (Double)object;
String cellvalue = new DecimalFormat("#0.00").format(temp.doubleValue());
cell.setCellValue(cellvalue);
}else if(object instanceof Float){
Float temp = (Float)object;
String cellvalue = new DecimalFormat("#0.00").format(temp.doubleValue());
cell.setCellValue(cellvalue);
}else if(object instanceof Integer){
Integer temp = (Integer)object;
cell.setCellValue(temp.intValue());
}else if(object instanceof BigDecimal){
BigDecimal temp = (BigDecimal)object;
String cellvalue = new DecimalFormat("#0.00").format(temp.doubleValue());
cell.setCellValue(cellvalue);
}else{
cell.setCellValue("");
}
}
}
public static void setCellValue(HSSFCell cell, Object object, String model){
if(object == null){
cell.setCellValue("");
}else{
if (object instanceof String) {
cell.setCellValue(String.valueOf(object));
}else if(object instanceof Long){
Long temp = (Long)object;
String cellvalue = new DecimalFormat("#0.00").format(temp.doubleValue());
cell.setCellValue(cellvalue);
}else if(object instanceof Double){
Double temp = (Double)object;
String cellvalue = new DecimalFormat("#0.00").format(temp.doubleValue());
cell.setCellValue(cellvalue);
}else if(object instanceof Float){
Float temp = (Float)object;
String cellvalue = new DecimalFormat("#0.00").format(temp.doubleValue());
cell.setCellValue(cellvalue);
}else if(object instanceof Integer){
Integer temp = (Integer)object;
cell.setCellValue(temp.intValue());
}else if(object instanceof BigDecimal){
BigDecimal temp = (BigDecimal)object;
String cellvalue = new DecimalFormat("#0.00").format(temp.doubleValue());
cell.setCellValue(cellvalue);
}else if(object instanceof java.sql.Date){
cell.setCellValue(new SimpleDateFormat(model).format(object));
}else if(object instanceof java.util.Date){
cell.setCellValue(new SimpleDateFormat(model).format(object));
}else{
cell.setCellValue("");
}
}
}
public static void setCellValue(HSSFCell cell, String object){
if(object == null){
cell.setCellValue("");
}else{
cell.setCellValue(object);
}
}
public static void setCellValue(HSSFCell cell, Long object){
if(object == null){
cell.setCellValue("");
}else{
cell.setCellValue(object.doubleValue());
}
}
public static void setCellValue(HSSFCell cell, Double object){
if(object == null){
cell.setCellValue("");
}else{
cell.setCellValue(object.doubleValue());
}
}
public static void setCellValue(HSSFCell cell, double object){
cell.setCellValue(object);
}
public static void setCellValue(HSSFCell cell, Date object, String model){
if(object == null){
cell.setCellValue("");
}else{
cell.setCellValue(new SimpleDateFormat(model).format(object));
}
}
public static void setCellValue(HSSFCell cell, java.util.Date object, String model){
if(object == null){
cell.setCellValue("");
}else{
cell.setCellValue(new SimpleDateFormat(model).format(object));
}
}
public static void setCellValue(HSSFCell cell, BigDecimal object){
if(object == null){
cell.setCellValue("");
}else{
cell.setCellValue(object.toString());
}
}
//判断EXCEL表格高度用 row.setHeight((short) CellUtil.getExcelCellAutoHeight(TAR_VAL_ALL_STRING, 280, 30));
public static float getExcelCellAutoHeight(String str,float defaultRowHeight, int fontCountInline) {
int defaultCount = 0;
for (int i = 0; i < str.length(); i++) {
int ff = getregex(str.substring(i, i + 1));
defaultCount = defaultCount + ff;
}
if (defaultCount > fontCountInline){
return ((int) (defaultCount / fontCountInline) + 1) * defaultRowHeight;//计算
} else {
return defaultRowHeight;
}
}
public static int getregex(String charStr) {
if("".equals(charStr) || charStr == null){
return 1;
}
// 判断是否为字母或字符
if (Pattern.compile("^[A-Za-z0-9]+$").matcher(charStr).matches()) {
return 1;
}
// 判断是否为全角
if (Pattern.compile("[\u4e00-\u9fa5]+$").matcher(charStr).matches()) {
return 2;
}
//全角符号 及中文
if (Pattern.compile("[^x00-xff]").matcher(charStr).matches()) {
return 2;
}
return 1;
}
}
poi导出Excel报表多表头双层表头、合并单元格相关推荐
- poi导出excel,行相同数据自动合并单元格
/***excel行自动合并*listData 待导出数据*/ public void test(SXSSFSheet sheet,List<FanManagerExt> listData ...
- Web中的EasyExcel导出Excel(不创建对象且自定义合并单元格策略)
Web中的EasyExcel导出Excel(不创建对象且自定义合并单元格策略) 适用于多张表(只查单表数据就用创建对象那种方法) Controller @RequestMapping(value = ...
- java通过poi生成excel表格(自适应列宽、合并单元格后的边框添加)
具体java通过POI读写Excel的基本使用方法可参考: POI读写Excel的基本使用 1.项目导入依赖: <!--xls--> <dependency><group ...
- java excel 边框_【web开发】☆★之利用POI操作Excel表格系列教程【9】单元格边框处理...
[web开发]☆★之利用POI操作Excel表格系列教程[9]单元格边框处理 package csg.xiaoye.poidemo; import java.io.FileOutputStream; ...
- Excel如何将数据复制到合并单元格中
今天跟大家分享一下Excel如何将数据复制到合并单元格中 1.如下图我们想要将数据复制到合并单元格中 2.选择要复制的单元格区域 3.单击下图选项 4.单击[复制粘贴],[复制到合并区域] 5.在[粘 ...
- 在Excel表格中如何快速拆分合并单元格
在Excel表格中如何快速拆分合并单元格 目录 在Excel表格中如何快速拆分合并单元格 1.例如:将销售人列中的合并单元格拆分还原 2.选中销售人姓名,点击[开始]选项卡中[合并居中] 3.再点击[ ...
- 信创办公–基于WPS的EXCEL最佳实践系列 (处理合并单元格)
信创办公–基于WPS的EXCEL最佳实践系列 (处理合并单元格) 目录 应用背景 相关知识 操作步骤 1.合并单元格对排序的影响 2.取消合并单元格并自动填充内容 应用背景 在Excle表格中,对于相 ...
- 复杂的POI导出Excel表格(多行表头、合并单元格)
poi导出excel有两种方式: 第一种:从无到有的创建整个excel,通过HSSFWorkbook,HSSFSheet HSSFCell, 等对象一步一步的创建出工作簿,sheet,和单元格,并添加 ...
- Java和poi导出excel报表
一:poi jar下载地址:点击打开链接: 二:工程截图: 三:运行效果截图: 四:源代码: Student.java: package com.poi.bean;import java.util.D ...
最新文章
- JavaScript中Promises/A+规范的实现
- Teamcenter 开发中的一些问题
- 连接显示器与计算机主机的接口电路是,液晶显示器VGA模拟输入接口电路
- 鼠标右键快速连接wifi
- CCF201412-1 门禁系统(100分)【序列处理】
- 红帽企业版Linux 6安装指南(中文)
- elementui的表格在使用v-if之后列的顺序错乱问题
- 小程序下载到手机后的目录。
- Android下载自带开源图标库教程
- 广义线性模型python
- TensorFlow之saved_model使用笔记
- C语言编程入门——综合练习(一)
- Lake Counting
- android改微信号码,安卓版微信更新,已支持修改微信号
- 数据治理分析项目最佳实践
- redis缓存失效时间设为多少_Redis缓存过期失效机制
- iphone下拉菜单卡住了_苹果手机怎么下拉菜单 苹果x右上角下拉失灵怎么办
- STA基础分析-setup和hold
- 站长百科访谈第59期:张清分享网站优化技巧
- 2020年4月区块链安全大事件 | 黑客攻击早已蓄谋已久