用JS实现excel预览

18 篇文章 1 订阅
3 篇文章 0 订阅

这次为大家分享的是,如何用js写出excel文件的预览。

他方便了pc用户和手机端用户可以无需下载,并且直接在线预览excel文件。

因为excel转html的显示用的是第三方开源库的代码,所以实现上有所限制。具体请参见 所用到开源的库 这些库的说明。

支持不支持
多sheet显示图片显示
合并后的单元格显示链接,文字样式等
手机画面优化

效果图

PC:

0015ed4c2338e02748a6246ec14c321

手机:

0015ed4c232e459910f436f2bcc0458

示例代码

所用到开源的库

js:

jQuery:https://js.cybozu.cn/jquery/3.4.1/jquery.min.js

sheetjs ( js-xlsx ):GitHub - SheetJS/sheetjs: SheetJS Community Edition -- Spreadsheet Data Toolkit

bootstrap: GitHub - twbs/bootstrap: The most popular HTML, CSS, and JavaScript framework for developing responsive, mobile first projects on the web.

css:

GitHub - FortAwesome/Font-Awesome: The iconic SVG, font, and CSS toolkit

GitHub - keaukraine/bootstrap4-fs-modal: A simple way to improve UX of Bootstrap 4 modals on mobile phones. (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">&times;</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 excel预览插件

更多文章和演示:Kintone demo环境

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值