根据条件查询下载Excel表单(Java+Vue 及 Vue 两种方式)

目录

  • 前言
  • [1. 基本知识](#1. 基本知识)
  • [2. 纯前端导入导出(Vue)](#2. 纯前端导入导出(Vue))
  • [3. 前后端(Vue + Java)](#3. 前后端(Vue + Java))

前言

如果想要下载好看的Excel推荐阅读:

  1. 详细讲解Java使用EasyExcel函数来操作Excel表(附实战)
  2. 详细讲解Java使用HSSFWorkbook函数导出Excel表(附实战)
  3. Python读取Excel的几种工具包(附Demo)

详细的Java知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)

此文通过后端你的查询前端,使用前端的下载参数下载!

1. 基本知识

this.$export.excel 是在 Vue.js 组件中使用的一个方法,通过 Vue.js 插件或 mixin 扩展到组件中的一个方法

主要功能是将给定的数据导出为 Excel 文件

参数包括:

  • 标题:Excel 文件的标题或名称
  • 列信息:导出的数据应该如何在 Excel 表格中排列,包括列名、宽度等
  • 数据:要导出的实际数据,可能是一个数组,每个元素代表一行数据,每行的元素按照列信息进行排列

具体作用如下:

  • 灵活性:支持不同的选项,比如自定义标题、指定列的顺序和格式、处理数据以适应 Excel 的需求等
  • 用户友好:提供一种用户友好的方式来导出数据,使用户能够以熟悉的 Excel 格式保存和处理数据,而无需手动将数据从应用程序复制粘贴到 Excel 中

2. 纯前端导入导出(Vue)

导入:

  • 自定义样式以增强界面外观。

  • 添加了 .xlsx 文件的限制,只允许选择该类型的文件进行上传。

  • 添加了一些虚拟数据,以便在没有上传文件时也可以查看表格的展示效果。

  • <style> 部分使用了 scoped,以确保样式仅在当前组件中生效,避免全局污染。

html 复制代码
<template>
  <div class="excel-import-demo">
    <el-upload
      class="upload-excel"
      :before-upload="handleUpload"
      action="default"
      accept=".xlsx"
    >
      <el-button type="primary">选择要导入的 .xlsx 表格</el-button>
    </el-upload>

    <div v-if="table.columns.length > 0" class="table-container">
      <h2>导入的数据</h2>
      <el-table :data="table.data" :columns="table.columns"></el-table>
    </div>
  </div>
</template>

<script>
import Vue from "vue";
import pluginImport from "@d2-projects/vue-table-import";

Vue.use(pluginImport);

export default {
  data() {
    return {
      table: {
        columns: [],
        data: [],
      },
    };
  },
  methods: {
    handleUpload(file) {
      this.$import.xlsx(file).then(({ header, results }) => {
        // 将表头作为列的标签和属性
        this.table.columns = header.map((e) => {
          return {
            label: e,
            prop: e,
          };
        });
        // 演示用的虚拟数据
        this.table.data = [
          { id: 1, name: "John", age: 30, email: "john@example.com" },
          { id: 2, name: "Jane", age: 28, email: "jane@example.com" },
          { id: 3, name: "Doe", age: 35, email: "doe@example.com" },
        ];
      });
      return false;
    },
  },
};
</script>

<style scoped>
.excel-import-demo {
  max-width: 600px;
  margin: 0 auto;
}

.upload-excel {
  margin-bottom: 20px;
}

.table-container {
  margin-top: 20px;
}
</style>

导出:

html 复制代码
<template>
  <div class="excel-export-demo">
    <div class="header">
      <h2>数据导出为 Excel</h2>
    </div>
    <div class="content">
      <el-button @click="exportExcel" type="primary">
        <el-icon name="download" /> 导出为 Excel
      </el-button>
    </div>
    <div class="footer">
      <p>© 2024 码农研究僧</p>
    </div>
  </div>
</template>

<script>
import Vue from 'vue'
import pluginExport from '@d2-projects/vue-table-export'

Vue.use(pluginExport)

export default {
  data() {
    return {
      table: {
        columns: [],
        data: []
      }
    }
  },
  methods: {
    exportExcel() {
      this.$export.excel({
        columns: this.table.columns,
        data: this.table.data
      }).then(() => {
        this.$message('导出表格成功')
      })
    }
  }
}
</script>

<style scoped>
.excel-export-demo {
  max-width: 400px;
  margin: 0 auto;
  text-align: center;
  padding: 20px;
}

.header h2 {
  margin-bottom: 20px;
}

.footer {
  margin-top: 20px;
  font-size: 12px;
}
</style>

3. 前后端(Vue + Java)

根据前面的一个框架,大致设计一个导出Excel

通过点击按钮:

js 复制代码
handleExcel() {
  this.loading = true;
  queryAllForExcel( Object.assign(this.getQuery()) ).then(res=>{
    console.log();
    const  column = this.option.column;
    const  data = res.data.data;
    let opt = {
      title: 'EXCEL 下载',
      column: column,
      data: data
    };
    console.log(opt);
    this.$export.excel({
      title: opt.title || new Date().getTime(),
      columns: opt.column,
      data: opt.data
    });

  }).finally(()=>{
    this.loading = false;
  });
},

传输的条件如下:(以下为Demo)

js 复制代码
getQuery(){
  var mTime = this.formInline.maintenanceTimePicker;
  var aTime = this.formInline.acceptTimePicker;
  var js;

  // 多机种的多个搜索
  var newmodel = '';
  console.log(this.formInline.model);
  if(this.formInline.model){//添加检查
    for(var i=0;i<this.formInline.model.length;i++){
      if(i==0){
        newmodel=this.formInline.model[i]
      }else{
        newmodel=newmodel+'-'+this.formInline.model[i]
      }
    }
  }

  // 设备编号的多个搜索
  var nos = '';
  if(this.formInline.equipmentNo){ // 不为空的判断
    for(var i=0;i<this.formInline.equipmentNo.length;i++){
      if(i==0){
        nos=this.formInline.equipmentNo[i]
      }else{
        nos=nos+'-'+this.formInline.equipmentNo[i]
      }
    }
  }
  if((mTime!=null&&(mTime.length!=1))&&(aTime!=null&&(aTime.length!=1))){
    js = {
      "equipmentNos": nos,
      "model":newmodel,
      "maintenanceType":this.formInline.maintenanceType,
      "maintenanceStartTime":moment(mTime[0]).format('YYYY-MM-DD HH:mm:ss'),
      "maintenanceEndTime":moment(mTime[1]).format('YYYY-MM-DD HH:mm:ss'),
      "acceptStartTime":moment(aTime[0]).format('YYYY-MM-DD HH:mm:ss'),
      "acceptEndTime":moment(aTime[1]).format('YYYY-MM-DD HH:mm:ss'),
    };
  }else if((mTime!=null&&(mTime.length!=1))&&aTime==null){
    js = {
      "equipmentNos": nos,
      "model":newmodel,
      "maintenanceType":this.formInline.maintenanceType,
      "maintenanceStartTime":moment(mTime[0]).format('YYYY-MM-DD HH:mm:ss'),
      "maintenanceEndTime":moment(mTime[1]).format('YYYY-MM-DD HH:mm:ss'),
    };
  }else if((aTime!=null&&(aTime.length!=1))&&mTime==null){
    js = {
      "equipmentNos": nos,
      "model":newmodel,
      "maintenanceType":this.formInline.maintenanceType,
      "acceptStartTime":moment(aTime[0]).format('YYYY-MM-DD HH:mm:ss'),
      "acceptEndTime":moment(aTime[1]).format('YYYY-MM-DD HH:mm:ss'),
    };
  }else{
    js = {
      "equipmentNos": nos,
      "model":newmodel,
      "maintenanceType":this.formInline.maintenanceType,
    }; 
  }
  console.log(js);
    return js;
},

前端接口如下:

js 复制代码
export const queryAllForExcel = ( params) => {
  return request({
    url: '/api/blade-equipment/maintenanceorder/queryAllForExcel',
    method: 'get',
    params: {
      ...params,
    },
    timeout:18000,
  })
}

对应后端传输的接口:

java 复制代码
@GetMapping("/queryAllForExcel")
@ApiOperationSupport(order = 2)
@ApiOperation(value = "查全部", notes = "传入maintenanceOrder")
public R<List<MaintenanceOrderVO>> queryAll(MaintenanceOrderVO maintenanceOrdervo) {

	QueryWrapper<MaintenanceOrder> maintenanceOrderQueryWrapper = new QueryWrapper<>();
	
	// 条件查询
	maintenanceOrderQueryWrapper = this.getWrapper(maintenanceOrdervo,maintenanceOrderQueryWrapper);

	List<MaintenanceOrder> maintenanceOrders = maintenanceOrderService.list(maintenanceOrderQueryWrapper);
	List<MaintenanceOrderVO> maintenanceOrderVOS = MaintenanceOrderWrapper.build().listVO(maintenanceOrders);
	return R.data(maintenanceOrderVOS);
}

对于上述条件查询主要是 MybatisPlus自我封装的一个函数,推荐阅读: 【Java项目】实战CRUD的功能整理(持续更新)

相关推荐
四谎真好看1 小时前
Java 黑马程序员学习笔记(进阶篇18)
java·笔记·学习·学习笔记
桦说编程1 小时前
深入解析CompletableFuture源码实现(2)———双源输入
java·后端·源码
java_t_t1 小时前
ZIP工具类
java·zip
lang201509282 小时前
Spring Boot优雅关闭全解析
java·spring boot·后端
岁月宁静2 小时前
深度定制:在 Vue 3.5 应用中集成流式 AI 写作助手的实践
前端·vue.js·人工智能
pengzhuofan3 小时前
第10章 Maven
java·maven
百锦再3 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
刘一说3 小时前
Spring Boot 启动慢?启动过程深度解析与优化策略
java·spring boot·后端
壹佰大多4 小时前
【spring如何扫描一个路径下被注解修饰的类】
java·后端·spring
百锦再4 小时前
对前后端分离与前后端不分离(通常指服务端渲染)的架构进行全方位的对比分析
java·开发语言·python·架构·eclipse·php·maven