数据导出Excel,动态列
今天碰到一个需求,要求将用户回答的问卷及问题导出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,动态列的更多相关文章
- C#导出Excel动态列
一.用StreamWrite流对象,导出Excel 1. string _sPath = GenerateSalaryMonthlyReport(dgvSalarySum); System.Diagn ...
- Java使用POI实现数据导出excel报表
Java使用POI实现数据导出excel报表 在上篇文章中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅 ...
- Saiku导出excel指标列无线条以及0与空值显示问题(三十二)
Saiku导出excel指标列无线条以及0与空值显示问题 描述: 数据库中字段值为0 ,与数据库中字段值为 null 时 ,saiku会将为0 以及为 null 的数据都不展示出来,但是我们其实希望数 ...
- 百度地图里面搜索到的公司商家电话导出表格?怎样将把百度地图里面搜索到的公司 电话 地址 等数据导出excel里?
好多人在问:如何将百度地图里面搜索到的公司商家电话导出表格?怎样将把百度地图里面搜索到的公司 电话 地址 等数据导出excel里? 现在,很多人都在网络上找商家,联系业务. 百度地图里有很多的商家联系 ...
- 【asp.net】将GridView数据导出Excel
概要: 中午睡了一会,醒来的时候看到老师叫我去办公室,需求是这样的,把excel表中的每个同学,判断图片目录中是否有对应的照片(图片的名字用的学号或身份证号码) 没有对应图片的学生记录,存入自己的数据 ...
- JavaScript 上万条数据 导出Excel文件(改装版)
最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var ...
- JavaScript 上万条数据 导出Excel文件 页面卡死
最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var ...
- 将页面中表格数据导出excel格式的文件(vue)
近期由于项目需要,需要将页面中的表格数据导出excel格式的文件,折腾了许久,在网上各种百度,虽然资料不少,但是大都不全,踩了许多坑,总算是皇天不负有心人,最后圆满解决了. 1.安装相关依赖(npm安 ...
- yii2 数据导出 excel导出以及导出数据时列超过26列时解决办法
作者:白狼 出处:http://www.manks.top/article/yii2_excel_extension 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给 ...
随机推荐
- python模拟登录的实现
本文主要用python实现了对网站的模拟登录.通过自己构造post数据来用Python实现登录过程. 当你要模拟登录一个网站时,首先要搞清楚网站的登录处理细节(发了什么样的数据,给谁发等...). ...
- 组合游戏 - SG函数和SG定理
在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念: P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败. N点:必胜点 ...
- 应用交付、负载均衡(Load balancing)、高可用、F5
“应用交付”,实际上就是指应用交付网络(Application Delivery Networking,简称ADN),它利用相应的网络优化/加速设备,确保用户的业务应用能够快速.安全.可靠地交付给内部 ...
- 链表中用标兵结点简化代码 分类: c/c++ 2014-09-29 23:10 475人阅读 评论(0) 收藏
标兵结点(头结点)是在链表中的第一个结点,不存放数据,仅仅是个标记 利用标兵结点可以简化代码.下面实现双向链表中的按值删除元素的函数,分别实现 带标兵结点和不带标兵结点两版本,对比可见标兵结点的好处. ...
- Css 基本的规则写法
样式表的写法: css的语法由一些标志构成,就是一个基本的样式表由选择器,属性和属性值构成.Css有标准的写法规则标准的css写法: h1 { Font-family:黑体;} h1:表示选择符Fon ...
- 微信小程序flex布局
一.flex布局基础 二.相对定位和绝对定位 flex的容器和元素 主轴(左-右),交叉轴(上-下) flex容器属性详解 flex-direction 决定元素的排列方向(默认row ...
- [ SDOI 2010 ] 古代猪文
\(\\\) Description 一句话题意: 设 \(x=\sum_{d|n} C_n^d\),求 \(G^x\pmod {999911659}\) . 从原题面大段语文中其实不难推出所求. \ ...
- vuetifyjs简介及其使用
何为 vuetify 一个vue ui库,提供vue组件供使用.根据 Google Material Design 指南实现(https://material.io/).Vuetify支持SSR(服务 ...
- Android拍照得到全尺寸图片并进行压缩/拍照或者图库选择 压缩后 图片 上传
http://www.jb51.net/article/77223.htm https://www.cnblogs.com/breeze1988/p/4019510.html
- Android 更新方案实现
需求说明 为了保证自己 APP 的新版本使用率,现在有很多已有的“软件更新”框架供各位使用,本文的主要内容是如何自己动手来实现软件的后台下载,更新. 下面详细说明下软件更新的逻辑,流程图如下: 每步详 ...