更新: 2020-04-15

补上 read excel

先用 file reader 把文件变成 buffer 然后调用 exceljs 就可以了, 它很聪明的哦, date number, boolean 都会弄好好.

有个点需要注意, 如果 value 是 null | empty string 那么 eachCell 的时候会完全 skip 掉哦,

input(e: Event) {
const inputFile = e.target as HTMLInputElement;
const file = inputFile.files[0];
const reader = new FileReader();
reader.onload = async () => {
const workbook = new Workbook();
await workbook.xlsx.load(reader.result); // 把 result 放进去
const worksheet = workbook.getWorksheet('My Sheet');
worksheet.eachRow((row, rowNumber) => {
console.log('row', row);
console.log('rowNumber', rowNumber);
row.eachCell((cell, colNumber) => {
console.log('cell value', cell.value);
console.log('colNumber', colNumber);
});
});
};
reader.readAsArrayBuffer(file);
}

更新: 2020-04-05

number format

https://www.ablebits.com/office-addins-blog/2016/07/07/custom-excel-number-format/

做管理系统经常会需要导出 excel. 毕竟 excel 功能很多, 做图片, 修改结构, 批量操作都很方便.

一般上呢, 这个职责可以让后端去实现的, 前端发个请求就好了.

但是呢, 如果后端实现的话,那么就需要涉及到一些展示的问题. 随着前后端分离, 后端的职责和展现通常是无关的了, 所以把这个任务交给后端并不理想.

既然如此, 那是否可以让前端来完成呢 ?

多亏了 nodejs 的发展, 基本的读写 excel 格式已经有 js 的版本了. nodejs, browser 都可以使用.

比较火的有 2 个库, 一个是 exceljs 另一个是 sheetjs

https://github.com/sheetjs/sheetjs

sheetjs 很火 20k star github, 不过它有分社区版和付费版. 一个重要的 style 功能只有付费版才有 /.\ 我玩了一下最终还是放弃了.

下面说说 exceljs (这个还有中文文档哦)

exceljs 对 angular 非常不友好

https://github.com/exceljs/exceljs/issues/384 ng4 无法使用

https://github.com/exceljs/exceljs/issues/511 ng5 无法使用

https://github.com/exceljs/exceljs/issues/821 ng7 无法使用

https://github.com/exceljs/exceljs/issues/984 ng 8 无法使用

https://github.com/exceljs/exceljs/issues/1150 ng 9 无法使用

没错,一直到我写这一篇, 它依然有 bug (无法使用类型)

但是没有类型也是可以用的嘛, js 本无类型, 我们只是习惯了类型, 但不代表没有它就活不了.

学习资源 :

https://www.ngdevelop.tech/export-to-excel-in-angular-6

https://github.com/exceljs/exceljs#date-value

step 1 安装

"exceljs": "^3.8.1",
"core-js": "^3.6.4",
"regenerator-runtime": "^0.13.3",
"file-saver": "^2.0.2"

  "@types/file-saver": "^2.0.1"

exceljs 本来内依赖了一些 polyfills, 但后来拿掉了, 并要求开发者自己去 import 依赖.

主要依赖是 core-js 和 regenerator-runtime

file-saver 是用来 download excel 的, exceljs 是 nodejs 的东西,它自带的方式是写入 I/O 和 stream, 没有下载的功能,所以我们借助 file-saver 把 stream 下载成 xlsx

step 2 import in app.component.ts

import 'core-js/modules/es.promise';
import 'core-js/modules/es.object.assign';
import 'core-js/modules/es.object.keys';
import 'regenerator-runtime/runtime';
import { Workbook } from 'exceljs';
import * as fs from 'file-saver';

如果想把 polyfills 放到 polyfills.ts 里面也可以. 确保在 import exceljs 之前 import 就可以了.

step 3 代码

