前端vue后端java使用easyexcel框架下载表格xls数据工具类

一 使用alibaba开源的 easyexcel框架,后台只需一个工具类即可实现下载

后端下载实现

依赖 pom.xml
XML 复制代码
 <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.1.2</version>
        </dependency>


        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.0</version>
        </dependency>
后台JAVA代码
java 复制代码
/**
     * 下载xls数据
     * @param params
     * @param response
     * @throws IOException
     */
    @PostMapping("/exportData")
    public void exportData(@RequestBody String params, HttpServletResponse response) throws IOException {
        JSONObject query = JSONObject.parseObject(params);


        String beginTime = query.getString("beginDate");
        String endTime = query.getString("endDate");

        List<AliIotLog> resultList = new ArrayList<>();
        
        //查询业务数据列表  resultList 

        WebDownloadUtil.downloadXlsByList(response, resultList,LogExport.class,"xls");
    }

一个 java bean代码,用于设置导出时的列映射显示名称关系

java 复制代码
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import java.io.Serializable;
import java.time.LocalDateTime;


@ContentRowHeight(20)//注解用于指定某元素的内容行高度为20。
@HeadRowHeight(20)//注解用于指定某元素的表头行高度为20。
@ColumnWidth(30) //注解用于指定某元素的列宽度为30。
public class LogExport implements Serializable {

    private static final long serialVersionUID = 1L;

            /**
            * 设备协议内容
            */
            @ExcelProperty("接收报文")
            private String inHexStr;

            /**
            * 回复内容
            */
            @ExcelProperty("发送报文")
            private String outHexStr;

            /**
            * 地址或通道
            */
            @ExcelProperty("地址")
            private String addr;


            /**
            * 时间
            */
            @ExcelProperty("时间")
            private LocalDateTime ctime;



        public String getInHexStr() {
        return inHexStr;
        }

            public void setInHexStr(String inHexStr) {
        this.inHexStr = inHexStr;
        }
        public String getOutHexStr() {
        return outHexStr;
        }

            public void setOutHexStr(String outHexStr) {
        this.outHexStr = outHexStr;
        }
        public String getAddr() {
        return addr;
        }

            public void setAddr(String addr) {
        this.addr = addr;
        }

        public LocalDateTime getCtime() {
        return ctime;
        }

            public void setCtime(LocalDateTime ctime) {
        this.ctime = ctime;
        }



}
完整下载工具类代码
java 复制代码
/**
 * web 下载文件封装
 * @author hua
 * @date 2024-07-06 14:30
 */
public class WebDownloadUtil {


    /**
     * 下载文件
     * @param response
     * @param resultList 列表数据
     * @param clazz 类形
     * @param format 表格格式 xlx xlsx csv
     * @throws IOException
     */
    public static void downloadXlsByList(HttpServletResponse response, List resultList,Class clazz,String format) throws IOException {
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("content-disposition","attachment;filename=data_export.xls");//下载文件名称在前端vue页面处理

        ExcelTypeEnum excelTypeEnum = ExcelTypeEnum.CSV;

        if("xls".equals(format)){
            excelTypeEnum = ExcelTypeEnum.XLS;
        }else if("xlsx".equals(format)){
            excelTypeEnum = ExcelTypeEnum.XLSX;
        }


        ExcelWriterBuilder writeWork = EasyExcel.write(response.getOutputStream(),clazz  ).excelType(excelTypeEnum).registerConverter(new Converter<LocalDateTime>(){
            public String format = "yyyy-MM-dd HH:mm:ss";

            @Override
            public Class<LocalDateTime> supportJavaTypeKey() {
                return LocalDateTime.class;
            }

            @Override
            public CellDataTypeEnum supportExcelTypeKey() {
                return CellDataTypeEnum.STRING;
            }

            @Override
            public LocalDateTime convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
                return LocalDate.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern(format)).atStartOfDay();
            }

            @Override
            public WriteCellData<?> convertToExcelData(LocalDateTime localDateTime, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
                if(localDateTime==null){
                    return new WriteCellData<>("");
                }
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
                String format = formatter.format(localDateTime);
                return new WriteCellData(format);
            }

        });

        ExcelWriterSheetBuilder sheet = writeWork.sheet();
        sheet.doWrite(resultList);
    }
}

前端vue下载实现

vue前端页下载调用按钮
javascript 复制代码
   import webUtil from "@api/webUtil";


export default {
 
  name: 'sys_log',
  data () {
    return {
    queryBody:{},
    list:[],
}

methods: {
            exportExcel () {
                //单击下载
                console.log('query data',this.queryBody)
                let url='/xxx/xxx/xxxx';
                webUtil.downloadXls(url,this.queryBody,"导出数据")

            }
         }

}
vue 完整下载工具类
javascript 复制代码
import request from '@/plugins/request';

const webUtil= {

    downloadXls:function(url,data, fileNamePrefix){
            request({
                url: url,
                method: 'post',
                responseType: "blob",
                data
            }).then(data => {
                let blob = new Blob([data], {
                    type: 'application/x-msdownload;charset=UTF-8'
                });
                let fileName = fileNamePrefix + Date.parse(new Date()) + '.xls';
                if (window.navigator.msSaveOrOpenBlob) {
                    navigator.msSaveBlob(blob, fileName);
                } else {
                    let link = document.createElement('a');
                    link.href = window.URL.createObjectURL(blob);
                    link.download = fileName;
                    link.click();
                    window.URL.revokeObjectURL(link.href);
                }
            }).catch(error => {
                console.error('Error exporting and downloading data:', error);
            }));

    }


};
export default webUtil;
最终下载效果。
相关推荐
2301_7766816518 分钟前
【用「概率思维」重新理解生活】
开发语言·人工智能·自然语言处理
熊大如如44 分钟前
Java 反射
java·开发语言
猿来入此小猿1 小时前
基于SSM实现的健身房系统功能实现十六
java·毕业设计·ssm·毕业源码·免费学习·猿来入此·健身平台
ll7788111 小时前
C++学习之路,从0到精通的征途:继承
开发语言·数据结构·c++·学习·算法
我不想当小卡拉米2 小时前
【Linux】操作系统入门:冯诺依曼体系结构
linux·开发语言·网络·c++
teacher伟大光荣且正确2 小时前
Qt Creator 配置 Android 编译环境
android·开发语言·qt
炎芯随笔2 小时前
【C++】【设计模式】生产者-消费者模型
开发语言·c++·设计模式
goTsHgo2 小时前
Spring Boot 自动装配原理详解
java·spring boot
卑微的Coder2 小时前
JMeter同步定时器 模拟多用户并发访问场景
java·jmeter·压力测试
pjx9872 小时前
微服务的“导航系统”:使用Spring Cloud Eureka实现服务注册与发现
java·spring cloud·微服务·eureka