java导出动态excel表单----表头和内容都为动态

数据表

CREATE TABLE `f_form` (
  `id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `org_id` bigint(32) DEFAULT NULL COMMENT '机构id',
  `title` varchar(255) DEFAULT NULL COMMENT '表单标题',
  `state` int(1) DEFAULT NULL COMMENT '状态(0待开始1收集中2已结束)',
  `founder` varchar(255) DEFAULT NULL COMMENT '创建人',
  `description` text COMMENT '表单介绍',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '修改时间',
  `start_Time` datetime DEFAULT NULL COMMENT '开始时间',
  `end_Time` datetime DEFAULT NULL COMMENT '结束时间',
  `del` int(1) DEFAULT NULL COMMENT '删除(0未删除1已删除)',
  `vp` int(11) DEFAULT NULL COMMENT '表单浏览量vp',
  `url` varchar(255) DEFAULT NULL COMMENT '表单地址',
  `copy_count` int(11) DEFAULT NULL COMMENT '复制数',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=120 DEFAULT CHARSET=utf8 COMMENT='表单表';
CREATE TABLE `f_form_flied_config` (
  `id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `form_id` bigint(32) DEFAULT NULL COMMENT '表单id',
  `org_id` bigint(32) DEFAULT NULL COMMENT '机构id',
  `type` int(11) DEFAULT NULL COMMENT 'type (0,默认字段1,单行文本框配置 2多行文本框配置3下拉列表配置4多选项配置5单选项配置6文件图片7日期)',
  `data_name` varchar(255) DEFAULT NULL COMMENT '数据库字段名',
  `show_name` varchar(255) DEFAULT NULL COMMENT '展示字段名',
  `default_name` varchar(255) DEFAULT NULL COMMENT '默认字段名',
  `is_required` int(11) DEFAULT NULL COMMENT '是否必填(0:必填,1:非必填)',
  `is_only` int(11) DEFAULT NULL COMMENT 'type=1,0(0 唯一,1 不唯一)',
  `prompt_massage` varchar(255) DEFAULT NULL COMMENT '提示信息',
  `sort` int(11) DEFAULT NULL COMMENT '排序',
  `perset1` int(11) DEFAULT NULL COMMENT '待定义',
  `perset2` varchar(1000) DEFAULT NULL COMMENT 'type=3:下拉列表内容 ;type=4:多选项内容;type=5:单选项内容',
  `perset3` varchar(255) DEFAULT NULL COMMENT '待定义',
  `perset4` varchar(255) DEFAULT NULL COMMENT '待定义',
  PRIMARY KEY (`id`),
  KEY `FK_Reference_25` (`form_id`) USING BTREE,
  CONSTRAINT `FK_Reference_25` FOREIGN KEY (`form_id`) REFERENCES `f_form` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=334 DEFAULT CHARSET=utf8 COMMENT='表单字段配置表';
CREATE TABLE `f_form_data` (
  `id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `form_id` bigint(32) DEFAULT NULL COMMENT '表单id',
  `org_id` bigint(32) DEFAULT NULL COMMENT '机构id',
  `commit_time` datetime DEFAULT NULL COMMENT '提交时间',
  `name` varchar(255) DEFAULT NULL COMMENT '姓名',
  `email` varchar(255) DEFAULT NULL COMMENT '邮箱',
  `mobile` varchar(255) DEFAULT NULL COMMENT '手机号',
  `sex` varchar(255) DEFAULT NULL COMMENT '性别',
  `birthday` varchar(255) DEFAULT NULL COMMENT '出生日期',
  `id_card` varchar(255) DEFAULT NULL COMMENT '身份证',
  `addr` varchar(255) DEFAULT NULL COMMENT '地址',
  `xing_zuo` varchar(255) DEFAULT NULL COMMENT '星座',
  `leader` varchar(255) DEFAULT NULL COMMENT '负责人',
  `another_mobile` varchar(255) DEFAULT NULL COMMENT '备用手机号',
  `another_email` varchar(255) DEFAULT NULL COMMENT '备用邮箱',
  `position` varchar(255) DEFAULT NULL COMMENT '职务',
  `department` varchar(255) DEFAULT NULL COMMENT '部门',
  `zhifubao_code` varchar(255) DEFAULT NULL COMMENT '支付宝账号',
  `qq_code` varchar(255) DEFAULT NULL COMMENT 'qq',
  `weixin` varchar(255) DEFAULT NULL COMMENT '微信号',
  `weibo_code` varchar(255) DEFAULT NULL COMMENT '微博',
  `taobao_code` varchar(255) DEFAULT NULL COMMENT '淘宝账号',
  `contacts_description` varchar(255) DEFAULT NULL COMMENT '描述',
  `company_name` varchar(255) DEFAULT NULL COMMENT '机构名称',
  `address` varchar(255) DEFAULT NULL COMMENT '机构地址',
  `fax` varchar(255) DEFAULT NULL COMMENT '传真',
  `work_phone` varchar(255) DEFAULT NULL COMMENT '单位电话',
  `zip_code` varchar(255) DEFAULT NULL COMMENT '邮编',
  `url` varchar(255) DEFAULT NULL COMMENT 'url',
  `companyContact_person` varchar(255) DEFAULT NULL COMMENT '机构联系人',
  `company_description` varchar(255) DEFAULT NULL COMMENT '机构描述',
  `filed1` varchar(255) DEFAULT NULL COMMENT '扩展字段1',
  `filed2` varchar(255) DEFAULT NULL COMMENT '扩展字段1',
  `filed3` varchar(255) DEFAULT NULL COMMENT '扩展字段1',
  `filed4` varchar(255) DEFAULT NULL COMMENT '扩展字段1',
  `filed5` varchar(255) DEFAULT NULL COMMENT '扩展字段1',
  `filed6` varchar(255) DEFAULT NULL COMMENT '扩展字段1',
  `filed7` varchar(255) DEFAULT NULL COMMENT '扩展字段1',
  `filed8` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '扩展字段1',
  `filed9` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '扩展字段1',
  `filed10` varchar(255) DEFAULT NULL COMMENT '扩展字段1',
  `filed11` varchar(255) DEFAULT NULL COMMENT '扩展字段1',
  `filed12` varchar(255) DEFAULT NULL COMMENT '扩展字段1',
  `filed13` varchar(255) DEFAULT NULL COMMENT '扩展字段1',
  `filed14` varchar(255) DEFAULT NULL COMMENT '扩展字段1',
  `filed15` varchar(255) DEFAULT NULL COMMENT '扩展字段1',
  PRIMARY KEY (`id`),
  KEY `FK_Reference_24` (`form_id`),
  CONSTRAINT `FK_Reference_24` FOREIGN KEY (`form_id`) REFERENCES `f_form` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=229 DEFAULT CHARSET=utf8 COMMENT='表单字段表';

/**

  • 动态导出工具类
    */
public class ExportExcel {

    /**
     * 
     * 
     * @param fileName 文件名
     * @param headers 表格属性列名数组
     * @param dataset 需要显示的数据集合
     * @param pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
     * @throws IOException
     */
    @SuppressWarnings("deprecation")
    public static HSSFWorkbook exportExcel(HttpServletRequest request, HttpServletResponse response, String fileName,
            String[] headers, List<Object[]> dataset, String pattern) throws IOException {
        // 设置请求
        response.setHeader("Content-disposition",
                "attachment;filename=" + URLEncoder.encode(fileName + ".xls", "UTF-8"));
        response.setContentType("application/msexcel;charset=UTF-8");
        // 创建一个工作薄
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 生成一个表格
        HSSFSheet sheet = workbook.createSheet("表单导出");
        // 产生表格标题行
        HSSFRow row = sheet.createRow(0);
        for (short i = 0; i < headers.length; i++) {
            HSSFCell cell = row.createCell(i);
            HSSFRichTextString text = new HSSFRichTextString(headers[i]);
            cell.setCellValue(text);
        }
        // 遍历集合数据,产生数据行
        Iterator<Object[]> it = dataset.iterator();
        int index = 0;
        while (it.hasNext()) {
            index++;
            // 从第1行开始创建
            row = sheet.createRow(index);
            Object[] obj = (Object[]) it.next();
            for (short i = 0; i < obj.length; i++) {
                HSSFCell cell = row.createCell(i);
                Object value = obj[i];
                String textValue = null;
                if (!"".equals(value) && value != null) {
                    if (value instanceof Integer) {
                        int intValue = (Integer) value;
                        cell.setCellValue(intValue);
                    } else if (value instanceof Float) {
                        float fValue = (Float) value;
                        cell.setCellValue(fValue);
                    } else if (value instanceof Double) {
                        double dValue = (Double) value;
                        cell.setCellValue(dValue);
                    } else if (value instanceof Long) {
                        long longValue = (Long) value;
                        cell.setCellValue(longValue);
                    } else if (value instanceof Date) {
                        Date date = (Date) value;
                        if (null == pattern || pattern.equals("")) {
                            pattern = "yyyy-MM-dd";
                        }
                        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
                        textValue = sdf.format(date);
                        cell.setCellValue(textValue);
                    } else {
                        // 其它数据类型都当作字符串简单处理
                        textValue = value.toString();
                        // 设置单元格的值
                        cell.setCellValue(textValue);
                    }
                } else {
                    cell.setCellValue("");
                }
            }
        }
        // 让列宽随着导出的列长自动适应
        for (int colNum = 0; colNum < headers.length; colNum++) {
            int columnWidth = sheet.getColumnWidth(colNum) / 256;
            for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
                HSSFRow currentRow;
                // 当前行未被使用过
                if (sheet.getRow(rowNum) == null) {
                    currentRow = sheet.createRow(rowNum);
                } else {
                    currentRow = sheet.getRow(rowNum);
                }
                if (currentRow.getCell(colNum) != null) {
                    HSSFCell currentCell = currentRow.getCell(colNum);
                    if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
                        int length = currentCell.getStringCellValue() != null
                                ? currentCell.getStringCellValue().getBytes().length : 10;
                        if (columnWidth < length) {
                            columnWidth = length;
                        }
                    }
                }
            }
            if (colNum == 0) {
                sheet.setColumnWidth(colNum, (columnWidth - 2) * 256);
            } else {
                sheet.setColumnWidth(colNum, (columnWidth + 4) * 256);
            }
        }
        OutputStream outputStream = response.getOutputStream();// 打开流
        workbook.write(outputStream);// HSSFWorkbook写入流
        workbook.close();// HSSFWorkbook关闭
        outputStream.flush();// 刷新流
        outputStream.close();// 关闭流
        return workbook;
    }
}

/**
* 表单导出
*
* @param response
* @param export
* @param request
*/

@RequestMapping("****")
public void exportExcel(HttpServletRequest request, HttpServletResponse response) {
    try {
        Map<String, Object> paramMap = RequestUtils.convertRequestToMap(request);
        //表单id
        Long formId = getLong(paramMap, "formId");
        // 条件
        String condition = getString(paramMap, "condition");
        // 表头
        ArrayList<String> excelHeader = new ArrayList<String>();
        //根据表单id查出表头
        List<Map<String, Object>> list1 = fFormService.findFFromFliedConfig(formId);
        for (Map<String, Object> map : list1) {
            String showName = map.get("showName").toString();
            excelHeader.add(showName);
        }
        String[] arrString = (String[]) excelHeader.toArray(new String[excelHeader.size()]);
        // 对应表单数据
        List<Map<String, Object>> fromDataList = fFormService.findFFormData1(formId, condition);
        List<Object[]> dataList = new ArrayList<Object[]>();
        ArrayList<String> datal = null;
        for (Map<String, Object> map : fromDataList) {
            datal = new ArrayList<String>();
            for (Map<String, Object> map1 : list1) {
                String dataName = map1.get("dataName").toString();
                String data = map.get(dataName).toString();
                datal.add(data);
            }
            Object[] array = datal.toArray(new String[datal.size()]);
            dataList.add(array);
        }
        ExportExcel.exportExcel(request, response, "表单导出", arrString, dataList, "yyyy-MM-dd HH:mm :ss");
    } catch (Exception e) {
        e.printStackTrace();
    }  
  • 3
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
Java 导出 Excel 时,动态表头的实现方式可以有很多种。 一种常见方式是,在导出 Excel 前就确定好表头内容,并且将表头内容存储在一个数组或者列表里。根据这个数组或列表,我们可以动态地设置 Excel表头。 另一种方式是,在导出 Excel 时根据数据动态生成表头。这通常需要对数据进行预处理或者整理,以确定 Excel 表头内容。 无论采用哪种方式,Java 导出 Excel 的核心思路是基于 POI 库。POI 是一个开源的 Java Excel API,它允许我们在 Java 应用程序中创建、读取和修改 Excel 文件。 具体实现时,可以使用 POI 提供的 XSSFWorkbook、Sheet 和 Row 等类和方法,来创建 Excel 表头和单元格,并填充数据。同时,还可以通过设置单元格和单元格样式,来实现格式控制和美化。 在其中一个实现方式中,代码大概会长这个样子: // 创建一个新的 Excel 工作簿 XSSFWorkbook workbook = new XSSFWorkbook(); // 创建一个新的 Sheet XSSFSheet sheet = workbook.createSheet("Sheet1"); // 创建表头内容数组 String[] headers = {"序号", "姓名", "年龄", "性别"}; // 创建表头行 XSSFRow headerRow = sheet.createRow(0); for (int i = 0; i < headers.length; i++) { // 创建单元格并设置表头内容 XSSFCell cell = headerRow.createCell(i); cell.setCellValue(headers[i]); // 设置单元格样式 XSSFCellStyle style = workbook.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); cell.setCellStyle(style); } // 填充数据 for (int i = 0; i < dataList.size(); i++) { // 创建数据行 XSSFRow dataRow = sheet.createRow(i + 1); // 获取数据对象 Data data = dataList.get(i); // 创建单元格并设置数据内容 XSSFCell cell0 = dataRow.createCell(0); cell0.setCellValue(data.getId()); XSSFCell cell1 = dataRow.createCell(1); cell1.setCellValue(data.getName()); XSSFCell cell2 = dataRow.createCell(2); cell2.setCellValue(data.getAge()); XSSFCell cell3 = dataRow.createCell(3); cell3.setCellValue(data.getSex()); // 设置单元格样式 XSSFCellStyle style = workbook.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); cell0.setCellStyle(style); cell1.setCellStyle(style); cell2.setCellStyle(style); cell3.setCellStyle(style); } // 将工作簿写入硬盘中 FileOutputStream outputStream = new FileOutputStream("data.xlsx"); workbook.write(outputStream); outputStream.close(); 总的来说,Java 导出 Excel 动态表头的实现方式多种多样,可以根据需求和场景来选择合适的方式。但无论采用哪种方式,核心思路都要基于 POI 库来进行操作。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值