更新: 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. Top monitor[2.1.11] 开源

    说明 本项目将转为开源项目. \(\text{GitHub}\) 仓库下载链接 \(|\) 项目初始化下载 \(|\) 项目编辑文件下载. 项目说明 声明:此项目由 \(\text{So_noSlac ...

  2. TIER 0: Redeemer

    TIER 0: Redeemer Redis Remote Dictionary Server 是一个开源的内存数据存储系统 Redis 是完全基于 内存,"内存"数据库的数据检索 ...

  3. Vue 基于vue-codemirror实现的代码编辑器

    基于vue-codemirror实现的代码编辑器 开发环境 jshint 2.11.1 jsonlint 1.6.3 script-loader 0.7.2 vue 2.6.11 vue-codemi ...

  4. 全网最好看的单细胞umap图绘制教程

    全网最好看的单细胞umap图绘制教程 作者按 大家或许都曾被Nature, Science上的单细胞umap图吸引过,不免心生崇拜.在这里,我们将介绍一种简单方便的顶刊级umap图可视化 全文字数|预 ...

  5. 关于android的图像视图的基本了解

    最好直接复制进去而不是拖进去 图片直接导入最好用小写字母命名,数字与字母之间要用_,而且数字好像不可以连用 centerInside,fitCenter,center的区别: centerInside ...

  6. scratch打乒乓球源码免费下载

    点击下载

  7. scratch源码下载 | 炮轰僵尸

    程序说明: <炮轰僵尸>是一款基于Scratch平台制作的游戏程序,它采用了植物大战僵尸的经典场景.在游戏中,玩家需要控制一枚大炮来对抗不断入侵的僵尸.通过移动鼠标,玩家可以调整炮筒的方向 ...

  8. JDK安装教程(Windows)

    Windows 端: 1. 安装 首先进入官网:https://www.oracle.com/java/technologies/javase-downloads.html 因为我已经安装了 JDK8 ...

  9. 对比python学julia(第四章:人工智能)--(第二节)人脸识别

    2.1.  项目简介 人脸识别是基于人的脸部特征信息进行身份识别的一种图像识别技术.使用0PenCV 进行人脸识别的过程如下. (1)  针对每个识别对象收集大量的人脸图傣作为样本. (2)  将样本 ...

  10. 【RabbitMQ】01 简单模式

    参考自腾讯云的实验课堂,减少部署时间的折腾 1.创建Erlang.Repo库 curl -s https://packagecloud.io/install/repositories/rabbitmq ...