VUE通用后台管理系统(四)前端导出文件(CSV、XML、HTML、PDF、EXCEL)

常见的导出格式:CSV、XML、HTML、PDF、EXCEL

1)准备工作

安装所需相关依赖

npm i html2canvas --save
npm i jspdf --save

npm i xlsx --save
npm i file-saver --save

前两个是PDF格式需要的依赖,后两个是excel格式所需,如果没有需求这两种格式的可以忽略这一步

然后画页面

VUE通用后台管理系统(四)前端导出文件(CSV、XML、HTML、PDF、EXCEL)

 VUE通用后台管理系统(四)前端导出文件(CSV、XML、HTML、PDF、EXCEL)

页面效果

VUE通用后台管理系统(四)前端导出文件(CSV、XML、HTML、PDF、EXCEL)

2)导出CSV格式的文件

新建src/utils/utils.js文件

写入exportCsv方法,columns为表头,dataList数据,filename导出文件名称

// 导出csv
export function exportCsv(columns, dataList, fileName) {
  let title = columns.map(item => item.title);
  let keyArray = columns.map(item => item.key);
  let str = [];
  str.push(title.join(',') + '\n');
  for (let i = 0; i < dataList.length; i++) {
    const temp = [];
    for (let j = 0; j < keyArray.length; j++) {
      temp.push(dataList[i][keyArray[j]]);
    }
    str.push(temp.join(',') + '\n');
  } 
  console.log(str)
  let uri = 'data:text/csv;charset=utf-8,\ufeff' + encodeURIComponent(str.join(''));
  let downloadLink = document.createElement('a');
  downloadLink.href = uri;
  downloadLink.download = fileName;
  document.body.appendChild(downloadLink);
  downloadLink.click();
  document.body.removeChild(downloadLink);
}

页面使用

先引人方法

import { exportCsv, exportXml, exportHtml, exportPDF, exportExcel } from "@/utils/utils"

再调用

    handleExprotData() {
        //表头
      let allColumns = []
      this.$refs.singleTable.$children.forEach(obj => {
        if (obj.label !== undefined && obj.prop !== undefined) {
          allColumns.push({ "title": obj.label, "key": obj.prop })
        }
      })

      //this.checkboxList是勾选的需要导出的数据
      console.log(JSON.parse(JSON.stringify("allColumns -----------" , allColumns)))
      console.log(JSON.parse(JSON.stringify("this.checkboxList ----------------" , this.checkboxList)))
      this.exportForm.exportFormat == 0 && exportCsv(allColumns, this.checkboxList, "CP信息");

}

VUE通用后台管理系统(四)前端导出文件(CSV、XML、HTML、PDF、EXCEL)

效果

VUE通用后台管理系统(四)前端导出文件(CSV、XML、HTML、PDF、EXCEL)

3)导出XML格式的文件

在utils.js写入

// 导出xml格式
export function exportXml(columns, dataList, fileName) {
  let str = '\n\n';
  dataList.forEach(dataItem => {
    str += `\n`;
    columns.forEach(columnsItem => {
      str += `${dataItem[columnsItem.key]}\n`;
    });
    str += `\n`;
  });
  str += '';
  let downloadLink = document.createElement('a');
  let uri = window.URL.createObjectURL(new Blob([str], { type: 'text/plain;charset=utf-8,\ufeff' }));
  downloadLink.href = uri;
  downloadLink.download = `${fileName}.xml`;
  downloadLink.click();
  window.URL.revokeObjectURL(uri);
}

然后再页面引入、调用,和csv格式一样

    handleExprotData() {
        //表头
      let allColumns = []
      this.$refs.singleTable.$children.forEach(obj => {
        if (obj.label !== undefined && obj.prop !== undefined) {
          allColumns.push({ "title": obj.label, "key": obj.prop })
        }
      })

      //this.checkboxList是勾选的需要导出的数据
      console.log(JSON.parse(JSON.stringify("allColumns -----------" , allColumns)))
      console.log(JSON.parse(JSON.stringify("this.checkboxList ----------------" , this.checkboxList)))
      this.exportForm.exportFormat == 0 && exportCsv(allColumns, this.checkboxList, "CP信息");
      this.exportForm.exportFormat == 1 && exportXml(allColumns, this.checkboxList, "CP信息");

}

效果

VUE通用后台管理系统(四)前端导出文件(CSV、XML、HTML、PDF、EXCEL)

4)导出HTML格式的文件

