通过easyexcel导出数据到excel表格

这篇文章简单介绍一下怎么通过easyexcel做数据的导出,使用之前easyui构建的歌曲列表crud应用,添加一个导出按钮,点击的时候直接连接后端接口地址,在后端的接口完成数据的导出功能。

前端页面完整代码

let editingId;
let requestUrl;
let base = "http://localhost:8083";
let pageList = [20, 50, 100, 500, 1000];

// 定义一个json对象保存歌曲数据
let data = {};

function addHandler() {
	requestUrl = "/song/insert";
	
	$.post(base + requestUrl, {
		name: "*****",
		singer: "*****",
		note: "*****"
	}, function () {
		$("#song_list").datagrid("reload");
	}, "json");
}

function editHandler() {
	let datagrid = $("#song_list");
	let row = datagrid.datagrid("getSelected");

	if (editingId != null && editingId != "") {
		datagrid.datagrid("selectRow", editingId);
	} else {
		if (row) {
			// 获取行索引,这个索引从0开始
			let rowIndex = datagrid.datagrid("getRowIndex", row);
			
			editingId = rowIndex;
			requestUrl = "/song/updateById";

			datagrid.datagrid("beginEdit", rowIndex);
		}
	}
}

function saveHandler() {
	if (editingId) {
		// 只有结束编辑才能获取到最新的值
		$("#song_list").datagrid("endEdit", editingId);
	
		$.post(base + requestUrl, data, function (res) {
			$.messager.show({
				title: '系统消息',
				timeout: 5000,
				showType: 'slide',
				msg: res.message,
			});
			
			editingId = "";
		}, "json");
	}
}

function cancelHandler() {
	// editingId != null条件防止刷新页面带来的问题
	if (editingId != null && editingId !== "") {
		$("#song_list").datagrid("cancelEdit", editingId);
	
		editingId = "";
	}
}

function exportHandler() {
	location.href = base + "/song/export";
}

function deleteHandler() {
	let rowData = $("#song_list").datagrid("getSelected");
	
	if (rowData) {
		$.messager.confirm("提示", "删除后数据无法恢复,是否确认删除?", function(bool) {
			if (bool) {
				$.get(base + "/song/deleteById/" + rowData.id, {}, function(res) {
					$.messager.show({
						title: '系统消息',
						timeout: 5000,
						showType: 'slide',
						msg: res.message,
					});
				
					$("#song_list").datagrid("reload");
				}, "json");
			}
		});
	} else {
		$.messager.alert("请选择要删除的数据!", "warning");
	}
}

$(document).ready(function() {
	let datagrid = $("#song_list").datagrid({
		url: base + "/song/selectByPage",
		title: "歌曲列表",
		height: 810,
		striped: true,
		fitColumns: true,
		singleSelect: true,
		pagination: true,
		remoteFilter: true,
		clientPaging: false,
		pageSize: pageList[0],
		pageList: pageList,
		loadFilter: function(res) {
			if (res.code == 200) {
				return res.data;
			} else {
				return null;
			}
		},
		onAfterEdit: function (rowIndex, rowData, changes) { // 结束行内编辑事件
			data = {
				id: rowData.id,
				name: changes.name ? changes.name : rowData.name,
				note: changes.note ? changes.note : rowData.note,
				singer: changes.singer ? changes.singer : rowData.singer
			};
		},
		toolbar: [{
			iconCls: 'icon-add',
			text: '添加',
			handler: function() {
				addHandler();
			}
		}, '-', {
			iconCls: 'icon-edit',
			text: '修改',
			handler: function() {
				editHandler();
			},
		}, "-", {
			iconCls: "icon-save",
			text: "保存",
			handler: function() {
				saveHandler();
			}
		}, "-", {
			iconCls: "icon-cancel",
			text: "取消",
			handler: function() {
				cancelHandler();
			}
		}, '-', {
			iconCls: 'icon-ok',
			text: '导出',
			handler: function() {
				exportHandler();
			}
		}, '-', {
			iconCls: 'icon-delete',
			text: '删除',
			handler: function() {
				deleteHandler();
			},
		}],
		columns: [[
			{field: 'id', title: 'id', width: 200},
			{field: 'name', title: 'name', width: 200, editor: "textbox"},
			{field: 'singer', title: 'singer', width: 200, editor: "textbox"},
			{field: 'note', title: 'note', width: 200, editor: "textbox"},
			{field: 'lastUpdateTime', title: 'lastUpdateTime', width: 200},
		]]
	});
	
	datagrid.datagrid('enableFilter', [{
		field: 'name',
		type: 'textbox',
		op: ['equal', 'contains']
	}, {
		field: 'singer',
		type: 'textbox',
		op: ['equal', 'contains'],
	}, {
		field: 'note',
		type: 'textbox',
		op: ['equal', 'contains']
	}]);

});

添加依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.3.2</version>
</dependency>

修改实体类,添加列注解

