React ant table 用 XLSX 导出excel文件
近期做了一个react ant design 的table转换成excel 的功能 总结下
首先我们会自己定义下 antdesign 的table的columns其中有可能有多语言或者是render方法的转换显示(比如说加特殊符号或者属性的code转换成对应的显示名称)都可以应用上
比如
const columns = [{
title: 'Qty',
dataIndex: 'quantity',
key: 'quantity'
}, {
title: intl.get("totaldiscount").d('Total Discount Price'),
dataIndex: 'price',
key: 'price',
render: text => {
var msg = text
switch (text) {
case "":
''
break;
default:
msg => "¥" + msg
break;
}
return msg
}
}]
const data=[{qty:1,price;10},{qty:2,price;20}]
添加一个文件写exportExcel的function
支持同时生成多个sheet
1 import XLSX from 'xlsx';
2 import { message } from 'antd';
3 import { isBlank } from './PubUtils'
4
5 //exportExcel sheets=[blocks:[{headers:[],data:[]}],sheetName:""}]
6 // fileName =""
7 function exportExcel(sheets, fileName = 'dowloadFile') {
8 if (sheets.length <= 0) {
9 message.error("no data download")
10 return
11 }
12 13 const sheetsArr = sheets.map(sheet => {
14 let Count = 1
15 let colsWidth = []
16 let sheetOutPut = {}
17 18 sheet.blocks.map(
19 block => {
20 if (block.headers.length <= 0) {
21 message.error("no data download")
22 return
23 }
24 const blockHeaders = block.headers.filter(item => !item.excelHidden)
25 const _headers = blockHeaders
26 .map((item, i) => Object.assign({}, { key: item.key, title: item.title, position: getPostition(i) + Count }))
27 .reduce((prev, next) => Object.assign({}, prev, { [next.position]: { key: next.key, v: next.title } }), {});
28 console.log("_headers==", _headers)
29 Count++
30 let dataArr = [], _data = {}
31 //有数据时进行处理
32 if (block.data && block.data.length > 0) {
33 dataArr = block.data
34 .map((item, i) => blockHeaders.map((head, j) => {
35 let content = ""
36 let position = getPostition(j) + (i + Count)
37 if (head.excelRender) {
38 content = head.excelRender(item[head.dataIndex], item, i)
39 } else if (head.render) {
40 content = head.render(item[head.dataIndex], item, i)
41 } else {
42 content = item[head.dataIndex]
43 }
44 content = isBlank(content) ? "" : content
45 // 转换成 worksheet 需要的结构
46 _data[position] = { v: content }
47 return { content, position }
48 }
49 ))
50 }
51 colsWidth = getColWidth(colsWidth, block.headers, dataArr)
52 Count += dataArr.length + 1
53 // 合并 headers 和 data
54 sheetOutPut = Object.assign({}, sheetOutPut, _headers, _data);
55 }
56 )
57 if (colsWidth.length <= 0) {
58 message.error("no data download")
59 return Object.assign(
60 { sheetName: sheet.sheetName },
61 )
62 }
63 // 计算出范围 ,["A1",..., "H2"]
64 const ref = `A1:${getPostition(colsWidth.length - 1) + '' + Count}`;
65 return Object.assign(
66 { sheetName: sheet.sheetName },
67 sheetOutPut,
68 {
69 '!ref': ref,
70 '!cols': colsWidth,
71 },
72 )
73 })
74 const sheetNames = sheetsArr.map(sheet => sheet.sheetName)
75 const wbSheets = sheetsArr.reduce((prev, next) =>
76 Object.assign({}, prev, { [next.sheetName]: next }), {})
77 // 构建 workbook 对象
78 const wb = {
79 SheetNames: sheetNames,
80 Sheets: wbSheets,
81 };
82 // 导出 Excel
83 XLSX.writeFile(wb, fileName + ".xlsx");
84 }
85
86 function getPostition(index) {
87 let result = String.fromCharCode(65 + parseInt(index % 26))
88 let value = index / 26
89 while (value >= 1) {
90 value = value - 1
91 result = String.fromCharCode(65 + parseInt(value % 26)) + result
92 value = parseInt(value / 26)
93 }
94 return result
95 }
96 function getColWidth(preColWidth, headers, dataArr) {
97 const allWch = [headers,].concat(dataArr).map(item => item.map(val => {
98 let value = val.title || val.content || ""
99 let length = 10
100 /*先判断是否为null/undefined*/
101 if (value) {
102 /*再判断是否为中文*/
103 if (value.toString().charCodeAt(0) > 255) {
104 length = value.toString().length * 2
105 } else {
106 length = value.toString().length
107 }
108 }
109 return {
110 'wch': length < 40 ? length : 40
111 };
112 }))
113 if (preColWidth.length < allWch[0].length) {
114 preColWidth = preColWidth.concat(allWch[0].slice(preColWidth.length))
115 }
116 let colWidth = preColWidth
117 for (let i = 0; i < allWch.length; i++) {
118 for (let j = 0; j < allWch[i].length; j++) {
119 if (colWidth[j]['wch'] < allWch[i][j]['wch']) {
120 colWidth[j]['wch'] = allWch[i][j]['wch'];
121 }
122 }
123 }
124 return colWidth
125 }
126 export default exportExcel;
React ant table 用 XLSX 导出excel文件的更多相关文章
- [置顶] Jsp中的table多表头导出excel文件
首先引入两份JS:copyhtmltoexcel.js以及 tableToExcel.js /* * 默认转换实现函数,如果需要其他功能,需自行扩展 * 参数: * tableID : HTML中Ta ...
- Ant Design Pro实现导出Excel
react Ant Design ProUI框架导出Excel(只能导出当前列表数据) 插件安装 npm install js-export-excel 安装完成之后开始引入 import Expor ...
- 关于NPOI导出excel文件(xls和xlsx两种格式)提示格式不符的问题
这两天在做导出excel文件的时候遇到这个问题 本来我导出的格式是xlsx格式的,但是下载得到的文件格式变成了xls, 一开始以为是返回的contenttype设置错了 return File(ms, ...
- 如何使用JavaScript实现纯前端读取和导出excel文件
js-xlsx 介绍 由SheetJS出品的js-xlsx是一款非常方便的只需要纯JS即可读取和导出excel的工具库,功能强大,支持格式众多,支持xls.xlsx.ods(一种OpenOffice专 ...
- JavaScript 上万条数据 导出Excel文件(改装版)
最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var ...
- JavaScript 上万条数据 导出Excel文件 页面卡死
最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var ...
- .Net应用导入、导出Excel文件
本次阐述的导入和导出都围绕此Demo进行
- vue+element 表格导出Excel文件
https://www.cnblogs.com/bobodeboke/p/8867481.html 非常感谢 这个大佬 才让我搞到了Blob.js 和 Export2Excel.js 如果最后运行时 ...
- 如何使用JavaScript实现纯前端读取和导出excel文件(转)
转自小茗同学博客:https://www.cnblogs.com/liuxianan/p/js-excel.html js-xlsx 介绍 由SheetJS出品的js-xlsx是一款非常方便的只需要纯 ...
随机推荐
- synchronized已经不在臃肿了,放下对他的成见之初识轻量级锁
前言 物竞天择,适者生存.JDK也在不断的优化中.关于JDK中synchronized锁内部也是不断的优化,前面我们分析了偏向锁用来解决初期问题,随着争抢的不断堆积轻量级锁营运而生. 关注我,一个不断 ...
- Citus 分布式 PostgreSQL 集群 - SQL Reference(查询分布式表 SQL)
如前几节所述,Citus 是一个扩展,它扩展了最新的 PostgreSQL 以进行分布式执行.这意味着您可以在 Citus 协调器上使用标准 PostgreSQL SELECT 查询进行查询. Cit ...
- docker之间如何通讯的
Docker 查看容器 IP 地址 查看Docker的底层信息. docker inspect 会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息 docker inspect ...
- 什么是 Mybatis?
1.Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时 只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动.创建连接.创建 statement 等繁杂的过程. ...
- 使用Pycharm IDE工具,使用input()函数出现>?符号
Python Console === 如果你是要Pycharm开发Python项目时,出现使用input函数,提示 >? 符号的时候,那应该是开启了Python Console控制台输出,取 ...
- 说一下 jvm 有哪些垃圾回收器?
新生代收集器: SerialParNewParallel Scavenge 老年代收集器: Serial OldCMSParallel Old 堆内存垃圾收集器: G1 参考链接:JVM常见的垃圾回收 ...
- 使用redis作为django缓存数据库
1.Redis的Windows版本.打开https://github.com/MSOpenTech/redis/releases下载msi安装包.该版本是64位.安装msi过程中,有个选项是否加入系统 ...
- 设置IE的自动导包器
一丶打开IE设置: 快捷键:Ctrl+Alt+S 二丶将Add unambiguous imports on the fly 选中即可: 三丶设置好后别忘了"OK":
- PhantomJS,隐身浏览器
PhantomJS PhantomJS是一个无界面的浏览器,实现了传统浏览器的所有功能,除了没有界面,因此,这是一个隐身浏览器. PhantomJS官网 API,特别需要注意的是Web Page Mo ...
- 我的python学习记04
列表,元组,字典的使用一.列表列表的格式:list[元素1,元素2,--]列表也是一个有序集合,下标索引从0开始与字符串类似1.在列表中添加数据append:list.append(添加元素) (在最 ...