js vue 设置excel单元格样式_vue+elementui 项目纯前端Export2Excel导出excel,并利用xlsx-style设置单元格样式...
1 /*eslint-disable*/
2 require('script-loader!file-saver');3 require('./Blob.js'); //blob.js也是网上找的,下面会贴上代码4 require('script-loader!xlsx/dist/xlsx.core.min');
//注意 直接import xlsx-style会报错,因为npm install xlsx-style 下载下来的依赖 源码有错,需要修改,下面会讲到5 import XLSX from "xlsx-style"
6
7 function generateArray(table) {8 var out =[];9 var rows = table.querySelectorAll('tr');10 var ranges =[];11 for (var R = 0; R < rows.length; ++R) {12 var outRow =[];13 var row =rows[R];14 var columns = row.querySelectorAll('td');15 for (var C = 0; C < columns.length; ++C) {16 var cell =columns[C];17 var colspan = cell.getAttribute('colspan');18 var rowspan = cell.getAttribute('rowspan');19 var cellValue =cell.innerText;20 if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;21
22 //Skip ranges
23 ranges.forEach(function(range) {24 if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <=range.e.c) {25 for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);26 }27 });28
29 //Handle Row Span
30 if (rowspan ||colspan) {31 rowspan = rowspan || 1;32 colspan = colspan || 1;33 ranges.push({34 s: {35 r: R,36 c: outRow.length37 },38 e: {39 r: R + rowspan - 1,40 c: outRow.length + colspan - 1
41 }42 });43 };44
45 //Handle Value
46 outRow.push(cellValue !== "" ? cellValue : null);47
48 //Handle Colspan
49 if(colspan)50 for (var k = 0; k < colspan - 1; ++k) outRow.push(null);51 }52 out.push(outRow);53 }54 return [out, ranges];55 };56
57 function datenum(v, date1904) {58 if (date1904) v += 1462;59 var epoch =Date.parse(v);60 return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);61 }62
63 function sheet_from_array_of_arrays(data, opts) {64 var ws ={};65 var range ={66 s: {67 c: 10000000,68 r: 10000000
69 },70 e: {71 c: 0,72 r: 0
73 }74 };75 for (var R = 0; R != data.length; ++R) {76 for (var C = 0; C != data[R].length; ++C) {77 if (range.s.r > R) range.s.r =R;78 if (range.s.c > C) range.s.c =C;79 if (range.e.r < R) range.e.r =R;80 if (range.e.c < C) range.e.c =C;81 var cell ={82 v: data[R][C]83 };84 if (cell.v == null) continue;85 var cell_ref =XLSX.utils.encode_cell({86 c: C,87 r: R88 });89
90 if (typeof cell.v === 'number') cell.t = 'n';91 else if (typeof cell.v === 'boolean') cell.t = 'b';92 else if(cell.v instanceof Date) {93 cell.t = 'n';94 cell.z = XLSX.SSF._table[14];95 cell.v =datenum(cell.v);96 } else cell.t = 's';97
98 ws[cell_ref] =cell;99 }100 }101 if (range.s.c < 10000000) ws['!ref'] =XLSX.utils.encode_range(range);102 returnws;103 }104
105 function Workbook() {106 if (!(this instanceof Workbook)) return newWorkbook();107 this.SheetNames =[];108 this.Sheets ={};109 }110
111 function s2ab(s) {112 var buf = newArrayBuffer(s.length);113 var view = newUint8Array(buf);114 for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;115 returnbuf;116 }117
118 export function export_table_to_excel(id) {119 var theTable =document.getElementById(id);120 console.log('a')121 var oo =generateArray(theTable);122 var ranges = oo[1];123
124 /*original data*/
125 var data = oo[0];126 var ws_name = "SheetJS";127 console.log(data);128
129 var wb = newWorkbook(),130 ws =sheet_from_array_of_arrays(data);131
132 /*add ranges to worksheet*/
133 //ws['!cols'] = ['apple', 'banan']; //合并单元格
134 ws['!merges'] =ranges;135
136 /*add worksheet to workbook*/
137 wb.SheetNames.push(ws_name);138 wb.Sheets[ws_name] =ws;139
140 var wbout =XLSX.write(wb, {141 bookType: 'xlsx',142 bookSST: false,143 type: 'binary'
144 });145
146 saveAs(newBlob([s2ab(wbout)], {147 type: "application/octet-stream"
148 }), "test.xlsx")149 }150
151 function formatJson(jsonData) {152 console.log(jsonData)153 }154 export function export_json_to_excel(multiHeader, th, merges, data, defaultTitle) {155 data =[...data];156 data.unshift(th);157
158
159 if(multiHeader) {160 data.unshift(multiHeader);161 }162 var ws_name = "SheetJS";163
164 var wb = newWorkbook(),165 ws =sheet_from_array_of_arrays(data);166
167 /*add worksheet to workbook*/
168 wb.SheetNames.push(ws_name);
//合并单元格169 ws["!merges"] =merges;170 wb.Sheets[ws_name] =ws;171
172 var dataInfo = wb.Sheets[wb.SheetNames[0]];173 var cellArr = merges.map(c =>c.s);174 var secArr = merges.map(c =>c.e);175 var cellArr1 =[];176 cellArr.forEach(cellObj =>{177 var cell_ref =XLSX.utils.encode_cell({178 c: cellObj.c,179 r: cellObj.r180 });181 cellArr1.push(cell_ref);182 });183
//设置单元格样式
184 const borderAll ={185 border: {186 //单元格外侧框线
187 top: {188 style: "thin"
189 },190 bottom: {191 style: "thin"
192 },193 left: {194 style: "thin"
195 },196 right: {197 style: "thin"
198 }199 }200 };201 //给所有单元格加上边框
202 for (var i indataInfo) {203 if (i == '!ref' || i == '!merges' || i == '!cols' || $.inArray(i, cellArr1) >= 0) {204
205 } else{206 dataInfo[i + ''].s =borderAll;207 }208 }209 //设置单元格背景色、字体以及字体大小等
210 var bgColArr = ["FDE9D9", 'FFFF00', 'DAEEF3', 'CCC0DA', 'C5D9F1'];211 //设置主标题样式
212 var headerStyle ={213 font: {214 name: '宋体',215 color: {216 rgb: "303133"
217 },218 bold: true,219 italic: false,220 underline: false
221 },222 alignment: {223 horizontal: "center",224 vertical: "center"
225 },226 fill: {227
228 }229 };230 let mm = 0;231 cellArr1.forEach(cellObj =>{232 var hStyle =Object.assign({}, headerStyle);233 hStyle.fill ={234 fgColor: {235 rgb: bgColArr[mm]236 }237 };238 dataInfo[cellObj].s =hStyle;239 mm++;240 });241
242 var secCellStyle =Object.assign({}, borderAll, headerStyle);243 secArr.forEach((s, index) =>{244 var hStyle =Object.assign({}, secCellStyle);245 hStyle.fill ={246 fgColor: {247 rgb: bgColArr[index]248 }249 };250 var startIndex = 0;251 if (index == 0) {252 startIndex = 0;253 } else{254 startIndex = secArr[index - 1].c + 1;255 }256 for (var se = startIndex; se <= s.c; se++) {257 var cell_ref =XLSX.utils.encode_cell({258 c: se,259 r: 1
260 });261 dataInfo[cell_ref].s =hStyle;262 }263 });264
265 var wbout =XLSX.write(wb, {266 bookType: 'xlsx',267 bookSST: false,268 type: 'binary'
269 });270 var title = defaultTitle || '列表'
271 saveAs(newBlob([s2ab(wbout)], {272 type: "application/octet-stream"
273 }), title + ".xlsx")274 }
js vue 设置excel单元格样式_vue+elementui 项目纯前端Export2Excel导出excel,并利用xlsx-style设置单元格样式...相关推荐
- js-xlsx/xlsx-style 纯前端数据导出Excel且支持自定义样式
前端开发过程中经常遇到导出excel的需求.这种情况大多数都是服务端处理数据(QAQ至少我遇到的大多数都是这样),然后返回一个链接,前端不需要管服务端怎么操作直接打开这个链接(window.locat ...
- 使用VUE+XLSX实现纯前端的导出Excel
1. 安装需要的插件 npm i xlsx -S npm i xlsx-style -S npm i file-saver -S 安装完xlsx-style插件并引入后启动项目会报错 ./cptabl ...
- html 导出excel 列被合并,前端实现导出excel单元格合并和调整样式
有些业务场景需要导出excel表格,寻常这类需求其实是服务端完成,但是前端也有可以实现这类需求的库,这里我介绍最近使用过的三个库. 通用电子表格格式(CSF) 单元地址对象存储为{c:C, r:R}, ...
- Vue+Element前端导入导出Excel
1 前言 1.1 业务场景 由前台导入Excel表格,获取批量数据. 根据一个数组导出Excel表格. 2 实现原理 2.1 引入工具库 file-saver.xlsx.script-loader n ...
- 前端自己导出excel表格 不需要调接口(可导出全部的数据)
前端自己导出excel表格 不需要调接口(可导出全部的数据) 1.下载 npm install -S file-saver xlsx 2.把js放在对应的位置 全部复制(Export2Excel.js ...
- 前端实现导出Excel,使用file-saver和 xlsx
前端实现导出Excel npm install -S file-saver xlsx在需要的页面引入 import XLSX from 'xlsx'; 注意:如果出现XLSX 是underfind,可 ...
- sheetJs+xlsx-style——前端实现导出excel表格——设置单元格背景色,居中,自动换行,宽度,百分数展示等
之前写过一篇博客,是关于elementUi-table组件+xlsx插件实现导出--sheetJs的,之前实现的功能有: 根据dom获取内容 创建工作簿 调整单元格的宽度 实现百分数的展示 插入到工作 ...
- Vue用Export2Excel导出excel,多级表头数据
VUE 使用Export2Excel导出数据,以及多级表头 最近公司做项目,需要导出数据到excel表格 使用到了 element UI ,Export2Excel 特此记录,毕竟好记性不如烂笔头 不 ...
- vue 使用Export2Excel导出Excel表格
第1步:添加依赖: 1:npm install -S file-saver2:npm install -S xlsx3:npm install -D script-loader 第2步: (1)随便写 ...
最新文章
- TCP/IP 协议栈及 OSI 参考模型详解--云平台技术栈04
- 闭包block多种应用方式
- 智能路由器-OpenWRT 系列五 (NAS-SMB家庭共享)
- Spring EL方法调用实例
- 关于优酷开发SDK之setOnSeekCompleteListener
- 活学巧用电脑上网实例入门
- 两天学会css基础(一)
- 织梦dede 5.7系统基本参数无法修改保存,提示Token mismatch!
- Spring Boot (八)MyBatis + Docker + MongoDB 4.x
- 基于Smadja算法的搭配词自动提取实践
- Problem C: 爬楼梯
- 每日算法系列【LeetCode 684】冗余连接
- 让UITableView数据处理更轻便
- Windows电脑安装Linux系统的方法-Ubuntu版
- css文本外观属性大全(内附实例与图解)
- 工业级Pass云平台SpringCloudAlibaba综合项目实战(一):序言
- python的安装框架acode_Python安装与入门
- 发光二极管限流电阻(学习笔记)
- 渗透测试工具篇——sqlmap
- No database selected 错误