0


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

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

1)准备工作

安装所需相关依赖

  1. npm i html2canvas --save
  2. npm i jspdf --save
  3. npm i xlsx --save
  4. npm i file-saver --save

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

然后画页面

页面效果

2)导出CSV格式的文件

新建src/utils/utils.js文件

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

  1. // 导出csv
  2. export function exportCsv(columns, dataList, fileName) {
  3. let title = columns.map(item => item.title);
  4. let keyArray = columns.map(item => item.key);
  5. let str = [];
  6. str.push(title.join(',') + '\n');
  7. for (let i = 0; i < dataList.length; i++) {
  8. const temp = [];
  9. for (let j = 0; j < keyArray.length; j++) {
  10. temp.push(dataList[i][keyArray[j]]);
  11. }
  12. str.push(temp.join(',') + '\n');
  13. }
  14. console.log(str)
  15. let uri = 'data:text/csv;charset=utf-8,\ufeff' + encodeURIComponent(str.join(''));
  16. let downloadLink = document.createElement('a');
  17. downloadLink.href = uri;
  18. downloadLink.download = fileName;
  19. document.body.appendChild(downloadLink);
  20. downloadLink.click();
  21. document.body.removeChild(downloadLink);
  22. }

页面使用

先引人方法

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

再调用

  1. handleExprotData() {
  2. //表头
  3. let allColumns = []
  4. this.$refs.singleTable.$children.forEach(obj => {
  5. if (obj.label !== undefined && obj.prop !== undefined) {
  6. allColumns.push({ "title": obj.label, "key": obj.prop })
  7. }
  8. })
  9. //this.checkboxList是勾选的需要导出的数据
  10. console.log(JSON.parse(JSON.stringify("allColumns -----------" , allColumns)))
  11. console.log(JSON.parse(JSON.stringify("this.checkboxList ----------------" , this.checkboxList)))
  12. this.exportForm.exportFormat == 0 && exportCsv(allColumns, this.checkboxList, "CP信息");
  13. }

效果

3)导出XML格式的文件

在utils.js写入

  1. // 导出xml格式
  2. export function exportXml(columns, dataList, fileName) {
  3. let str = '<?xml version="1.0" encoding="utf-8" ?>\n<dataSource>\n';
  4. dataList.forEach(dataItem => {
  5. str += `<dataItem>\n`;
  6. columns.forEach(columnsItem => {
  7. str += `<${columnsItem.key}>${dataItem[columnsItem.key]}</${columnsItem.key}>\n`;
  8. });
  9. str += `</dataItem>\n`;
  10. });
  11. str += '</dataSource>';
  12. let downloadLink = document.createElement('a');
  13. let uri = window.URL.createObjectURL(new Blob([str], { type: 'text/plain;charset=utf-8,\ufeff' }));
  14. downloadLink.href = uri;
  15. downloadLink.download = `${fileName}.xml`;
  16. downloadLink.click();
  17. window.URL.revokeObjectURL(uri);
  18. }

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

  1. handleExprotData() {
  2. //表头
  3. let allColumns = []
  4. this.$refs.singleTable.$children.forEach(obj => {
  5. if (obj.label !== undefined && obj.prop !== undefined) {
  6. allColumns.push({ "title": obj.label, "key": obj.prop })
  7. }
  8. })
  9. //this.checkboxList是勾选的需要导出的数据
  10. console.log(JSON.parse(JSON.stringify("allColumns -----------" , allColumns)))
  11. console.log(JSON.parse(JSON.stringify("this.checkboxList ----------------" , this.checkboxList)))
  12. this.exportForm.exportFormat == 0 && exportCsv(allColumns, this.checkboxList, "CP信息");
  13. this.exportForm.exportFormat == 1 && exportXml(allColumns, this.checkboxList, "CP信息");
  14. }

效果

