前端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;
最终下载效果。
相关推荐
紫洋葱hh4 分钟前
Go 入门基础:类型、变量与运算符
开发语言·后端·ai·golang
随性而行3607 分钟前
企业微信API接口开发实战:如何实现消息回调接收与业务事件处理?
java·前端·python·微信·机器人·企业微信
美味蛋炒饭.9 分钟前
java八股面试(3)
java·开发语言·面试
言乐611 分钟前
Python于LOLM针对伊泽瑞尔的数据分析
开发语言·python·机器学习·数据分析·pandas
IT研究室12 分钟前
最新计算机毕业设计选题推荐-基于spring boot的美食配送平台-网站-文档指导-Java-springboot
java·spring boot·课程设计
霸道流氓气质29 分钟前
Saga模式入门与实战:编排与协同模式、补偿设计原则与Java生产级实现
java·开发语言
江湖有缘34 分钟前
Docker实战 | 使用Docker部署Readeck书签管理工具
java·docker·eureka
小毛驴85038 分钟前
mvn help:effective-settings 与 mvn help:effective-pom
java·linux·前端
silvamux_1 小时前
OpenAI Python SDK v1 迁移实战
开发语言·python
silvamux_1 小时前
MiniMax API 调用教程:兼容 OpenAI 写法
java·数据库·elasticsearch