async download() {
const workbook = new Workbook();
const worksheet = workbook.addWorksheet('My Sheet');
worksheet.columns = [
{ key: 'string', width: 20, header: 'String' },
{ key: 'textarea', width: 20, header: 'Textarea', style: { alignment: { wrapText: true } } },
{ key: 'number', width: 20, header: 'Number', style: { numFmt: '#,##0.00#######' } },
{ key: 'boolean', width: 20, header: 'Boolean' },
{ key: 'date', width: 20, header: 'Date', style: { numFmt: 'dd-MM-yyyy' } },
{ key: 'datetime', width: 20, header: 'Datetime', style: { numFmt: 'dd-MM-yyyy hh:mm AM/PM' } }
]; worksheet.addRow({
string: 'string',
textarea: 'textarea\r\ntextarea',
number: 55.1,
boolean: true,
date: new Date(2020, 0, 1),
datetime: new Date(Date.UTC(2020, 0, 1, 14, 55, 12)),
}); worksheet.addRow({
string: 'string',
textarea: 'textarea\r\ntextarea',
number: 55.123,
boolean: true,
date: new Date(2020, 0, 1),
datetime: new Date(2020, 0, 1, 14, 50, 32, 123)
}); const buffer = await workbook.xlsx.writeBuffer();
const blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
fs.saveAs(blob, 'CarData.xlsx'); }

step 4: 由于目前有 bug 所以上面这样子 build 的时候会 error 的

  "compilerOptions": {
"paths": {
"exceljs": [
"./node_modules/exceljs/dist/exceljs.bare.min.js"
]
}
}

解决方法就是改 config link to exceljs/dist/exceljs.bare.min.js

一定要是 bare 哦, 这个版本是无依赖的.

同时 tsconfig 要允许 default any "noImplicitAny": false
如果是在写代码的时候想要有 type 提示,那么把上面的注释掉就可以了. 要 serve 的时候才打开
 

目前没有用到 read excel 的功能,以后有在补上.

Angular 学习笔记 work with excel (导出 excel)的更多相关文章

  1. 【Spring学习笔记-MVC-2】spring导出Excel

    说明: 1.结合Spring MVC实现Excel导出功能: 2. 在MVC配置文件中配置Excel视图解析器: 需要的jar包 以poi开头的jar包都是必须的 web.xml <?xml v ...

  2. VSTO学习笔记(十四)Excel数据透视表与PowerPivot

    原文:VSTO学习笔记(十四)Excel数据透视表与PowerPivot 近期公司内部在做一种通用查询报表,方便人力资源分析.统计数据.由于之前公司系统中有一个类似的查询使用Excel数据透视表完成的 ...

  3. VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式

    原文:VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式 Excel包含很多公式,如数学.日期.文本.逻辑等公式,非常方便,可以灵活快捷的对数据进行处理,达到我们想要的效果.Exce ...

  4. VSTO 学习笔记(六)在 Excel 2010中使用RDLC报表

    原文:VSTO 学习笔记(六)在 Excel 2010中使用RDLC报表 Excel具有强大的图表显示.分析功能,这点毋庸置疑,但是如果将常规MIS系统中的数据以报表的形式在Excel中显示,却并不那 ...

  5. angular学习笔记(三十一)-$location(2)

    之前已经介绍了$location服务的基本用法:angular学习笔记(三十一)-$location(1). 这篇是上一篇的进阶,介绍$location的配置,兼容各版本浏览器,等. *注意,这里介绍 ...

  6. angular学习笔记(三十一)-$location(1)

    本篇介绍angular中的$location服务的基本用法,下一篇介绍它的复杂的用法. $location服务的主要作用是用于获取当前url以及改变当前的url,并且存入历史记录. 一. 获取url的 ...

  7. angular学习笔记(三十)-指令(10)-require和controller

    本篇介绍指令的最后两个属性,require和controller 当一个指令需要和父元素指令进行通信的时候,它们就会用到这两个属性,什么意思还是要看栗子: html: <outer‐direct ...

  8. angular学习笔记(三十)-指令(7)-compile和link(2)

    继续上一篇:angular学习笔记(三十)-指令(7)-compile和link(1) 上一篇讲了compile函数的基本概念,接下来详细讲解compile和link的执行顺序. 看一段三个指令嵌套的 ...

  9. angular学习笔记(三十)-指令(7)-compile和link(1)

    这篇主要讲解指令中的compile,以及它和link的微妙的关系. link函数在之前已经讲过了,而compile函数,它和link函数是不能共存的,如果定义了compile属性又定义link属性,那 ...

  10. angular学习笔记(三十)-指令(6)-transclude()方法(又称linker()方法)-模拟ng-repeat指令

    在angular学习笔记(三十)-指令(4)-transclude文章的末尾提到了,如果在指令中需要反复使用被嵌套的那一坨,需要使用transclude()方法. 在angular学习笔记(三十)-指 ...

