公司最近要为某国企做一个**统计和管理系统,
具体要求包含
- Excel导入导出
- 根据导入的数据进行展示报表
- 图表展示(包括柱状图,折线图,饼图),而且还要求要有动画效果,扁平化风格
- Excel导出,并要提供客户端来管理Excel 文件
- ...
要求真多!
现在总算是完成了,于是将我的经验分析出来。
经过小组探讨,我们决定使用另外一款前端控件,叫做 Wijmo。
首先,从网站上下载Wijmo包,这个控件没有提供npm和bower等方式。
然后将我需要的包导入进来
<script src="./wijmo/dist/controls/wijmo.min.js"></script>
<script src="./wijmo/dist/controls/wijmo.grid.min.js"></script>
<script src="./wijmo/dist/controls/wijmo.grid.detail.min.js"></script>
<script src="./wijmo/dist/controls/wijmo.grid.xlsx.min.js"></script>
<script src="./wijmo/dist/controls/wijmo.xlsx.min.js"></script>
此外,还有引入一个jszip的包,是使用js来解压压缩包的一个库。(由于MS的open xml技术,xlsx文件都可以解压成为xml文件,app.xml 里包含了主要的数据)。
<script src="./jszip.min.js"></script>
读取文件的操作和上面都是一样的
var handleDrop = function (file) {
var reader,
workbook;
if (file) {
reader = new FileReader;
reader.onload = function (e) {
workbook = new wijmo.xlsx.Workbook(),
workbook.load(reader.result);
};
reader.readAsDataURL(file);
}
}
通过
workbook = new wijmo.xlsx.Workbook();
workbook.load(reader.result);
这两行代码将excel文件加载到内存 中的workbook对象。
打印workbook对象,
打印这个对象发现,workbook里面包含sheets数组,每个sheet包含rows数组,每个row包含cells数组,每个cell里面vaule属性就是单元格的值。
这简直太又好了
下面实现一个函数 getCollectionView ,以对象数组的方式来获取数据
var getCollectionView = function (workbook) {
var collectionView = [];
if (workbook) {
var sheet = workbook.sheets[0],
header = [];
然后需要一个表格将数据呈现出来,这里我直接使用了Wijmo的FlexGrid表格。
gridDiv = document.createElement(''div'');
gridDiv.classList.add(''grid'');
dataGrid = new wijmo.grid.FlexGrid(gridDiv);
好了,经过上面几个步骤,导入Excel到表格已经实现了
这是完整的js代码:
index.js
(function () {
var dataGrid = null,
gridDiv = null,
workbook = null;
window.addEventListener(''load'', function () {
gridDiv = document.createElement(''div'');
gridDiv.classList.add(''grid'');
dataGrid = new wijmo.grid.FlexGrid(gridDiv);
var target = document.querySelector(''#target'');
target.addEventListener(''dragenter'', function (e) {
e.preventDefault();
this.classList.remove(''hover'');
});
target.addEventListener(''dragleave'', function (e) {
e.preventDefault();
this.classList.add(''hover'');
});
target.addEventListener(''dragover'', function (e) {
e.preventDefault();
this.classList.remove(''hover'');
});
target.addEventListener(''drop'', function (e) {
e.preventDefault();
handleDrop(e.dataTransfer.files[0]);