数据导出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();
        }
    }
}

导出结果:

原文地址:https://www.cnblogs.com/new-life/p/10840394.html

时间: 2024-09-29 05:16:35

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

C#导出Excel动态列

一.用StreamWrite流对象,导出Excel 1. string _sPath = GenerateSalaryMonthlyReport(dgvSalarySum); System.Diagnostics.Process.Start(_sPath); 2. public String GenerateSalaryMonthlyReport(DataGridView dgvData) { String _sPath = String.Format(@".\{0}.txt", Ba

大量数据导出excel(csv)的实现

<?php /** * 大量数据导出excel(csv)的实现. * Created by PhpStorm. * User: Huming * Date: 2017-04-16 * Time: 14:04 * */ //使用MS sqlserver数据测试的 require_once 'MSSqlServerHelper.php'; $sqlHelper = new MSSqlServerHelper(); set_time_limit(0); ini_set('memory_limit',

框架 day50 BOS项目 4 批量导入(ocupload插件,pinyin4J)/POI解析Excel/Combobox下拉框/分区组合条件分页查询(ajax)/分区数据导出(Excel)

知识点: 批量导入(ocupload插件,pinyin4J /POI解析Excel(apache POI) /区域分页查询 /Combobox下拉框 /分区组合条件分页查询(ajax) /分区数据导出(Excel下载) BOS项目笔记第4天 1.    区域批量导入功能 *Ajax不支持文件上传. *上传并且不刷新上传页面原理: Target到一个0,0,0的隐藏iframe里,造成一个没有刷新的假象 <form target="myIframe" action="ab

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

在上篇文章中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅仅简单的读取office中的数据.尤其是在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.而数据导出的格式一般是EXCEL或者PDF .所以今天我们来简单看一下利用Apache  POI实现数据库中数据导出excel报表.在java中有很多实现数据导出excel报表的第三方jar包.但在比较了一下感觉还是POI相对来

.net解决数据导出excel时的格式问题

在项目中一般都需要将报表数据导出到EXCEL中,但经常出现导出长串数据(如身份证)到EXCEL中后显示为科学计数法的格式,或者报表中显示为001的数据导出到Excel后成了1的格式. 下面简单介绍一下以上问题的解决方法: 1.首先,了解一下excel从web页面上导出的原理.当我们把这些数据发送到客户端时,我们想让客户端程序(浏览器)以excel的格式读 取它,所以把mime类型设为:application/vnd.ms-excel,当excel读取文件时会以每个cell的格式呈现数据,如果 c

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

好多人在问:如何将百度地图里面搜索到的公司商家电话导出表格?怎样将把百度地图里面搜索到的公司 电话 地址 等数据导出excel里? 现在,很多人都在网络上找商家,联系业务. 百度地图里有很多的商家联系方式地址等数据,这便成为很多人的便捷方式.但是一个个地复制出来商家的电话,地址是一件很痛苦的事情, 于是想到开发一个程序,模拟人的操作,将所有的数据提取保存到EXCEL里. 交流学习QQ:3125547039 主要代码思路: m_objConnection.Open();             b

npoi实现数据导出Excel

npoi .NET第三方的Office功能组件. 链接地址 http://npoi.codeplex.com/ 引用命名空间 using NPOI.HSSF.UserModel; using NPOI.HPSF; using NPOI.POIFS.FileSystem; using NPOI.SS.UserModel; 功能代码 /// <summary> /// 操作EXCEL导出数据报表的类 /// </summary> public class DataToExcel { /

C#将网页数据导出Excel时编码设置

1 public void DGToExcel() 2 { 3 Response.ClearContent(); 4 Response.Charset = "GB2312";//内容编码 5 Response.ContentType = "application/ms-excel"; 6 Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");//内容编码 7 R

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

近期由于项目需要,需要将页面中的表格数据导出excel格式的文件,折腾了许久,在网上各种百度,虽然资料不少,但是大都不全,踩了许多坑,总算是皇天不负有心人,最后圆满解决了. 1.安装相关依赖(npm安装可能会出现某些错误,可以使用cnpm): npm install file-saver --save // 保存文件用 npm install xlsx --save // 转二进制用 npm install script-loader --save-dev // xlsx核心文件 2.下载两个核

项目中生成器应用,解决量级数据导出excel内存溢出

应用场景:全量数据导出excel 遇到问题: PHP Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 41007872 bytes) 很明显是内存溢出. 网上给出了很多治标不治本的解决方案: 1.直接修改PHP.INImemory_limit = xxxx M ;2.修改.htaccessphp_value memory_limit xxx M3.直接在程序页面上修改.ini_set(