近期做了一个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([
            {
                blocks: [
                    { headers:columns, data:data },
                ], sheetName: "销售数据sheet"
            },
        ], "统计报表")

添加一个文件写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文件的更多相关文章

  1. [置顶] Jsp中的table多表头导出excel文件

    首先引入两份JS:copyhtmltoexcel.js以及 tableToExcel.js /* * 默认转换实现函数,如果需要其他功能,需自行扩展 * 参数: * tableID : HTML中Ta ...

  2. Ant Design Pro实现导出Excel

    react Ant Design ProUI框架导出Excel(只能导出当前列表数据) 插件安装 npm install js-export-excel 安装完成之后开始引入 import Expor ...

  3. 关于NPOI导出excel文件(xls和xlsx两种格式)提示格式不符的问题

    这两天在做导出excel文件的时候遇到这个问题 本来我导出的格式是xlsx格式的,但是下载得到的文件格式变成了xls, 一开始以为是返回的contenttype设置错了 return File(ms, ...

  4. 如何使用JavaScript实现纯前端读取和导出excel文件

    js-xlsx 介绍 由SheetJS出品的js-xlsx是一款非常方便的只需要纯JS即可读取和导出excel的工具库,功能强大,支持格式众多,支持xls.xlsx.ods(一种OpenOffice专 ...

  5. JavaScript 上万条数据 导出Excel文件(改装版)

    最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var  ...

  6. JavaScript 上万条数据 导出Excel文件 页面卡死

    最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var  ...

  7. .Net应用导入、导出Excel文件

    本次阐述的导入和导出都围绕此Demo进行

  8. vue+element 表格导出Excel文件

    https://www.cnblogs.com/bobodeboke/p/8867481.html  非常感谢 这个大佬 才让我搞到了Blob.js 和 Export2Excel.js 如果最后运行时 ...

  9. 如何使用JavaScript实现纯前端读取和导出excel文件(转)

    转自小茗同学博客:https://www.cnblogs.com/liuxianan/p/js-excel.html js-xlsx 介绍 由SheetJS出品的js-xlsx是一款非常方便的只需要纯 ...

随机推荐

  1. KestrelServer详解[1]:注册监听终结点(Endpoint)

    具有跨平台能力的KestrelServer是最重要的服务器类型.针对KestrelServer的设置均体现在KestrelServerOptions配置选项上,注册的终结点是它承载的最重要的配置选项. ...

  2. spring-boot-learning- Elasticsearch

    索引==数据库 类型==表 文档==表里面的记录 属性==表里面的列 使用RestFul风格elasticSearch进行操作 添加一个索引为megacorp,类型为employee,--id为1的文 ...

  3. Memcache 与 Redis 的区别都有哪些?

    1.存储方式 Memecache 把数据全部存在内存之中,断电后会挂掉,数据不能 超过内存大小. Redis 有部份存在硬盘上,这样能保证数据的持久性. 2.数据支持类型 Memcache 对数据类型 ...

  4. redis主从复制与哨兵高可用

    redis主从复制 话不多说,直接看案例: 环境准备, 主从规划 主节点:6380 从节点:6381.6382 运行3个redis数据库,达到 1主 2从的配置 #主库 6379.conf port ...

  5. SDS-redis动态字符串

    与C语言类似,redis自己创建了简单动态字符串SDS(Simple Dynamic String)即简单动态字符串,创建字符串类型的键值对,SDS表示字符串值,键值对的值为字符串对象 SDS用途可以 ...

  6. Python - 字符串基础知识

  7. 推荐一个用于压缩图片的JS插件:localResizeIMG

    惯例,先贴传送门:https://github.com/think2011/localResizeIMG 首先说到,为嘛要压缩图片,这需求一般出现在需要上传照片(尤其是移动端)的情况下,现在手机拍出来 ...

  8. 浅谈Nodejs应用的主文件index.js的组成部分

    前言 Node妹子的问世,着实让我们前端攻城狮兴奋了一把,尤其本屌听说Javascript可以写服务端后,兴奋的像是看到了二次元萝莉的胖子...(●'◡'●).呃哼...YY先到这里,原谅本屌是个二次 ...

  9. 实用的 CSS — 贝塞尔曲线(cubic-bezier)

    欢迎移步我的博客阅读:<实用的 CSS - 贝塞尔曲线(cubic-bezier)> 前言 在了解 cubic-bezier 之前,你需要对 CSS3 中的动画效果有所认识,它是 anim ...

  10. vue常用知识点总结

    感谢本文引用链接的各位大佬们,小菜鸟我只是个搬运工 1.谈一谈你理解的vue是什么样子的? vue是数据.视图分离的一个框架,让数据与视图间不会发生直接联系.MVVM 组件化:把整体拆分为各个可以复用 ...