// 导出html格式
export function exportHtml(columns, dataList, fileName) {
  let str = '\n';
  columns.forEach(columnsItem => {
    str += `\n`;
  });
  dataList.forEach(dataItem => {
    str += `\n`;
    columns.forEach(columnsItem => {
      str += `\n`;
    });
    str += `\n`;
  });
  str += '
${columnsItem.title}
${dataItem[columnsItem.key]}
'; let html = ` Document

${fileName}

${str} `; let downloadLink = document.createElement('a'); let uri = window.URL.createObjectURL(new Blob([html], { type: 'text/html;charset=utf-8,\ufeff' })); downloadLink.href = uri; downloadLink.download = `${fileName}.html`; downloadLink.click(); window.URL.revokeObjectURL(uri); }

页面引入,调用

页面上加一行

this.exportForm.exportFormat == 2 && exportHtml(allColumns, this.checkboxList, "CP信息");

就可以了

效果

VUE通用后台管理系统(四)前端导出文件(CSV、XML、HTML、PDF、EXCEL)

5)导出PDF格式的文件

utils引入依赖

import html2canvas from 'html2canvas';
import { jsPDF } from "jspdf"
// 导出pdf格式
export function exportPDF(columns, dataList, fileName) {
  let str = '\n';
  columns.forEach(columnsItem => {
    str += `\n`;
  });
  dataList.forEach(dataItem => {
    str += `\n`;
    columns.forEach(columnsItem => {
      str += `\n`;
    });
    str += `\n`;
  });
  str += '
${columnsItem.title}
${dataItem[columnsItem.key]}
'; let ele = document.createElement('div'); ele.innerHTML = `

${fileName}

${str} `; document.body.appendChild(ele); // var w = ele.offsetwidth; //获得该容器的宽 // var h = ele.offsetwidth; //获得该容器的高 // var offsetTop = ele.offsetTop + 24; //获得该容器到文档顶部的距离 // var offsetLeft = ele.offsetLeft + 24; //获得该容器到文档最左的距离 var w = 960; //获得该容器的宽 var h = 1024; //获得该容器的高 var offsetTop = 24; //获得该容器到文档顶部的距离 var offsetLeft = 24; //获得该容器到文档最左的距离 var canvas = document.createElement('canvas'); var abs = 0; var win_i = document.body.clientwidth; //获得当前可视窗口的宽度(不包含滚动条) var win_o = window.innerwidth; //获得当前窗口的宽度(包含滚动条) if (win_o > win_i) { abs = (win_o - win_i) / 2; //获得滚动条长度的—半 } canvas.width = w * 2; //将回布宽&&高放大两倍 canvas.height = h * 2; var context = canvas.getContext('2d'); context.scale(2, 2); context.translate(-offsetLeft - abs, -offsetTop); //这里默认横向没有滚动条的情况,因为offset.Left(),有无滚动条的时候存在差值,因此 transLate的时候,要把这个差值去掉 html2canvas(ele, { allowTaint: true, scale: 2, //提升画面质量,但是会增加文件大小 }).then(function(canvas) { var contentwidth = canvas.width; var contentHeight = canvas.height; //一页pdf显示htmL页面生成的canvas高度; var pageHeight = (contentwidth / 592.28) * 841.89; //未生成pdf 的htmL页面高度 var leftHeight = contentHeight; //页面偏移 var position = 0; //a4纸的尺寸[ 595.28,841.89],html页面生成的canvas在pdf中图片的宽高 var imgwidth = 595.28; var imgHeight = (592.28 / contentwidth) * contentHeight; var pageData = canvas.toDataURL(' image/jpeg ', 1.0); var pdf = new jsPDF('', 'pt', 'a4'); console.log(pdf); //有两个高度需要区分,一个是htmL页面的实际高度,和生成pdf的页面高度(841.89) 当内容未超过pdf—页显示的范围,无需分页 if (leftHeight 0) { pdf.addImage(pageData, 'JPEG', 0, position, imgwidth, imgHeight); leftHeight -= pageHeight; position -= 841.89; //避免添加空白页 if (leftHeight > 0) { pdf.addPage(); } } } pdf.save(`${fileName}.pdf`); document.body.removeChild(ele); }); } const s2ab = s => { var buf; if (typeof ArrayBuffer !== 'undefined') { buf = new ArrayBuffer(s.length) var view = new Uint8Array(buf) for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xff return buf } else { buf = new Array(s.length); for (var i = 0; i != s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF; return buf; } }

 页面引入、调用

this.exportForm.exportFormat == 3 && exportPDF(allColumns, this.checkboxList, "CP信息");

效果

VUE通用后台管理系统(四)前端导出文件(CSV、XML、HTML、PDF、EXCEL)

 6)导出EXCEL格式的文件

引入依赖

import * as XLSX from 'xlsx'
import fs from 'file-saver'
// 导出excel格式
export function exportExcel(columns, dataList, filename) { 
  dataList.forEach(item => {
    for (let i in item) {
      if (columns.hasOwnProperty(i)) {
        item[columns[i]] = item[i];
      }
      delete item[i]; //删除原先的对象属性
    }
  })
  let sheetName = filename + ".xlsx" //excel的文件名称
  console.log(sheetName)
  let wb = XLSX.utils.book_new() //工作簿对象包含一SheetNames数组,以及一个表对象映射表名称到表对象。XLSX.utils.book_new实用函数创建一个新的工作簿对象。
  console.log(wb)
  let ws = XLSX.utils.json_to_sheet(dataList, {
    header: Object.values(columns)
  }) //将JS对象数组转换为工作表。
  wb.SheetNames.push(sheetName)
  wb.Sheets[sheetName] = ws
  const defaultCellStyle = {
    font: {
      name: "Verdana",
      sz: 13,
      color: "FF00FF88"
    },
    fill: {
      fgColor: {
        rgb: "FFFFAA00"
      }
    }
  }; //设置表格的样式
  let wopts = {
    bookType: 'xlsx',
    bookSST: false,
    type: 'binary',
    cellStyles: true,
    defaultCellStyle: defaultCellStyle,
    showGridLines: false
  } //写入的样式
  let wbout = XLSX.write(wb, wopts)
  let blob = new Blob([s2ab(wbout)], {
    type: 'application/octet-stream'
  })
  fs.saveAs(blob, filename + '.xlsx')
}

这个页面调用与别的格式不同

      //excel格式专用表头
      if (this.exportForm.exportFormat == 4) {
        let excelColumns = {}
        this.$refs.singleTable.$children.forEach(obj => {
          if (obj.label !== undefined && obj.prop !== undefined) {
            excelColumns[obj.prop] = obj.label
          }
        })
        exportExcel(excelColumns, this.checkboxList, "CP信息");
        return
      } 

效果看着与csv文件一样的

本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://www.net2asp.com/60e0772d38.html