package com.example.springboot.entity;

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * 歌曲
 * @author heyunlin
 * @version 1.0
 */
@Data
@TableName("song")
public class Song implements Serializable {
    private static final long serialVersionUID = 18L;

    @ExcelIgnore
    @TableId(type = IdType.INPUT)
    private String id;

    /**
     * 歌曲名
     */
    @ExcelProperty("歌曲名")
    private String name;

    /**
     * 歌手
     */
    @ExcelProperty("歌手")
    private String singer;

    /**
     * 描述信息
     */
    @ExcelProperty("描述信息")
    private String note;

    /**
     * 最后一次修改时间
     */
    @TableField("last_update_time")
    @ExcelProperty("最后一次修改时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime lastUpdateTime;
}

参考官网的案例代码,完成后端controller接口具体代码实现

package com.example.springboot.service.impl;

import com.alibaba.excel.EasyExcel;
import com.example.springboot.entity.Song;
import com.example.springboot.mapper.SongMapper;
import com.example.springboot.restful.JsonResult;
import com.example.springboot.service.SongService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * @author heyunlin
 * @version 1.0
 */
@Service
public class SongServiceImpl implements SongService {

    private final SongMapper songMapper;

    @Autowired
    public SongServiceImpl(SongMapper songMapper) {
        this.songMapper = songMapper;
    }

    // 其他代码...

    @Override
    public void export(HttpServletResponse response) {
        String fileName = "song.xlsx";

        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName);
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

