公司最近要為某國企做一個**統計和管理系統,
具體要求包含
- 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]);