随机推荐

  1. 基于MindSpore实现BERT对话情绪识别

    本文分享自华为云社区<[昇思25天学习打卡营打卡指南-第二十四天]基于 MindSpore 实现 BERT 对话情绪识别>,作者:JeffDing. 模型简介 BERT全称是来自变换器的双 ...

  2. mysql Using join buffer (Block Nested Loop) join连接查询优化

    最近在优化链表查询的时候发现就算链接的表里面不到1w的数据链接查询也需要10多秒,这个速度简直不能忍受 通过EXPLAIN发现,extra中有数据是Using join buffer (Block N ...

  3. oeasy教您玩转vim - 87 - # 内容查找grep命令

    ​ 内容查找 grep 回忆 上次我们尝试了一下各种在vi中执行外部程序 可以排序 可以改大小写 还可以用管道 直接对于缓冲buffer文件进行操作 还是很方便的 其实还有一个外部命令很重要 根据内容 ...

  4. 玄机-第二章日志分析-apache日志分析

    前言 出息了,这回0元玩玄机了,因为只是日志分析,赶紧导出来就关掉(五分钟内不扣金币) 日志分析只要会点正则然后配合Linux的命令很快就完成这题目了,非应急响应. 简介 账号密码 root apac ...

  5. 爆破字典:linux 敏感文件-01

    linux 中敏感文件 1.0 /apache/apache/conf/httpd.conf /apache/apache2/conf/httpd.conf /apache/php/php.ini / ...

  6. Kubernetes 存储概念之Volumes介绍

    Volumes 默认情况下容器中的磁盘文件是非持久化的,对于运行在容器中的应用来说面临两个问题,第一:当容器挂掉,K8S重启它时,文件将会丢失:第二:当Pod中同时运行多个容器,容器之间需要共享文件时 ...

  7. scratch源码下载 | 超大太空游戏【80MB】

    按方向键或AWSD键控制角色移动,按空格键或X键攻击. 程序超级大,共80MB,耐心等待加载. 截图: 点击下载源码 更多源码访问:小虎鲸scratch资源站

  8. app专项测试:app弱网测试(测试工具)

    app专项测试:app弱网测试(测试工具) 除了常用的 fiddler,charles 可以模拟弱网,还有硬件工具弱网仪 HoloWAN也可以模拟弱网 使用弱网仪有以下优点:1.即插即用,无需调试和复 ...

  9. 大厂面经: 字节跳动 iOS开发实习生-飞书

    好家伙, 线上面试,总时长1h30mins左右 整体流程: 0.自我介绍(0-2mins) 1.做的比较难的事情(15min) 我讲我之前写的一个低开平台,写了一个撤销回退功能,提了个pr,用了节流, ...

  10. Deep Learning —— 异步优化器 —— RMSpropAsync —— 异步RMSprop

    看到了一个概念,叫做异步更新优化器,也就是使用异步的方式实现deep learning中的参数优化的method,这个概念比较新奇,虽然看到的异步更新神经网络的代码比较多,但是很少见到有人单独把异步优 ...