        try {
            List<Song> songs = songMapper.selectList(null);

            EasyExcel.write(response.getOutputStream(), Song.class).sheet("歌曲列表").doWrite(songs);
        } catch (Exception e) {
            e.printStackTrace();

            response.reset();
            response.setContentType("application/json;charset=utf-8");
            JsonResult<Void> jsonResult = JsonResult.success("数据导出异常");

            try {
                response.getWriter().write(jsonResult.toString());
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
        }
    }

}

代码已经同步到后端项目的springbooot-crud1.0分支,可按需获取~

springboot+mybatis实现简单的增删查改案例项目icon-default.png?t=N7T8https://gitee.com/he-yunlin/springboot-crud.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/135410.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Matplotlib绘图一网打尽【持续更新ing】

2 绘制扇形图 绘制一个展示男女乘客比例的扇形图 得出男女的具体数字 sex_per df["Sex"].value_counts() sex_per # 把画图的包导入进来 import matplotlib.pyplot as plt# 这种绘图方式主要用于有多个子图以及复杂的图形布局的时候。fig,ax plt.subplots()# pl…

Ubuntu虚拟机设置静态IP

目录 1 确定网络信息2 配置网络文件3 更新配置4 验证 网上很多方案都是 sudo vi /etc/network/interfaces 但是在Ubuntu20.04中我的目录i已经没有这个文件夹了&#xff0c;好像就算自己新建通过这种方式也是不能达到静态ip的目的。整理了下面的这种方式&#xff0c;实测最终有效…

第25章_索引优化与查询优化

文章目录 1. 数据准备2.索引失效案例2.1全值匹配2.2最佳左前缀法则2.3主键插入顺序2.4 计算、函数导致索引失效2.5 类型转换导致索引失效2.6 范围条件右边的列索引失效2.7 不等于(! 或者<>)索引失效2.8 is null可以使用索引&#xff0c;is not null无法使用索引2.9 like以…

多孔对跨孔电磁波CT联合反演

多孔对跨孔电磁波CT联合反演 前言 针对单一孔对跨孔电磁波CT反演数据拼接剖面不连续&#xff0c;相邻钻孔间吸收系数差异大的问题&#xff0c;采用多孔对跨孔电磁波CT联合反演。 1、多孔对数据拼接 将所有单一剖面连接为多孔剖面&#xff0c;以‘东大北大’的原则编号。 …

Linux基础开发工具之分布式版本控制系统Git

文章目录 1.Git是什么&#xff1f;1.1介绍1.2影响世界的大牛1.3English Words 2.Git常用指令2.1Git三板斧2.2解决冲突2.3黑名单文件2.4删除本地远端 1.Git是什么&#xff1f; 1.1介绍 史上最浅显易懂的Git教程&#xff01; git是一个软件 gitee/github是一个网站但是他们的主…

微信小程序入门及开发准备,申请测试号以及小程序开发的两种方式,目录结构说明

目录 1. 介绍 1.1 优点 1.2 开发方式 2. 开发准备 2.1 申请 2.2 申请测试号 2.2 小程序开发的两种方式 2.3 开发工具 3. 开发一个demo 3.1 创建项目 3.2 配置 3.3 常用框架 3.3 目录结构说明 3.4 新建组件 1. 介绍 1.1 优点 是一种不需要下载安装即可使用的应用…

Linux-Docker的基础命令和部署code-server

1.安装docker 1.安装需要的安装包 yum install -y yum-utils2.设置镜像仓库 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo3.安装docker yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin do…

PyQt制作【小红书图片抓取】神器

文章目录 &#x1f4e2;闲言碎语&#x1f43e;窗口设计&#x1f43e;功能设计&#x1f4da;资源领取 &#x1f4e2;闲言碎语 最近写一个系统&#xff0c;被一个Bug折腾了两天&#xff0c;至今还未解决。由于解决Bug弄得我有点心力憔悴&#xff0c;于是想着写其他小项目玩玩&am…

Python 使用OS模块调用 cmd

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 在os模块中提供了两种调用 cmd 的方法&#xff0c;os.popen() 和 os.system() os.system(cmd) 是在执行command命令时需要打开一个终端&#xff0c;并且无法保存command命令的执行结果。 os.popen(cmd,mode) 打开一个与comma…

JuCheap开发的微信小程序商城(NetCore商城)

一、目的 最近工作需要&#xff0c;在学习微信小程序的开发&#xff0c;用周末空闲时间开发了一个微信小程序商城。 二、功能 2.1 管理后台 管理后台是基于JuCheap开发的&#xff0c;使用Net6Vue3ElementPlus开发&#xff0c;具体功能包含如下&#xff1a; 2.1.1 店铺模块…

环形链表解析(c语言)c语言版本!自我解析(看了必会)

目录 1.判断一个表是否是环形链表&#xff01; 代码如下 解析如下 2.快指针的步数和慢指针的步数有什么影响&#xff08;无图解析&#xff09; 3.怎么找到环形链表的入环点 代码如下 解析如下 1.判断一个表是否是环形链表&#xff01; 代码如下 bool hasCycle(struct L…

[ARM入门]ARM模式及其切换、异常

ARM技术特征 ARM处理器有如下特点 体积小、功耗低、成本低、性能高支持Thumb&#xff08;16位&#xff09;/ARM&#xff08;32位&#xff09;双指令集&#xff0c;能很好地兼容8位/16位器件大量使用寄存器&#xff0c;指令执行速度更快大多数数据操作都在寄存器中完成寻址方式…

【Java】Java8 Function 和 Consumer 接口的使用场景

文章目录 前言1. Function 示例2. Function 介绍3. Consumer 示例4. Consumer 介绍5. Function 和 Consumer 接口的使用场景后记 前言 在 《精通Java8》一书中有讲过 Java8的函数式接口可以简化设计模式的实施&#xff0c;这里记录一下Function 和 Consumer 的使用场景。 1. …

Docker从零开始学习,及常用命令大全(附带代码讲解)

Docker从零开始&#xff0c;及常用命令大全&#xff08;附带代码讲解&#xff09; docker是一种开源的应用容器引擎&#xff0c;可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的Linux机器上&#xff0c;也可以实现虚拟化。…

【集简云调度影刀RPA】

集简云调度影刀 集简云的http请求&#xff0c;都是用webhook。 1、获取token的时候&#xff0c;在url中必须这么填&#xff0c;在数据或者headers里面填写keyID和密码不管用。 2.调起应用的时候&#xff0c;需要选择webhook中的post&#xff0c;自定义的请求&#xff0c;才能…

二叉树的遍历(先序,中序,后序,层序)

目录 1.先序遍历1.代码实现 2.中序遍历1.代码实现 3.后序遍历1.代码实现 4.遍历算法的应用5.层序遍历1.算法思想2.代码实现 6.由遍历序列构造二叉树 1.先序遍历 根左右。 1.代码实现 若二叉树为空&#xff0c;则什么也不做; 若二叉树非空: ①访问根结点; ②先序遍历左子树; ③先…

如何在Linux服务器上后台持久运行Gunicorn

如何在Linux服务器上后台持久运行Gunicorn **问题概述****解决方案一&#xff1a;使用nohup命令****解决方案二&#xff1a;使用systemd服务****创建systemd服务文件****修改systemd服务文件以使用虚拟环境**日志管理**激活并启动服务&#xff1a;**如何设置用户和组**确认用户…

FPGA高端项目:图像采集+GTX+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持

目录 1、前言免责声明本项目特点 2、相关方案推荐我这里已有的 GT 高速接口解决方案我这里已有的以太网方案 3、设计思路框架设计框图视频源选择OV5640摄像头配置及采集动态彩条视频数据组包GTX 全网最细解读GTX 基本结构GTX 发送和接收处理流程GTX 的参考时钟GTX 发送接口GTX …

在 WSL 上启用 NVIDIA CUDA

环境要求 Windows 11 或 Windows 10 版本 21H2特定版本的GPU驱动&#xff1a; 安装支持 NVIDIA CUDA 的 WSL 驱动程序&#xff1a; https://www.nvidia.com/download/index.aspx具体安装哪个版本&#xff0c;查阅&#xff1a;https://docs.nvidia.com/cuda/wsl-user-guide/in…
最新文章