当前位置: 首页 > news >正文

vue使用Export2Excel.js导出表格自定义样式(表头加分割斜线)(笔记)

1、Export2Excel.js 文件内容

/* eslint-disable */
/** 导出Excel需要依赖
* npm install xlsx file-saver -S
* npm install script-loader -S -D 
*/import { saveAs } from 'file-saver'
// import XLSX from 'xlsx'
import XLSX from 'xlsx-style' //添加斜线这样引入XLSXfunction generateArray (table) {var out = [];var rows = table.querySelectorAll('tr');var ranges = [];for (var R = 0; R < rows.length; ++R) {var outRow = [];var row = rows[R];var columns = row.querySelectorAll('td');for (var C = 0; C < columns.length; ++C) {var cell = columns[C];var colspan = cell.getAttribute('colspan');var rowspan = cell.getAttribute('rowspan');var cellValue = cell.innerText;if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;//Skip rangesranges.forEach(function (range) {if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);}});//Handle Row Spanif (rowspan || colspan) {rowspan = rowspan || 1;colspan = colspan || 1;ranges.push({s: {r: R,c: outRow.length},e: {r: R + rowspan - 1,c: outRow.length + colspan - 1}});};//Handle ValueoutRow.push(cellValue !== "" ? cellValue : null);//Handle Colspanif (colspan)for (var k = 0; k < colspan - 1; ++k) outRow.push(null);}out.push(outRow);}return [out, ranges];
};function datenum (v, date1904) {if (date1904) v += 1462;var epoch = Date.parse(v);return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
}function sheet_from_array_of_arrays (data, opts, fontStyle) {var ws = {};var range = {s: {c: 10000000,r: 10000000},e: {c: 0,r: 0}};let _opts = []if (opts) {_opts = opts}console.log('data==', data)for (var R = 0; R != data.length; ++R) {for (var C = 0; C != data[R].length; ++C) {if (range.s.r > R) range.s.r = R;if (range.s.c > C) range.s.c = C;if (range.e.r < R) range.e.r = R;if (range.e.c < C) range.e.c = C;var cell = {v: data[R][C]};//给单个表头添加斜线样式if (_opts) {if (R == _opts[0] && C == _opts[1]) {cell = {v: data[R][C],s: defaultCellStyle}}}//给某一单元格的字体自定义样式if (fontStyle) {if (R == data.length - 3 && C == 1) {cell = {v: data[R][C],s: fontCellStyle}}}if (cell.v == null) continue;var cell_ref = XLSX.utils.encode_cell({c: C,r: R});if (typeof cell.v === 'number') cell.t = 'n';else if (typeof cell.v === 'boolean') cell.t = 'b';else if (cell.v instanceof Date) {cell.t = 'n';cell.z = XLSX.SSF._table[14];cell.v = datenum(cell.v);} else cell.t = 's';ws[cell_ref] = cell;}}if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);return ws;
}let fontCellStyle = {font: {name: '宋体',sz: 18,color: { rgb: "ff0000" },bold: true,},alignment: {//对齐方式horizontal: 'center',//水平居中vertical: 'center',//竖直居中},
}let defaultCellStyle = {alignment: {horizontal: 'center',vertical: 'center',indent: 0},border: {diagonalDown: true,//斜线方向diagonal: {color: { rgb: '303133' },style: 'thin'}//diagonalDown与diagonal必须同时使用}
}function Workbook () {if (!(this instanceof Workbook)) return new Workbook();this.SheetNames = [];this.Sheets = {};
}function s2ab (s) {var 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;
}export function export_table_to_excel (id) {var theTable = document.getElementById(id);var oo = generateArray(theTable);var ranges = oo[1];/* original data */var data = oo[0];var ws_name = "SheetJS";var wb = new Workbook(),ws = sheet_from_array_of_arrays(data);/* add ranges to worksheet */// ws['!cols'] = ['apple', 'banan'];ws['!merges'] = ranges;/* add worksheet to workbook */wb.SheetNames.push(ws_name);wb.Sheets[ws_name] = ws;var wbout = XLSX.write(wb, {bookType: 'xlsx',bookSST: false,type: 'binary'});saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), "test.xlsx")
}export function export_json_to_excel ({multiHeader = [],header,data,filename,merges = [],maxWidth = '',autoWidth = true,bookType = 'xlsx',diagonal = [],//斜线fontStyle = false,
} = {}) {/* original data */filename = filename || 'excel-list'data = [...data]data.unshift(header);for (let i = multiHeader.length - 1; i > -1; i--) {data.unshift(multiHeader[i])}var ws_name = "SheetJS";var wb = new Workbook()//加样式,如斜线if (diagonal) {var ws = sheet_from_array_of_arrays(data, diagonal, fontStyle);} else {var ws = sheet_from_array_of_arrays(data);}//此处可根据自己习惯做判断应用if (merges.length > 0) {if (!ws['!merges']) ws['!merges'] = [];merges.forEach(item => {ws['!merges'].push(XLSX.utils.decode_range(item))})}if (autoWidth) {/*设置worksheet每列的最大宽度*/const colWidth = data.map(row => row.map(val => {/*先判断是否为null/undefined*/if (val == null) {return {'wch': 10};}/*再判断是否为中文*/else if (val.toString().charCodeAt(0) > 255) {return {'wch': maxWidth ? val.toString().length * 2 > maxWidth ? maxWidth : val.toString().length * 2 : val.toString().length * 2};} else {return {'wch': maxWidth ? val.toString().length > maxWidth ? maxWidth : val.toString().length : val.toString().length};}}))/*以第一行为初始值*/let result = colWidth[0];for (let i = 1; i < colWidth.length; i++) {for (let j = 0; j < colWidth[i].length; j++) {if (result[j]['wch'] < colWidth[i][j]['wch']) {result[j]['wch'] = colWidth[i][j]['wch'];}}}ws['!cols'] = result;}if (fontStyle) {}/* add worksheet to workbook */wb.SheetNames.push(ws_name);wb.Sheets[ws_name] = ws;var wbout = XLSX.write(wb, {bookType: bookType,bookSST: false,type: 'binary'});saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), `${filename}.${bookType}`);
}

处理导出数据js

// 导出数据 转换成Excel表格需要的二维数组
export function formatJson (filterVal, jsonData, fun) {return jsonData.map(v =>filterVal.map(j => {if (fun) {return fun(j, v[j])} else {return v[j]}}))
}

vue页面html使用

import { letterArr } from '@/api'
import { formatJson} from "@/utils/index"
import('@/utils/Export2Excel').then(excel => {let tHeader = ['日期', '门票名称'']let filterVal = ['createTime', 'ticketName']let merges = []const merges_arr = [this.A_row_merge, this.B_row_merge]// 列合并,this.A_row_merge,this.B_row_merge为需要合并的列,在获取数据列表时做处理,格式为[[1,3],[4,5],[7,9]]for (let i = 0; i < merges_arr.length; i++) {const row_merge = merges_arr[i];for (let j = 0; j < row_merge.length; j++) {const element = row_merge[j];merges.push(`${letterArr[i]}${element[0] + 2}:${letterArr[i]}${element[1] + 2}`)}}const data = formatJson(filterVal, dataList)let filename = `销售汇总`excel.export_json_to_excel({header: tHeader, //表头 必填data, //具体数据 必填merges,diagonal: [0, 3],//斜线位置(第一行第四列)filename: filename, //非必填})})

样式自定义相关属性中文参考:https://segmentfault.com/a/1190000022772664
相关链接(英文):
https://www.npmjs.com/package/xlsx-style


http://www.taodudu.cc/news/show-6102281.html

相关文章:

  • 【physx/wasm】在physx中添加自定义接口并重新编译wasm
  • excel---常用操作
  • Lora训练Windows[笔记]
  • linux基础指令讲解(ls、pwd、cd、touch、mkdir)
  • InnoDB 事务处理机制
  • 启明云端ESP32 C3 模组WT32C3通过 MQTT 连接 AWS
  • 前端根据后端返回数据导出指定样式的表格(xlsx-js-style)
  • 使用excelJs.js,导出excel,可以设置序列以及下拉框的联动
  • easy-excel导出excel中日期列需要双击才能进行筛选
  • ExcelJS 导入导出excel带下拉框筛选数据
  • 使用exceljs导出部门-职位联动下拉框的excel
  • 导出excel此单元格中的数字为文本格式,或者其前面有撇号
  • linux查找所有可用的摄像头
  • 树莓派安装mplayer,并使用命令查看摄像头
  • vue获取摄像头
  • 谷歌浏览器获取摄像头
  • 树莓派4b摄像头使能
  • Opencv根据USB摄像头PID\VID号,获取对应摄像头索引
  • rk3588调试之imx415摄像头
  • 推荐用于环境识别的机器人摄像头
  • python opencv 摄像头_opencv python中摄像头参数的设置
  • 树莓派CSI摄像头使用
  • leetcode 968 监控摄像头
  • 根据硬件ID查看摄像头型号方案,可查任何一款摄像头芯片来源
  • android查看摄像头信息,获取Android设备上的详细的摄像头信息
  • python获取摄像头型号_python opencv设置摄像头分辨率以及各个参数的方法_python
  • python获取摄像头型号,python3.6 opencv获取摄像头代码
  • 我的世界服务器自动被踢怎么可以进去,我的世界中国版服务器中如何解决玩家作弊的简单方法...
  • VS2019+WDK10编写xp平台的驱动
  • Windows XP中手动安装驱动程序的方法
  • xp驱动和Win7驱动的区别
  • windows XP 驱动开发环境搭建
  • 戴尔1420装XP方法和驱动
  • window XP驱动开发(一)如何下载WDK
  • Window XP驱动开发(十) 驱动程序的基本结构
  • (14)[驱动开发]配置环境 VS2019 + WDK10 写 xp驱动