4)导出HTML格式的文件

  1. // 导出html格式
  2. export function exportHtml(columns, dataList, fileName) {
  3. let str = '<table border="1" style="border-collapse: collapse;min-width:80%;margin:0 10%;">\n';
  4. columns.forEach(columnsItem => {
  5. str += `<th>${columnsItem.title}</th>\n`;
  6. });
  7. dataList.forEach(dataItem => {
  8. str += `<tr>\n`;
  9. columns.forEach(columnsItem => {
  10. str += `<td>${dataItem[columnsItem.key]}</td>\n`;
  11. });
  12. str += `</tr>\n`;
  13. });
  14. str += '</table>';
  15. let html = `<!DOCTYPE html>
  16. <html lang="en">
  17. <head>
  18. <meta charset="UTF-8">
  19. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  20. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  21. <title>Document</title>
  22. </head>
  23. <body>
  24. <h2 style="text-align:center">
  25. ${fileName}
  26. </h2>
  27. <div style="width:100%">
  28. ${str}
  29. </div>
  30. </body>
  31. </html>`;
  32. let downloadLink = document.createElement('a');
  33. let uri = window.URL.createObjectURL(new Blob([html], { type: 'text/html;charset=utf-8,\ufeff' }));
  34. downloadLink.href = uri;
  35. downloadLink.download = `${fileName}.html`;
  36. downloadLink.click();
  37. window.URL.revokeObjectURL(uri);
  38. }

页面引入,调用

页面上加一行

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

就可以了

效果

5)导出PDF格式的文件

utils引入依赖

  1. import html2canvas from 'html2canvas';
  2. import { jsPDF } from "jspdf"
  1. // 导出pdf格式
  2. export function exportPDF(columns, dataList, fileName) {
  3. let str = '<table border="1" style="border-collapse: collapse;min-width:80%;margin:0 10%;">\n';
  4. columns.forEach(columnsItem => {
  5. str += `<th>${columnsItem.title}</th>\n`;
  6. });
  7. dataList.forEach(dataItem => {
  8. str += `<tr>\n`;
  9. columns.forEach(columnsItem => {
  10. str += `<td>${dataItem[columnsItem.key]}</td>\n`;
  11. });
  12. str += `</tr>\n`;
  13. });
  14. str += '</table>';
  15. let ele = document.createElement('div');
  16. ele.innerHTML = `<h2 style="text-align:center">
  17. ${fileName}
  18. </h2>
  19. <div style="width:100%">
  20. ${str}
  21. </div>`;
  22. document.body.appendChild(ele);
  23. // var w = ele.offsetwidth; //获得该容器的宽
  24. // var h = ele.offsetwidth; //获得该容器的高
  25. // var offsetTop = ele.offsetTop + 24; //获得该容器到文档顶部的距离
  26. // var offsetLeft = ele.offsetLeft + 24; //获得该容器到文档最左的距离
  27. var w = 960; //获得该容器的宽
  28. var h = 1024; //获得该容器的高
  29. var offsetTop = 24; //获得该容器到文档顶部的距离
  30. var offsetLeft = 24; //获得该容器到文档最左的距离
  31. var canvas = document.createElement('canvas');
  32. var abs = 0;
  33. var win_i = document.body.clientwidth; //获得当前可视窗口的宽度(不包含滚动条)
  34. var win_o = window.innerwidth; //获得当前窗口的宽度(包含滚动条)
  35. if (win_o > win_i) {
  36. abs = (win_o - win_i) / 2; //获得滚动条长度的—半
  37. }
  38. canvas.width = w * 2; //将回布宽&&高放大两倍
  39. canvas.height = h * 2;
  40. var context = canvas.getContext('2d');
  41. context.scale(2, 2);
  42. context.translate(-offsetLeft - abs, -offsetTop);
  43. //这里默认横向没有滚动条的情况,因为offset.Left(),有无滚动条的时候存在差值,因此 transLate的时候,要把这个差值去掉
  44. html2canvas(ele, {
  45. allowTaint: true,
  46. scale: 2, //提升画面质量,但是会增加文件大小
  47. }).then(function(canvas) {
  48. var contentwidth = canvas.width;
  49. var contentHeight = canvas.height;
  50. //一页pdf显示htmL页面生成的canvas高度;
  51. var pageHeight = (contentwidth / 592.28) * 841.89;
  52. //未生成pdf 的htmL页面高度
  53. var leftHeight = contentHeight;
  54. //页面偏移
  55. var position = 0;
  56. //a4纸的尺寸[ 595.28,841.89],html页面生成的canvas在pdf中图片的宽高
  57. var imgwidth = 595.28;
  58. var imgHeight = (592.28 / contentwidth) * contentHeight;
  59. var pageData = canvas.toDataURL(' image/jpeg ', 1.0);
  60. var pdf = new jsPDF('', 'pt', 'a4');
  61. console.log(pdf);
  62. //有两个高度需要区分,一个是htmL页面的实际高度,和生成pdf的页面高度(841.89) 当内容未超过pdf—页显示的范围,无需分页
  63. if (leftHeight < pageHeight) {
  64. pdf.addImage(pageData, 'JPEG', 0, 0, imgwidth, imgHeight);
  65. } else {
  66. //分页
  67. while (leftHeight > 0) {
  68. pdf.addImage(pageData, 'JPEG', 0, position, imgwidth, imgHeight);
  69. leftHeight -= pageHeight;
  70. position -= 841.89;
  71. //避免添加空白页
  72. if (leftHeight > 0) {
  73. pdf.addPage();
  74. }
  75. }
  76. }
  77. pdf.save(`${fileName}.pdf`);
  78. document.body.removeChild(ele);
  79. });
  80. }
  81. const s2ab = s => {
  82. var buf;
  83. if (typeof ArrayBuffer !== 'undefined') {
  84. buf = new ArrayBuffer(s.length)
  85. var view = new Uint8Array(buf)
  86. for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xff
  87. return buf
  88. } else {
  89. buf = new Array(s.length);
  90. for (var i = 0; i != s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF;
  91. return buf;
  92. }
  93. }

页面引入、调用

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

效果

6)导出EXCEL格式的文件

