这次为大家分享的是,如何用js写出excel文件的预览。
他方便了pc用户和手机端用户可以无需下载,并且直接在线预览excel文件。
因为excel转html的显示用的是第三方开源库的代码,所以实现上有所限制。具体请参见 所用到开源的库 这些库的说明。
| 支持 | 不支持 |
|---|---|
| 多sheet显示 | 图片显示 |
| 合并后的单元格显示 | 链接,文字样式等 |
| 手机画面优化 |
效果图
PC:
手机:
示例代码
所用到开源的库
js:
jQuery:https://js.cybozu.cn/jquery/3.4.1/jquery.min.js
sheetjs ( js-xlsx ):https://github.com/SheetJS/sheetjs
bootstrap: https://github.com/twbs/bootstrap
css:
https://github.com/FortAwesome/Font-Awesome
https://github.com/keaukraine/bootstrap4-fs-modal (mobile端)
代码
判断是否为excel文件
|
1
2
3
4
|
function checkXls(file) {
let reg = /\.xl(s[xmb]|t[xm]|am|s)$/g;
return reg.test(file);
}
|
加载模态框,显示加载画面,添加预览图标
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
function loadModal(fileInfo) {
let previewElement;
jQuery(".file-image-container-gaia").each(function (i, e) {
let fileName = jQuery(e).children("a:eq(0)").text();
if (fileName == fileInfo.name && jQuery(e).children("button").length == 0) {
previewElement = jQuery(e);
return false;
}
});
if (!previewElement) return;
let modalId = \'myModal\' + fileInfo.fileKey;
let tabId = \'myTab\' + fileInfo.fileKey;
let tabContentId = \'tab-content\' + fileInfo.fileKey;
let $button = $(\'<button type="button" class="btn btn-default" data-toggle="modal" data-target="#\' + modalId + \'"><span class="fa fa-search"></span></button>\');
let myModal =
\'<style type="text/css">td{word-break: keep-all;white-space:nowrap;}</style>\' +
\'<div class="modal fade tab-pane active" id="\' + modalId + \'" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">\' +
\'<div class="modal-dialog modal-xl" style="border-radius:5px" role="document">\' +
\'<div class="modal-content">\' +
\'<div class="modal-header">\' +
\'<h5 class="modal-title">\' + fileInfo.name + \'</h5>\' +
\'<button type="button" class="close" data-dismiss="modal" aria-label="Close">\' +
\'<span aria-hidden="true">×</span>\' +
\'</button>\' +
\'</div>\' +
\'<ul class="nav nav-tabs" id=\' + tabId + \'>\' +
\'</ul>\' +
\'<div id=\' + tabContentId + \' class="tab-content">\' +
\'<div class="d-flex justify-content-center">\' +
\'<div class="spinner-border" role="status">\' +
\'<span class="sr-only">Loading...</span>\' +
\'</div>\' +
\'</div>\' +
\'</div>\' +
\'<div class="modal-footer">\' +
\'<button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>\' +
\'</div>\' +
\'</div>\' +
\'</div>\' +
\'</div>\';
previewElement.append($button);
$(\'body\').prepend(myModal);
$(\'#\' + modalId).on(\'shown.bs.modal\', function (e) {
loadRemoteFile(fileInfo);
})
}
|
下载文件并加载到模态框中
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
function readWorkbookFromRemoteFile(url, callback) {
let xhr = new XMLHttpRequest();
xhr.open(\'get\', url, true);
xhr.setRequestHeader(\'X-Requested-With\', \'XMLHttpRequest\');
xhr.responseType = \'arraybuffer\';
xhr.onload = function (e) {
if (xhr.status == 200) {
let data = new Uint8Array(xhr.response)
let workbook = XLSX.read(data, { type: \'array\' });
if (callback) callback(workbook);
}
};
xhr.send();
}
function readWorkbook(workbook, fileInfo) {
let sheetNames = workbook.SheetNames;
let navHtml = \'\';
let tabHtml = \'\';
let myTabId = \'myTab\' + fileInfo.fileKey;
let tabContentId = \'tab-content\' + fileInfo.fileKey;
for (let index = 0; index < sheetNames.length; index++) {
let sheetName = sheetNames[index];
let worksheet = workbook.Sheets[sheetName];
let sheetHtml = XLSX.utils.sheet_to_html(worksheet);
let tabid = "tab" + fileInfo.fileKey + "-" + index;
let xlsid = "xlsid" + fileInfo.fileKey + "-" + index;
let active = index == 0 ? "active" : \'\';
navHtml += \'<li class="nav-item"><a class="nav-link \' + active + \'" href="#" data-target="#\' + tabid + \'" data-toggle="tab">\' + sheetName + \'</a></li>\';
tabHtml += \'<div id="\' + tabid + \'" class="tab-pane \' + active + \'" style="padding:10px;overflow:auto;height:600px" >\' +
\'<div id="\' + xlsid + \'">\' + sheetHtml + \' </div></div>\';
}
jQuery("#" + myTabId).html(navHtml);
jQuery("#" + tabContentId).html(tabHtml);
jQuery("#" + tabContentId + \' table\').addClass("table table-bordered table-hover");
}
function loadRemoteFile(fileInfo) {
let fileUrl = \'/k/v1/file.json?fileKey=\' + fileInfo.fileKey;
readWorkbookFromRemoteFile(fileUrl, function (workbook) {
readWorkbook(workbook, fileInfo);
});
}
|
具体的mobile优化等等详细代码请参考完整文章:
更多文章和演示:Kintone demo环境