• 下载excel表格的方法


    在需要右击下载的地方配置新的右击菜单,去除之前浏览器默认菜单

    首先在控制台需要下载相应的依赖

    yarn add vue-contextmenu  或者  npm install vue-contextmenu
    

    如果多个地方用就全局注册

    //在main.js文件
    // 右键导出
    import VueContextMenu from 'vue-contextmenu'
    Vue.use(VueContextMenu)
    
          <div @contextmenu="showMenu" >
              <!-- 该组件已经全局引入 -->
              <vue-context-menu :contextMenuData="contextMenuData"
                @downloadCurrent="downloadCurrent"  // 下载当前页
                @downloadAll="downloadAll"     // 下载全部页
                class="conMenu">
              </vue-context-menu>
              <el-table>...</el-table>
          </div>
    <script>
    import {exportCsv} from '@/utils/updata'
    data() {
        return {
        // 右键下载
          contextMenuData: {
          // the contextmenu name(1.4.1+ updated)
            menuName: 'download',
          // The coordinates of the display(菜单显示的位置)
            axis: {
              x: null,
              y: null
            },
          // Menu options (菜单选项)
            menulists: [
              {
                fnHandler: 'downloadCurrent', // Binding events(绑定事件)
                icoName: 'el-icon-document', // icon (icon图标 )
                btnName: '导出当前页' // The name of the menu option (菜单名称)
              },
              {
                fnHandler: 'downloadAll',
                icoName: 'el-icon-printer',
                btnName: '导出全部'
              }
            ]
          },
    },
    methods: {
      // 点击下载当前页
        downloadCurrent () {
          this.handleClickExamineBalanceAdministrationExcel(this.tableData)  // this.tableData为本页加载的数据(分页情况下的,仅本页书数据)
        },
        // 点击下载全部页面
        async downloadAll () {
          let parent = {
            plugin:"com.qdkt.kely.system.BussPlugin.KelyPlanCompleteGetDataPlugin",   
            pluginData:{
                user_code: localStorage.getItem("ms_usercode"),
            }
          }
          let data = await getCompleteAllList(parent).then((res)=>{
            let arrList = res.data.returnData.data
            console.log(arrList)
            this.handleClickExamineBalanceAdministrationExcel(arrList)
          }).catch(()=>{
            alert(res.data.returnMessage)
          })
        },
        // 导出的方法
        handleClickExamineBalanceAdministrationExcel(data){  // 传入的数据就是导出的数据
          const exportData = data.map((item) => {
    
            const data = {  // 每列数据的字段
              erp_id: item.erp_id,
              specs: item.specs,
              p_id: item.p_id,
              p_name: item.p_name,
              unit: item.unit,
              theory_working_hours: item.theory_working_hours,
              actual_working_hours: item.actual_working_hours,
              qty: item.qty,
              actual_complete_qty: item.actual_complete_qty,
              wh_complete_rate: item.wh_complete_rate,
              qty_complete_rate: item.qty_complete_rate,
              holistic_complete_rate: item.holistic_complete_rate,
              incomplete_reason: item.incomplete_reason,
              start_time: item.start_time,
              end_time: item.end_time,
              order_state: item.order_state,
            };
            return Object.values(data);
          });
          exportCsv([  // 表头  , 方法是引入进来的
            [
              "ERP工单号",
              "规格",
              "产品品号",
              "品名",
              "单位",
              "理论工时/分钟",
              "实际工时/分钟",
              "工单数量",
              "实际完成数量",
              "工时达成率",
              "数量达成率",
              "工单整体达成率",
              "未达成原因",
              "开始时间",
              "结束时间",
              "订单状态",
            ],
            ...exportData,
          ]);
        },
    }
    </script>
    

    引入的文件是一个模板,可直接使用

    export function arrayToCsv(data, args = {}) {
          let columnDelimiter = args.columnDelimiter || ",";
          let lineDelimiter = args.lineDelimiter || "
    ";
          return data.reduce((csv, row) => {
            const rowContent = Array.isArray(row)
              ? row.reduce((rowTemp, col) => {
                  let ret = rowTemp ? rowTemp + columnDelimiter : rowTemp;
                  if (col) {
                    let formatedCol = col
                      .toString()
                      .replace(new RegExp(lineDelimiter, "g"), " ");
                    ret += /,/.test(formatedCol)? `"${formatedCol}"` : formatedCol;
                  }
                  return ret;
                }, "")
              : row;
            return (csv ? csv + lineDelimiter : "") + rowContent;
          }, "");
        }
        const BOM = "uFEFF";
        var timestamp = new Date().getTime()  // 生成时间戳
        export function exportCsv(inputData, filename = "file" + timestamp + ".xlsx") {  // 定义文件的名字
          const csv = arrayToCsv(inputData);
          if (navigator.msSaveOrOpenBlob) {
            let blob = new Blob([BOM + csv], { type: "text/csv;charset=utf-8;" });
            navigator.msSaveOrOpenBlob(blob, filename);
          } else {
            let uri = encodeURI(`data:text/csv;charset=utf-8,${BOM}${csv}`);
            let downloadLink = document.createElement("a");
            downloadLink.href = uri;
            downloadLink.download = filename;
            document.body.appendChild(downloadLink);
            downloadLink.click();
            document.body.removeChild(downloadLink);
          }
        }
    
  • 相关阅读:
    Console.WriteLine输出字符格式化
    GridView动态生成列问题
    日历控件,可运行在XHTML1.0下
    GridView內容導出Excel時異常:必须置於有 runat=server 的表单标记之中
    圆弧分割
    矩阵变换
    使用group by 来统计的小作业
    group by 后使用 rollup 子句总结
    mysql字符串拼接,存储过程,(来自网上看到)
    【深入理解Linux内核】《第二章 内存寻址》笔记 (2014-06-28 12:38)
  • 原文地址:https://www.cnblogs.com/axingya/p/14416183.html
Copyright © 2020-2023  润新知