引入依赖

  1. import * as XLSX from 'xlsx'
  2. import fs from 'file-saver'
  1. // 导出excel格式
  2. export function exportExcel(columns, dataList, filename) {
  3. dataList.forEach(item => {
  4. for (let i in item) {
  5. if (columns.hasOwnProperty(i)) {
  6. item[columns[i]] = item[i];
  7. }
  8. delete item[i]; //删除原先的对象属性
  9. }
  10. })
  11. let sheetName = filename + ".xlsx" //excel的文件名称
  12. console.log(sheetName)
  13. let wb = XLSX.utils.book_new() //工作簿对象包含一SheetNames数组,以及一个表对象映射表名称到表对象。XLSX.utils.book_new实用函数创建一个新的工作簿对象。
  14. console.log(wb)
  15. let ws = XLSX.utils.json_to_sheet(dataList, {
  16. header: Object.values(columns)
  17. }) //将JS对象数组转换为工作表。
  18. wb.SheetNames.push(sheetName)
  19. wb.Sheets[sheetName] = ws
  20. const defaultCellStyle = {
  21. font: {
  22. name: "Verdana",
  23. sz: 13,
  24. color: "FF00FF88"
  25. },
  26. fill: {
  27. fgColor: {
  28. rgb: "FFFFAA00"
  29. }
  30. }
  31. }; //设置表格的样式
  32. let wopts = {
  33. bookType: 'xlsx',
  34. bookSST: false,
  35. type: 'binary',
  36. cellStyles: true,
  37. defaultCellStyle: defaultCellStyle,
  38. showGridLines: false
  39. } //写入的样式
  40. let wbout = XLSX.write(wb, wopts)
  41. let blob = new Blob([s2ab(wbout)], {
  42. type: 'application/octet-stream'
  43. })
  44. fs.saveAs(blob, filename + '.xlsx')
  45. }

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

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

效果看着与csv文件一样的


本文转载自: https://blog.csdn.net/qq_45600228/article/details/131897468
版权归原作者 前端(从入门到入土) 所有, 如有侵权,请联系我们删除。

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

还没有评论