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是一款非常方便的只需要纯 ...
随机推荐
- Java9至17的新特性总结
总览 讲讲Java 9-17 的一些语法糖和一些新发布的jeps, 重点讲讲JVM的垃圾回收器 时间线 SpringBoot 为什么选择Java17这个版本.我估计跟下面这个图有关系. Java 8 ...
- 半吊子菜鸟学Web开发5 -- PHP开发环境配置
本文参考自:http://blog.csdn.net/angon823/article/details/54415855 Ubuntu16.04 默认 apt-get install apache2 ...
- @Controller 注解?
该注解表明该类扮演控制器的角色,Spring不需要你继承任何其他控制器基类或引用Servlet API.
- jvm-learning-类加载器分类
public class ClassLoaderTest { public static void main(String[] args) { //获取系统类加载器 ClassLoader syste ...
- spring-boot 注解集合
@Configuration 用于定义配置类,可替换XML配置文件,被注解的类内部包含一个或多个@Bean注解方法.可以被AnnotationConfigApplicationContext或者Ann ...
- Redis 是单进程单线程的?
Redis 是单进程单线程的,redis 利用队列技术将并发访问变为串行访问,消 除了传统数据库串行控制的开销.
- css技术之用最高和最宽的限制“max-height和max-width”做图片同比例缩放,达到图片不变形目的,做出批量打印图片功能,页面打印“window.print()”
一.简介 他们是为流而生的,像width/height这种定死的砖头式布局,min-width/max-width就没有存在的意义 ,min-width/max-width一定是自适应布局或流体布局中 ...
- c语言思维导图
- 删除html标签或标签属性以及样式
JavaScript module for stripping HTML tags and/or HTML element attributes from strings. 安装 npm instal ...
- 微信小程序上拉加载:onReachBottom详解+设置触发距离
前端经常遇到上拉加载更多的需求,一般还涉及到翻页.小程序里已经给了下拉到底的触发方法onReachBottom(),这里记录下怎样使用这个方法实现下拉加载更多,有需要的直接看代码,有详细注释: 1.首 ...