Angular 学习笔记 work with excel (导出 excel)
更新: 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"
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 哦, 这个版本是无依赖的.
目前没有用到 read excel 的功能,以后有在补上.
Angular 学习笔记 work with excel (导出 excel)的更多相关文章
- 【Spring学习笔记-MVC-2】spring导出Excel
说明: 1.结合Spring MVC实现Excel导出功能: 2. 在MVC配置文件中配置Excel视图解析器: 需要的jar包 以poi开头的jar包都是必须的 web.xml <?xml v ...
- VSTO学习笔记(十四)Excel数据透视表与PowerPivot
原文:VSTO学习笔记(十四)Excel数据透视表与PowerPivot 近期公司内部在做一种通用查询报表,方便人力资源分析.统计数据.由于之前公司系统中有一个类似的查询使用Excel数据透视表完成的 ...
- VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式
原文:VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式 Excel包含很多公式,如数学.日期.文本.逻辑等公式,非常方便,可以灵活快捷的对数据进行处理,达到我们想要的效果.Exce ...
- VSTO 学习笔记(六)在 Excel 2010中使用RDLC报表
原文:VSTO 学习笔记(六)在 Excel 2010中使用RDLC报表 Excel具有强大的图表显示.分析功能,这点毋庸置疑,但是如果将常规MIS系统中的数据以报表的形式在Excel中显示,却并不那 ...
- angular学习笔记(三十一)-$location(2)
之前已经介绍了$location服务的基本用法:angular学习笔记(三十一)-$location(1). 这篇是上一篇的进阶,介绍$location的配置,兼容各版本浏览器,等. *注意,这里介绍 ...
- angular学习笔记(三十一)-$location(1)
本篇介绍angular中的$location服务的基本用法,下一篇介绍它的复杂的用法. $location服务的主要作用是用于获取当前url以及改变当前的url,并且存入历史记录. 一. 获取url的 ...
- angular学习笔记(三十)-指令(10)-require和controller
本篇介绍指令的最后两个属性,require和controller 当一个指令需要和父元素指令进行通信的时候,它们就会用到这两个属性,什么意思还是要看栗子: html: <outer‐direct ...
- angular学习笔记(三十)-指令(7)-compile和link(2)
继续上一篇:angular学习笔记(三十)-指令(7)-compile和link(1) 上一篇讲了compile函数的基本概念,接下来详细讲解compile和link的执行顺序. 看一段三个指令嵌套的 ...
- angular学习笔记(三十)-指令(7)-compile和link(1)
这篇主要讲解指令中的compile,以及它和link的微妙的关系. link函数在之前已经讲过了,而compile函数,它和link函数是不能共存的,如果定义了compile属性又定义link属性,那 ...
- angular学习笔记(三十)-指令(6)-transclude()方法(又称linker()方法)-模拟ng-repeat指令
在angular学习笔记(三十)-指令(4)-transclude文章的末尾提到了,如果在指令中需要反复使用被嵌套的那一坨,需要使用transclude()方法. 在angular学习笔记(三十)-指 ...
随机推荐
- 暑假Java自学每日进度总结1
今日所学: 一.常用的cmd命令: 1>盘符: 2>dir(显示当前文件所有目录) 3>cd 目录(打开该目录) 4>cd..(回到上一目录) 5>cd(回到当前盘符初始 ...
- Display、Visibility 和 Opacity 的区别
<style> .d1{ display: none; } .d2{ visibility: visible; } .d3{ opacity: 0; } </style> &l ...
- Bootstrip HTML 查询搜索常用格式模版
Bootstrip HTML 查询搜索常用格式模版 <form class="form-inline my-3 d-flex align-items-center justify-co ...
- ctfshow sql-labs(笔记)
这是当时做题的时候记得笔记有些乱看不懂的可以私我 判断闭合方式: id=1' and 1=1–+ *正常回显* id=1' and 1=2–+ *异常回显* id=1 and 1=1 *正常回显* i ...
- [oeasy]python0031_挂起进程_恢复进程_进程切换
查看进程 回忆上次内容 上次修改了 $PATH 路径 把当前用户shiyanlou的宿主文件夹 ~ 添加到 $PATH 中 这样 sleep.py 就可以被找到 于是就可以被执行了 还可以把配置 ...
- vue小知识~使用$attrs和$listeners接收父组件转来的属性和方法
一般下我们子组件获取父组件传过来的的值得时候,我们是使用props来接收,但是如果我们父组件转过来的值是给孙组件使用时,使用哪个props接收的方式太过麻烦. 这是vue为我们提供了一个实例$attr ...
- 安卓开发 StateListDrawable 应用
基础部份 StateListDrawable 安卓开发中,如果要做一个按扭按下改变背景,或获取焦点改变背景,最简单的方法是利用将背景指向一个资源,然后果在资源中配置事件,总共分为三步, 1) ...
- windows环境xampp搭建php电商项目/搭建禅道
windows环境xampp搭建php论坛/电商项目 一,首先下载xampp https://www.apachefriends.org/zh_cn/index.html 下载之后解压到E盘或者F盘的 ...
- 火山引擎VeDI数据技术分享:两个步骤,为Parquet降本提效
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 作者:王恩策.徐庆 火山引擎 LAS 团队 火山引擎数智平台 VeDI 是火山引擎推出的新一代企业数据智能平台,基 ...
- 从web2的用户名密码登录到web3的钱包签名认证
Web2 都有哪些常用的认证场景 早期我们使用网页类 Web2 应用时,大多采用账号 + 密码的认证方式访问.为了方便很多网站设置的都是相同的密码(这很不安全). 随着移动应用的普及,慢慢我们习惯了手 ...