今天碰到一个需求,要求将用户回答的问卷及问题导出Excel表格,问卷对应的问题数量不一致,需要动态添加列表头,简单记录。

要导出Excel需要添加poi.jar包

用户-问卷实体(固定列):

package com.lwl.bean;

import com.util.annotation.BeanField;
import lombok.Data; import java.sql.Timestamp;
import java.util.List; /**
* 问卷实体(用于导出excel)
* @author linwenli
*/
@Data
public class HyMktUserQuesBean { @BeanField("用户名")
private String wechatName;
@BeanField("联系电话")
private String telephone;
@BeanField("主题名称")
private String questionName;
@BeanField("参与时间")
private Timestamp createTime;
@BeanField("问题内容")
private List<HyMktUserQuesAnswerBean> hyMktUserQuesAnswerBeans;
}

用户-问卷问题实体(动态列):

package com.lwl.bean;

import com.util.annotation.BeanField;
import lombok.Data; /**
* 问题及用户答案
* @author linwenli
*/
@Data
public class HyMktUserQuesAnswerBean {
@BeanField("问题名称")
private String problemName;
@BeanField("答案")
private String optionName;
}

导出方法:

package com.lwl.util;

import com.lwl.bean.HyMktUserQuesAnswerBean;
import com.lwl.bean.HyMktUserQuesBean;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.*; import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List; public class ExcelUtil { /**
* 根据List<HyMktUserQuesBean> 导出数据到Excel
* @author linwenli
* @date 2019/5/09 15:27
* @param response
* @param fileName
* @param hyMktUserQuesBeans
* @throws IOException
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
public static void writeExcel(HttpServletResponse response, String fileName, List<HyMktUserQuesBean> hyMktUserQuesBeans) throws IOException, IllegalArgumentException, IllegalAccessException { HSSFWorkbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet(); // 数据表头开始行
CellStyle style = wb.createCellStyle();
Font font = wb.createFont();
font.setFontName("宋体");
// 设置字体大小
font.setFontHeightInPoints((short) 12);
// 加粗
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
// 设置背景色
style.setFillForegroundColor(HSSFColor.LIME.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
// 让单元格居中
style.setAlignment(HSSFCellStyle.SOLID_FOREGROUND);
// 左右居中
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 上下居中
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
style.setWrapText(true);//设置自动换行
style.setFont(font); // 添加表数据
// 取出列表中问卷问题最多的对象做动态表头
HyMktUserQuesBean problemMax = null;
int maxSize = 0;
for (int n = 0; n < hyMktUserQuesBeans.size(); n++) {
HyMktUserQuesBean hyMktUserQuesBean = hyMktUserQuesBeans.get(n);
// 记录最大问题个数
if (hyMktUserQuesBean.getHyMktUserQuesAnswerBeans().size() > maxSize) {
maxSize = hyMktUserQuesBean.getHyMktUserQuesAnswerBeans().size();
problemMax = hyMktUserQuesBean;
}
int index = 0;
// 写excel数据
for (int i = 1; i < hyMktUserQuesBean.getHyMktUserQuesAnswerBeans().size(); i++) {
// 第零行为表头行,不填充数据
Row row = sheet.createRow(n + 1);
// 用户名
Cell firstCell = row.createCell(index);
firstCell.setCellType(Cell.CELL_TYPE_STRING);
firstCell.setCellValue(hyMktUserQuesBean.getWechatName());
sheet.autoSizeColumn((short) index++);// 设置单元格自适应
// 联系电话
Cell secondCell = row.createCell(index);
secondCell.setCellType(Cell.CELL_TYPE_STRING);
secondCell.setCellValue(hyMktUserQuesBean.getTelephone());
sheet.autoSizeColumn((short) index++);// 设置单元格自适应
// 主题名称
Cell thirdCell = row.createCell(index);
thirdCell.setCellType(Cell.CELL_TYPE_STRING);
thirdCell.setCellValue(hyMktUserQuesBean.getQuestionName());
sheet.autoSizeColumn((short) index++);// 设置单元格自适应
// 参与时间
Cell forthCell = row.createCell(index);
forthCell.setCellType(Cell.CELL_TYPE_STRING);
forthCell.setCellValue(DateUtil.translateDate(hyMktUserQuesBean.getCreateTime().getTime()));
sheet.autoSizeColumn((short) index++);// 设置单元格自适应
// 动态表头
List<HyMktUserQuesAnswerBean> hyMktUserQuesAnswerBeans = hyMktUserQuesBean.getHyMktUserQuesAnswerBeans();
for(int k = 0; k < hyMktUserQuesAnswerBeans.size(); k++ ){
// 问题
Cell otherOneCell = row.createCell(index);
otherOneCell.setCellType(Cell.CELL_TYPE_STRING);
otherOneCell.setCellValue(hyMktUserQuesAnswerBeans.get(k).getProblemName());
sheet.autoSizeColumn((short) index++);// 设置单元格自适应
// 答案
Cell otherTwoCell = row.createCell(index);
otherTwoCell.setCellType(Cell.CELL_TYPE_STRING);
otherTwoCell.setCellValue(hyMktUserQuesAnswerBeans.get(k).getOptionName());
sheet.autoSizeColumn((short) index++);// 设置单元格自适应
}
}
}
//添加表头
Row row = sheet.createRow(0);
int index = 0;
// 用户名
Cell indexCell = row.createCell(index);
indexCell.setCellType(Cell.CELL_TYPE_STRING);
indexCell.setCellStyle(style);//设置表头样式
indexCell.setCellValue("用户名");
sheet.autoSizeColumn((short) index++);// 设置单元格自适应
// 联系电话
Cell indexCell2 = row.createCell(index);
indexCell2.setCellType(Cell.CELL_TYPE_STRING);
indexCell2.setCellStyle(style);//设置表头样式
indexCell2.setCellValue("联系电话");
sheet.autoSizeColumn((short) index++);// 设置单元格自适应
// 主题名称
Cell indexCell3 = row.createCell(index);
indexCell3.setCellType(Cell.CELL_TYPE_STRING);
indexCell3.setCellStyle(style);//设置表头样式
indexCell3.setCellValue("主题名称");
sheet.autoSizeColumn((short) index++);// 设置单元格自适应
// 参与时间
Cell indexCell4 = row.createCell(index);
indexCell4.setCellType(Cell.CELL_TYPE_STRING);
indexCell4.setCellStyle(style);//设置表头样式
indexCell4.setCellValue("参与时间");
sheet.autoSizeColumn((short) index++);// 设置单元格自适应
for(int j = 0; j < problemMax.getHyMktUserQuesAnswerBeans().size(); j++ ){
// 问题
Cell otherOneCell = row.createCell(index);
otherOneCell.setCellType(Cell.CELL_TYPE_STRING);
otherOneCell.setCellStyle(style);//设置表头样式
otherOneCell.setCellValue("问题" + (j + 1));
sheet.autoSizeColumn((short) index++);// 设置单元格自适应
// 答案
Cell otherTwoCell = row.createCell(index);
otherTwoCell.setCellType(Cell.CELL_TYPE_STRING);
otherTwoCell.setCellStyle(style);//设置表头样式
otherTwoCell.setCellValue("问题" + (j + 1) + "答案");
sheet.autoSizeColumn((short) index++);// 设置单元格自适应
}
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename=\"" + new String(fileName.getBytes("gb2312"), "ISO8859-1") + ".xls" + "\"");
OutputStream ouputStream = null;
try {
ouputStream = response.getOutputStream();
wb.write(ouputStream);
} finally {
ouputStream.close();
}
}
}

导出结果:

数据导出Excel,动态列的更多相关文章

  1. C#导出Excel动态列

    一.用StreamWrite流对象,导出Excel 1. string _sPath = GenerateSalaryMonthlyReport(dgvSalarySum); System.Diagn ...

  2. Java使用POI实现数据导出excel报表

    Java使用POI实现数据导出excel报表 在上篇文章中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅 ...

  3. Saiku导出excel指标列无线条以及0与空值显示问题(三十二)

    Saiku导出excel指标列无线条以及0与空值显示问题 描述: 数据库中字段值为0 ,与数据库中字段值为 null 时 ,saiku会将为0 以及为 null 的数据都不展示出来,但是我们其实希望数 ...

  4. 百度地图里面搜索到的公司商家电话导出表格?怎样将把百度地图里面搜索到的公司 电话 地址 等数据导出excel里?

    好多人在问:如何将百度地图里面搜索到的公司商家电话导出表格?怎样将把百度地图里面搜索到的公司 电话 地址 等数据导出excel里? 现在,很多人都在网络上找商家,联系业务. 百度地图里有很多的商家联系 ...

  5. 【asp.net】将GridView数据导出Excel

    概要: 中午睡了一会,醒来的时候看到老师叫我去办公室,需求是这样的,把excel表中的每个同学,判断图片目录中是否有对应的照片(图片的名字用的学号或身份证号码) 没有对应图片的学生记录,存入自己的数据 ...

  6. JavaScript 上万条数据 导出Excel文件(改装版)

    最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var  ...

  7. JavaScript 上万条数据 导出Excel文件 页面卡死

    最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var  ...

  8. 将页面中表格数据导出excel格式的文件(vue)

    近期由于项目需要,需要将页面中的表格数据导出excel格式的文件,折腾了许久,在网上各种百度,虽然资料不少,但是大都不全,踩了许多坑,总算是皇天不负有心人,最后圆满解决了. 1.安装相关依赖(npm安 ...

  9. yii2 数据导出 excel导出以及导出数据时列超过26列时解决办法

    作者:白狼 出处:http://www.manks.top/article/yii2_excel_extension​ 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给 ...

随机推荐

  1. 史上最详细最全的Linux上安装Oracle的教程-centos7

    一.安装Oracle前准备 1.创建运行oracle数据库的系统用户和用户组 [humf@localhost ~]$ su root #切换到root Password: [root@localhos ...

  2. SQL 初级教程学习(二)

    1.SQL 语句从 "Websites" 表中选取头两条记录: SELECT * FROM Websites LIMIT 2; SELECT TOP 50 PERCENT * FR ...

  3. 进击的Python【第九章】:paramiko模块、线程与进程、各种线程锁、queue队列、生产者消费者模型

    一.paramiko模块 他是什么东西? paramiko模块是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 先来个实例: import param ...

  4. 447 Number of Boomerangs 回旋镖的数量

    给定平面上 n 对不同的点,“回旋镖” 是由点表示的元组 (i, j, k) ,其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺序).找到所有回旋镖的数量.你可以假设 n ...

  5. 安卓(Android)关于 RecyclerView 不能填充满宽度

    RecyclerView 不能填充满屏幕宽度 RecyclerView 的 Adapter 在使用是,一定要 @Overridepublic RecyclerView.ViewHolder onCre ...

  6. mysql 的 case when then 用法 和null 的判断

    表:一个表 aa 有两个字段 id 和 sex ,第1条记录的sex 为空串  ('')  第二条记录的sex 为空  (null) 1. 用法: 第一种: select (case 字段名  whe ...

  7. VMware虚拟机下载与安装

    VMware下载与安装 一.虚拟机的下载 1.进入VMware官网,点击左侧导航栏中的下载,再点击图中标记的Workstation Pro,如下图所示. 2.根据操作系统选择合适的产品,在这里以Win ...

  8. Vue全局添加组件或者模块

    import Api from './api.js' export default { install (Vue) { Vue.prototype.$Api = Api } } 这种格式就可以在mai ...

  9. Python_高阶函数、装饰器(decorator)

    一.变量: Python支持多种数据类型,在计算机内部,可以把任何数据都看成一个“对象”,而变量就是在程序中用来指向这些数据对象的,对变量赋值就是把数据和变量给关联起来. 对变量赋值x = y是把变量 ...

  10. STL中unique的使用

    作用 unique函数可以删除有序数组中的重复元素,即去重(并不是真正的删除,后面会讲) 定义在头文件<algorithm>中 函数原型 1.只有两个参数,且参数类型都是迭代器: iter ...