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

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

后端下载实现

  依赖 pom.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代码
/**
     * 下载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代码,用于设置导出时的列映射显示名称关系

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;
        }



}

 完整下载工具类代码
/**
 * 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前端页下载调用按钮
   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 完整下载工具类
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;
最终下载效果。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qyhua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值