avatar

cooyue

博客网站 - 科越

  • 首页
  • 友链
Home JS 导出 Excel 文件
文章

JS 导出 Excel 文件

Posted 2020-09-28 Updated 2024-06- 7
By Administrator
5~6 min read

JS 导出 Excel 文件

  大家在日常开发的过程中,尤其是B端的项目,很可能会碰到这个需求,将某个表格中的数据,或者是后端传输的数据,作为一个Excel文件进行导出保存。

  我们不可能为每次的突然出现的需求,都重写一次函数,所以我们可以写一个一直可用的公共方法来满足这个“导出”层面的需求,那么我们的函数大概需要注意以下几点:

  • 允许兼容大部分Excel格式,例如xslx、xls、csv等
  • 数据易于导入
  • 自定义的文件名及后缀
  • 低版本兼容

  对于以上几点,CSV是一个很好的缺省格式,当使用时未指定格式时,默认使用CSV进行导出,因为xslx、xls可能会有编码问题,它是二进制的文件,而CSV是文本文件,用记事本即可打开。数据导入我选择标题及内部数据拆开,使用数组导入,这样会更加灵活。对于低版本导入,这边选择的是JS中的Blob对象,这是一个二进制大对象,可以用于保存二进制数据并使用a标签模拟点击进行下载,在各大浏览器,Blob都是有很好的兼容性的,所以基本可以放心使用,这意味着不止React等框架,简单的H5C3页面也是可以使用Blob进行Excel导出的,这里把我的代码贴出,希望能对大家有帮助,必要的注释已经额外在其中补充了。

export const excelExport = ({ dataSource = [], titles = [], fileName = 'data', suffix = 'csv' }) => {

  var dataType = "\uFEFF"; //解决乱码问题
  dataType += titles.join(',');  //添加表格的头
  dataType += '\n'; // 以上是导出的Excel文件头部

  // 从dataSource中取出数据存入数据源(dataType)
  dataSource.map(item => dataType += `${item.join(',')}\n`); 

  // 使用Blob,获得二进制实例
  const csvData = new Blob([dataType], {
    type: 'text/csv'
  });

  // 创建a标签
  const _a = document.createElement('a');
  /**
  * URL.createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的URL
  * 这里相当于为a标签添加了一个下载地址
  */
  _a.href = URL.createObjectURL(csvData);
  // 该a标签点击后会打开新的标签页,人机交互会更加舒适
  _a.target = '_blank';
  // 为a标签规定被下载的超链接目标
  _a.download = `${fileName}.${suffix}`;
  // 将这个制作好的a标签置入body,并在点击之后移除,降低外界感知
  document.body.appendChild(_a);
  _a.click();
  document.body.removeChild(_a);
}

  既然已经展示了我自己的一个导出函数,那么这里也举个例去使用这个函数。这里的情景是一个最简单的导出,需要导出所有的title、data为csv文件。(React代码)

// 这里一般的情况是可以用来保存Table中被选中的项
const [selectedRows, setSelectedRows] = useState<SelectedProps[]>([
  { name: '乔布斯', age: 18 },
  { name: '米卡', age: 21 },
  { name: '起飞', age: 24 },
]);

const column = [
  {
    title: '姓名',
    dataIndex: 'name',
    width: 200,
  }, {
    title: '年龄',
    dataIndex: 'age',
    width: 200,
  }];

// 值得注意的是,由于Excel是二维数据,所以我们的dataSource使用了二维数组去承载数据
excelExport({
  fileName: '表格数据',
  suffix: 'csv',
  titles: column.map(item => item.title),
  dataSource: selectedRows.map(({ name, age }) => [name, age])
})

  这里大家可以根据自己的具体业务逻辑去编写代码,希望对大家有所帮助~

前端
前端 JavaScript
License:  CC BY 4.0
Share

Further Reading

Jan 3, 2025

Nextjs 实现国际化翻译 - App Router 模式解决方案

Nextjs 实现国际化翻译 - App Router 模式解决方案 老板:最近我们网站想部署到国外去啊,我们加一个国际化翻译的功能,O 不 OK? 我:接一下谷歌翻译嘛,啪的一下,很快嗷! 老板:忘了说了,这个翻译最好能自己配置、没有配置文件的话需要兜底、变量插值,如果可以的话,页面的 title

Aug 13, 2023

通过 Node 中间层,实现后端微服务架构中的服务发现和负载均衡

通过 Node 中间层,实现后端微服务架构中的服务发现和负载均衡 要详细解释服务发现和负载均衡的意义,首先我们一定要从从「什么是微服务」,以及「微服务架构的意义」开始讲起 什么是微服务? 微服务架构是一种软件架构风格,它将一个大型的、复杂的应用程序,拆分成多组小型的、独立的服务单元,这些服务单元可以

Aug 9, 2023

三年初心,前端之路:从实习到负责人,我的成长与探索

三年初心,前端之路:从实习到负责人,我的成长与探索 按 20 年入职开始算的话,目前的公司差不多已经待了三年吧,现在已经毕业两年多了,自从 21 年原来的负责人离职后,就一直作为这边的基础设施组的前端 owner,一直带着两三个实习转正的同学负责目前公司的 CICD 平台和一些公司前端的基础建设。这

OLDER

node 实现登录状态持久化

NEWER

前端实习生-字节面试面经一面

Recently Updated

  • Nextjs 实现国际化翻译 - App Router 模式解决方案
  • 通过 Node 中间层,实现后端微服务架构中的服务发现和负载均衡
  • 三年初心,前端之路:从实习到负责人,我的成长与探索
  • 记录一次前端做请求负载处理的思考
  • 从零开始教你使用 storybook + rollup 搭建一个属于自己的 React UI 组件库

Trending Tags

工程 Flutter React JavaScript 面经 前端 负载均衡

Contents

©2025 cooyue. Some rights reserved.

Using the Halo theme Chirpy