更新: 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. KubeCube 新增版本转换:K8s 尝鲜再也不用担心影响老版本了

    多租户可视化 K8s 管理平台KubeCube近日迎来了新版本的发布,新版本增加了 K8s 版本转化.HNC GA 版本适配.审计信息国际化.warden 主动上报模式,为集群和项目设置 Ingres ...

  2. [WUSTCTF2020]朴实无华(命令执行)

    请求头问题 去查了一下资料了解了一下没有什莫用 robots.txt 中有东西 假flag 但是请求头里有重要消息 访问页面/fl4g.php <img src="/img.jpg&q ...

  3. 【楔子】单细胞测序-最佳的分析Pipeline

    作者:starlitnightly 日期:2023.07.14 !!! note 楔子 从事单细胞分析也有一段时间了,国内大部分中文教程都是使用R语言进行分析,使用Python的还比较少,或者是直译s ...

  4. 使用 @Audited 增强Spring Boot 应用程序的数据审计能力

    介绍 在Spring Boot开发的动态世界中,确保数据完整性和跟踪变化是至关重要的.实现这一目标的一个强大工具是@Audited注解.本文深入探讨了该注解的复杂性.其目的.实现步骤以及如何利用其功能 ...

  5. Fiddler的工作原理

    Fiddler是位于客户端和服务器端中间的HTTP代理,是目前最常用的http抓包工具之一 . Fiddler抓取客户端和服务器之间的所有HTTP请求后进行分析.断点.过滤等操作. Fiddler可以 ...

  6. (续)在深度计算框架MindSpore中如何对不持续的计算进行处理——对数据集进行一定epoch数量的训练后,进行其他工作处理,再返回来接着进行一定epoch数量的训练——单步计算

    内容接前文: https://www.cnblogs.com/devilmaycry812839668/p/14988686.html 这里我们考虑的数据集是自建数据集,那么效果又会如何呢??? im ...

  7. gym.wrappers.Monitor报错,无法使用

    使用gym中的录制功能,报错,具体: >>> import gym >>> gym.wrappers.MonitorTraceback (most recent c ...

  8. 为什么不建议在华为技术论坛(昇腾论坛/mindspore技术论坛)发表帖子和技术博客

    华为的硬件设计技术在国内没得说,华为的硬件制造技术基本就没听说过,而华为的软件技术可是出了名的不咋样.一年前曾经在昇腾的页面进入到华为技术论坛,并且发了几篇关于mindspore的编译问题的帖子,由于 ...

  9. spring5的新特性

    1.背景 2.依赖环境的变化 整个 Spring5 框架的代码基于 Java8,运行时兼容 JDK9,许多不建议使用的类和方 法在代码库中删除 3.自带了通用的日志封装 3.1.日志的简单使用 Spr ...

  10. Spring Boot 基于 SCRAM 认证集成 Kafka 的详解

    一.说明 在现代微服务架构中,Kafka 作为消息中间件被广泛使用,而安全性则是其中的一个关键因素.在本篇文章中,我们将探讨如何在 Spring Boot 应用中集成 Kafka 并使用 SCRAM ...