首页 > 其他分享 >15、HSSFWorkbook实现动态指定字段导出

15、HSSFWorkbook实现动态指定字段导出

时间:2023-09-04 18:24:24浏览次数:33  
标签:java String 导出 org HSSFWorkbook nf result import 15

一、自定义注解标记对象属性:

1、声明注解:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String name() default "";
}

2、注解标记:

import lombok.Data;

@Data
public class ResponseVO {

    @MyAnnotation(name = "UUID")
    private String uuid;

    @MyAnnotation(name = "姓名")
    private String name;

    @MyAnnotation(name = "状态")
    private String status;

    @MyAnnotation(name = "类型")
    private String type;

}

 

二、动态指定字段导出:

1、相关依赖:

    <!--POI相关依赖-->
    <dependency>
       <groupId>org.apache.poi</groupId>
       <artifactId>poi-ooxml</artifactId>
       <version>4.1.2</version>
    </dependency>

2、通用动态字段导出工具类:

import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.SpreadsheetVersion;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.*;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.Date;
import java.util.List;

@Slf4j
public class ExportUtil {

    /**
     * 在调用generateResponseEntity(...)前调用此方法可扩充Excel格式大小,最大扩充长度为整数长度
     *
     * 解决:java.lang.IllegalArgumentException: The maximum column width for an individual cell is 255 characters
     *
     * 局限:当单元格数据大于限制任然会抛出异常,可以对单元格数据进行切割加列或加行处理
     * */
    public static void resetCellMaxTextLength() {
        SpreadsheetVersion excel2007 = SpreadsheetVersion.EXCEL2007;
        if (Integer.MAX_VALUE != excel2007.getMaxTextLength()) {
            Field field;
            try {
                field = excel2007.getClass().getDeclaredField("_maxTextLength");
                field.setAccessible(true);
                field.set(excel2007,Integer.MAX_VALUE);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * @Param data 数据列表
     * @param title  表格的名字
     * @param fieldNames 导出的字段名(前端传字段名 转成 中文描述)
     * @param classzz   列表相应实体类
     */
    public static ResponseEntity<byte[]> generateResponseEntity(List<?> data, String title,
                                                                String[] fieldNames, Class classzz) {
        //写数据
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        headers.setContentDispositionFormData("attachment", "attachment.xlsx");
        byte[] bytes = new byte[]{};
        try {
            log.info("开始导出数据");
            bytes = getDownloadeExcel(title, fieldNames, data, classzz);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return  new ResponseEntity<>(bytes, headers, HttpStatus.CREATED);
    }

    private static byte[] getDownloadeExcel(String title, String[] heards, List<?> list, Class classzz) throws Exception {
        //单元格大小
        Integer max = 32700;
        // 创建excel工作薄
        XSSFWorkbook workbook = new XSSFWorkbook();
        // 创建excel表
        XSSFSheet sheet = workbook.createSheet(title);
        // 创建标题行
        XSSFRow titleRow = sheet.createRow(0);
        // 标题行, 从0行开始,写标题内容
        for (int i = 0; i < heards.length; i++) {
            String s = heards[i];
            XSSFCell cell = titleRow.createCell(i);
            //利用自定义注解方式获取获取本类中指定的属性对象信息
            Field declaredField = classzz.getDeclaredField(s);
            MyAnnotation annotation = declaredField.getAnnotation(MyAnnotation.class);
            //列名
            cell.setCellValue(annotation.name());
        }
        // 数据行,从1行开始,共list.size行
        for (int i = 1; i <= list.size(); i++) {
            // 创建行
            XSSFRow listRow = sheet.createRow(i);
            // 数据列,单元格从0开始,共heards.length列
            for (int j = 0; j < heards.length; j++) {
                // 创建数据单元格
                XSSFCell listCell = listRow.createCell(j);
                // 通过反射的方式,将heards元素通过字符串拼接的方式,拼接出实体类相对应的get方法;
                String methodName = "get" + heards[j].substring(0, 1).toUpperCase() + heards[j].substring(1);
                try {
                    // 通过反射拿到类对象,再获取类对象的额methodName这个方法
                    Method declaredMethod = classzz.getDeclaredMethod(methodName, null);
                    // 通过invoke提交对象,执行declaredMethod这个方法
                    // 从List<Student>集合中取出list.get(i - 1)的methodName属性的值;
                    Object result = declaredMethod.invoke(list.get(i - 1));
                    //判断返回值的类型
                    if (result instanceof Date) {
                        //填写日期格式内容
                        XSSFDataFormat dataFormat = workbook.createDataFormat();
                        short format = dataFormat.getFormat("yyyy-MM-dd");
                        XSSFCellStyle cellStyle = workbook.createCellStyle();
                        cellStyle.setAlignment(HorizontalAlignment.CENTER);
                        cellStyle.setDataFormat(format);
                        listCell.setCellStyle(cellStyle);
                    } else if (result instanceof Double){
                        NumberFormat nf = NumberFormat.getInstance();
                        //保留小数位2位
                        nf.setMaximumFractionDigits(2);
                        //是否保留千分位
                        nf.setGroupingUsed(true);
                        listCell.setCellValue(nf.format(result));
                    }else if(result instanceof BigDecimal){
                        NumberFormat nf = NumberFormat.getInstance();
                        //保留小数位2位
                        nf.setMaximumFractionDigits(2);
                        //是否保留千分位
                        nf.setGroupingUsed(true);
                        listCell.setCellValue(nf.format(result));
//                    }else if (result instanceof String){
//                        //以下解决:java.lang.IllegalArgumentException: The maximum column width for an individual cell is 255 characters
//                        //自动扩格,(适用最后一列)
//                        if(result.toString() == null || result.toString().length() < max){
//                            //设置内容
//                            listCell.setCellValue(result == null ? "" : result.toString());
//                        }else {
//                            int b = 0;
//                            int num = result.toString().length() / max;
//                            for (int a = 0; a < num; a++) {
//                                XSSFCell addCell = listRow.createCell(j+a);
//                                addCell.setCellValue(result.toString().substring(a * max, max * (a + 1)));
//                                b++;
//                            }
//                            int extra = result.toString().length() % max;
//                            if (extra > 0) {
//                                XSSFCell addCell = listRow.createCell(j+b);
//                                addCell.setCellValue(result.toString().substring(b * max, b * max + extra));
//                            }
//                        }
                    }else {
                        //设置内容
                        listCell.setCellValue(result == null ? "" : result.toString());
                    }
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                }
            }
        }
        return getNewBytes(workbook);
    }

    private static byte[] getNewBytes(Workbook wb) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            wb.write(baos);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            baos.close();
        }
        return baos.toByteArray();
    }
}

3、应用:

 

标签:java,String,导出,org,HSSFWorkbook,nf,result,import,15
From: https://www.cnblogs.com/Iven-L/p/17677774.html

相关文章

  • ARC153
    ARC153A直接枚举所有的美丽数即可#include<bits/stdc++.h>usingnamespacestd;vector<int>V;signedmain(){//freopen("date.in","r",stdin);//freopen("date.out","w",stdout);for(inti1=1;i1<=9;i1++......
  • [CF1599A] Weights
    题目描述Youaregivenanarray$A$oflength$N$weightsofmasses$A_1$,$A_2$...$A_N$.Notwoweightshavethesamemass.Youcanputeveryweightononesideofthebalance(leftorright).Youdon'thavetoputweightsinorder$A_1$......
  • 泛微E-cology FileDownloadForOutDoc SQL注入漏洞(CVE-2023-15672)
    漏洞简介泛微e-cology未对用户的输入进行有效的过滤,直接将其拼接进了SQL查询语句中,导致系统出现SQL注入漏洞。远程未授权攻击者可利用此漏洞获取敏感信息,进一步利用可能获取目标系统权限等。影响版本Ecology9.x补丁版本<10.58.0;Ecology8.x补丁版本<10.58.0漏洞复现fo......
  • 15 个最佳 3D 建模软件工具
    15个最佳3D建模软件工具正在寻找一种工具来为您的项目制作3D建模工具吗?从头学习three.Js或者Babylon.js路线太陡峭又枯燥,可能令人望而生畏,但这里有一系列工具可以帮助您快速上手,让你愉快感受3d的魅力!Tinkercadhttps://www.tinkercad.com/—免费、基于网络、简单且直观......
  • 2023年超爆火的15款AI设计软件
    随着人工智能技术的快速发展,数字插画之外的“泛设计”行业的从业者也开始在AI中逐渐受益。可能很多设计师还停留在“AI设计软件只能做一些动漫风格插画”的认知中,实际上受到行业需求提升的刺激,软件厂商已经开始积极研究并发布更多针对特定行业和场景的软件产品。接下来的文章中,我们......
  • uniapp小程序隐私协议弹窗组件。自2023年9月15日起,对于涉及处理用户个人信息的小程序
    上代码 隐私组件代码直接复制就能用 <template> <viewclass="zero-privacy":class="[{'zero-bottom':position=='bottom'}]"v-if="showPrivacy"> <viewclass="zero-privacy-container":style="{&#......
  • 1.15 自实现GetProcAddress
    在正常情况下,要想使用GetProcAddress函数,需要首先调用LoadLibraryA函数获取到kernel32.dll动态链接库的内存地址,接着在调用GetProcAddress函数时传入模块基址以及模块中函数名即可动态获取到特定函数的内存地址,但在有时这个函数会被保护起来,导致我们无法直接调用该函数获取到特定函......
  • 1.15 自实现GetProcAddress
    在正常情况下,要想使用GetProcAddress函数,需要首先调用LoadLibraryA函数获取到kernel32.dll动态链接库的内存地址,接着在调用GetProcAddress函数时传入模块基址以及模块中函数名即可动态获取到特定函数的内存地址,但在有时这个函数会被保护起来,导致我们无法直接调用该函数获取到特定......
  • S7-1500PLC仿真连接KEPSeverEx 6
    S7-1500PLC仿真连接KEPSeverEx6准备TIAPortalV15.1S7-PLCSIMAdvancedV3.0KEPServerEX6Configuration博途自带的S7-PLCSIM貌似只能博途内部通讯(有待考证),无法直接连接Kepsever,也有通过NetToPLCsim软件(免费)间接连接的方案,本文介绍S7-PLCSIMAdvanced直接连接KEPServe......
  • AMD锐龙7 7800X3D网游专项测试:竟比i9-13900KS强了15%
    一、前言:锐龙77800X3D网游测试补全近期大火的游戏《博德之门3》在仅仅发一周之后,同时在线玩家数量就超过了百万,不过很多小伙伴可能会发现游戏里经常会莫名的卡顿,特别是在人多的城市或者营地卡顿更加严重。之所以会出现这样的情况,主要原因是你的系统内存带宽不足,严重影响了CPU的......