动态表头excel导出(java)

动态表头excel导出

1. 导入依赖并设置实体

  1. 首先配置poi版本相关的maven属性

    <properties>
    		<poi.version>4.1.2poi.version>
    properties>
    
  2. 配置文件中使用Apache poi,Alibaba-easyexcel相关的依赖。

    <dependency>
    			<groupId>com.alibaba</groupId>
    			<artifactId>easyexcel</artifactId>
    			<version>2.1.6</version>
    			<exclusions>
    				<exclusion>
    					<groupId>org.apache.poi</groupId>
    					<artifactId>poi</artifactId>
    				</exclusion>
    				<exclusion>
    					<groupId>org.apache.poi</groupId>
    					<artifactId>poi-ooxml</artifactId>
    				</exclusion>
    			</exclusions>
    		</dependency>
    		<dependency>
    			<groupId>org.apache.poi</groupId>
    			<artifactId>poi-ooxml</artifactId>
    			<version>${
           poi.version}</version>
    		</dependency>
    
  3. 动态读取的表单实体类内容

    @Builder
    @Data
    @TableName("t_form_template")
    public class FormTemplate {
           
    
            @TableId(type = IdType.AUTO)
            private Long id;
    		//表头名称
            private String formTitle;
    		//表名
            private String formName;
    		//是否可为空
            private Boolean isBlank;
    		//规定的数据类型
            private String dataType;
    		//规定的字段的长度
            private String dataNum;
        
            private String valueType;
    		//字段默认值
            private String defaultText;
    
            private String defaultPrompt;
    		//字段的排序
            private String formSort;
    
            private String remarks;
    
            @ApiModelProperty(value = "创建时间")
            @TableField(fill = FieldFill.INSERT)
            @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
            private LocalDateTime createTime;
    
            @TableField(exist=false)
            @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
            private LocalDateTime createTimeBegin;
            @TableField(exist=false)
            @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
            private LocalDateTime createTimeEnd;
    
    
            @ApiModelProperty(value = "更新时间")
            @TableField(fill = FieldFill.INSERT_UPDATE)
            @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
            private LocalDateTime updateTime;
    
    
    
    
    
    }
    
    

2. 建立Excel数据表格

	 //创建工作薄
    HSSFWorkbook workbook = new HSSFWorkbook();
    //创建用户工作表
    HSSFSheet sheet = workbook.createSheet("报名用户");
    //创建行
    HSSFRow rows = sheet.createRow(0);

3. 绑定动态数据

  1. 将动态生成的表头headList根据数据库读取的form_title表头字段进行绑定,将headList根据数据库数据生成文件流对象。
  	//动态添加的所有表头行构成一个集合headList
    List<List<String>> headList = new ArrayList<List<String>>();
    List<Map> mapList = formTemplateService.selectFormTitleBySignupId(signupId);
    // 第 n 行 的表头
    int j=0;
    for (Map map:mapList) {
     
        //创建列
        rows.createCell(j).setCellValue((String) map.get("form_title"));
        j++;
    }
    j=1;
    // 第 n 行的数据
    for (Map<String,Object> maps : mapLists) {
     
        HSSFRow rowss = sheet.createRow(j);
        int i=0;
        for (Map map:mapList) {
     
            //创建列
            rowss.createCell(i).setCellValue((String)maps.get(map.get("form_title")));
            i++;
        }
        j++;
    }

4. 设置写入的字节流对象的相关参数

  1. 控制文件流操作写入workBook工作簿。
  2. 规定输出字节流编码格式,设置内容属性
	//字节输出流
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    try {
     
        workbook.write(outputStream);
    } catch (IOException e) {
     
        e.printStackTrace();
    } finally {
     
        outputStream.close();
    }
    //http请求头
    HttpHeaders httpHeaders = new HttpHeaders();
    String name = meeting.getName()+".xls";
    String fileName = new String(name.getBytes("UTF-8"), "iso-8859-1");
	//设置内容属性
    httpHeaders.setContentDispositionFormData("attachment", fileName);
    httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    ResponseEntity<byte[]> filebyte = new ResponseEntity<byte[]>(outputStream.toByteArray(), httpHeaders, HttpStatus.CREATED);
    try {
     
        outputStream.close();
    } catch (IOException e) {
     
        e.printStackTrace();
    } finally {
     
        outputStream.close();
    }

你可能感兴趣的:(项目相关技术点整理,java,poi)