Vue + ElementUI - table 表格数据导出excel文件

Vue + ElementUi- table 表格数据导出excel文件
  1. 安装依赖

    // (不推荐) 不指定版本信息安装依赖, 使用时可能会出现XLSX undefined
    // npm install  xlsx --save
    // npm install  file-saver --save
    
    // 推荐使用
    npm install  xlsx@^0.16.9 --save
    npm install  file-saver@^2.0.5 --save
    
    // 卸载本地xlsx
    // npm uninstall xlsx
    
  2. 引入组件

    方式一: 局部引入

    // 在需要导出excel的地方引入组件
    import XLSX from 'xlsx'
    import FileSaver from "file-saver"
    

    方式二: 全局引入

    // mian.js 文件中
    import FileSaver from 'file-saver'
    import XLSX from 'xlsx'
      
    Vue.prototype.$FileSaver = FileSaver; //设置全局
    Vue.prototype.$XLSX = XLSX; //设置全局
    
  3. 给table添加一个id属性

    <el-button @click="exportResult">导出</el-button>
    
    <!-- 根据实际需求回显数据 -->
    <el-table
         id="resultTable"
         :data="studentList">
        <el-table-column
                  type="index"
                  width="50"
                  label="序号">
        </el-table-column>
        <el-table-column
                  prop="talkScore"
                  label="讨论">
        </el-table-column>
    </el-table>
    
  4. 定义导出方法

    /**
     * 导出excel
     * 局部引入: 方法中使用 XLSX FileSaver
     * 全局引入: 方法中的 XLSX FileSaver 替换成 $XLSX $FileSaver
     * 
     * 当前方法中使用的是局部引入
     */
    exportResult() {
          var xlsxParam = { raw: true } // 导出的内容只做解析,不进行格式转换
          /* 从表生成工作簿对象 */
          const table_book = XLSX.utils.table_to_book(document.getElementById("resultTable"), xlsxParam);
          /* 获取二进制字符串作为输出 */
          var table_write = XLSX.write(table_book, {
            bookType: "xlsx",
            bookSST: true,
            type: "array",
          });
          try {
            FileSaver.saveAs(
                // Blob 对象表示一个不可变、原始数据的类文件对象。
                // Blob 表示的不一定是JavaScript原生格式的数据。
                // File 接口基于Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。
                // 返回一个新创建的 Blob 对象,其内容由参数中给定的数组串联组成。
                new Blob([table_write], { type: "application/octet-stream" }),
                // 设置导出文件名称
                "resultSummary.xlsx"
            );
          } catch (e) {
            if (typeof console !== "undefined") console.log(e, table_write);
          }
          return table_write;
        },	
    
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于您的问题,以下是前后端详细的步骤和代码: 前端代码:使用VueElementUI实现 1. 首先在Vue组件中定义你的表格,要注意的是要使用el-table-column组件定义每一列的数据和显示方式,其中prop属性表示对应的数据字段,label属性表示列名,使用v-model绑定selection数组来记录选中的行: ```html <el-table :data="tableData" v-loading="tableLoading" @selection-change="handleSelectionChange" @sort-change="handleSortChange" style="width: 100%"> <el-table-column type="selection" width="55"></el-table-column> <el-table-column :prop="'id'" label="ID" sortable="custom" width="80"></el-table-column> <el-table-column :prop="'name'" label="姓名" sortable="custom" width="100"></el-table-column> <el-table-column :prop="'age'" label="年龄" sortable="custom" width="80"></el-table-column> <el-table-column :prop="'gender'" label="性别" sortable="custom" width="80"> <template slot-scope="scope"> <span>{{scope.row.gender == 1 ? '男' : '女'}}</span> </template> </el-table-column> <el-table-column :prop="'address'" label="地址"></el-table-column> </el-table> ``` 2. 在模板中添加一个按钮,点击后调用导出方法: ```html <el-button type="primary" @click="handleExport">导出</el-button> ``` 3. 在Vue实例中定义导出方法,首先获取选中行的id数组(selection),然后使用axios发送POST请求到后端,传递ids参数作为选中行id数组,以及fields参数作为要导出的字段数组。注意在请求头中设置Content-Type为application/json,以及Response-Type为arraybuffer,以便正常接收Excel文件流: ```javascript handleExport() { var ids = this.selection.map(item => item.id) var fields = ['id', 'name', 'age', 'gender', 'address'] axios({ method: 'post', url: '/export', data: { ids: ids, fields: fields }, responseType: 'arraybuffer', headers: { 'Content-Type': 'application/json' } }).then(response => { const blob = new Blob([response.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8' }) const fileName = 'export.xlsx' FileSaver.saveAs(blob, fileName) }).catch(e => { this.$message.error('导出失败') }) } ``` 后端代码:使用Spring Boot和Mybatis-Plus实现 1. 首先创建一个实体类,表示数据库中的一行记录,使用Mybatis-Plus的@TableField注解表示对应的字段,以及@TableId注解表示主键: ```java import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class User { @TableId(value = "id", type = IdType.AUTO) private Integer id; @TableField("name") private String name; @TableField("age") private Integer age; @TableField("gender") private Integer gender; @TableField("address") private String address; } ``` 2. 创建一个Mapper接口,继承Mybatis-Plus的BaseMapper接口,用于对User表进行操作,其中的selectExportList方法返回要导出数据列表,使用@Param注解传递ids和fields参数: ```java import org.apache.ibatis.annotations.Param; import java.util.List; public interface UserMapper extends BaseMapper<User> { List<User> selectExportList(@Param("ids") List<Integer> ids, @Param("fields") List<String> fields); } ``` 3. 创建一个Controller类,用于处理导出请求,使用@RequestBody接收前端传递过来的ids和fields参数,然后调用UserMapper的selectExportList方法获取要导出数据列表,最后使用EasyPoi进行Excel导出: ```java import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; import cn.afterturn.easypoi.excel.export.styler.IExcelExportStyler; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; @RestController public class ExportController { @Autowired private UserMapper userMapper; @RequestMapping("/export") public void export(@RequestBody ExportRequest request, HttpServletResponse response) throws IOException { List<User> userList = userMapper.selectExportList(request.getIds(), request.getFields()); ExportParams params = new ExportParams(null, "用户信息", ExcelType.XSSF); Workbook workbook = ExcelExportUtil.exportExcel(params, User.class, userList); String fileName = "export.xlsx"; response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8")); workbook.write(response.getOutputStream()); workbook.close(); } } class ExportRequest { private List<Integer> ids; private List<String> fields; // getter, setter, toString省略 } ``` 至此,您可以开始使用以上代码实现您的需求了,希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值