飞道的博客

js 实现纯前端将数据导出excel两种方式,亲测有效

315人阅读  评论(0)

 

由于项目需要,需要在不调用后台接口的情况下,将json数据导出到excel表格,参考了好多资料以及很多大佬写的博客终于实现,兼容chrome没问题,其他还没有测试过,这边介绍两种实现方式,并附上代码和gif动图,博主不才还望轻喷,代码可直接copy运行

如果文章对你有帮助,关注下我的公众号,二维码在下方,这是对我最好的支持,感恩

方法一

将table标签,包括tr、td等对json数据进行拼接,将table输出到表格上实现,这种方法的弊端在于输出的是伪excel,虽说生成xls为后缀的文件,但文件形式上还是html,代码如下


  
  1. <html>
  2. <head>
  3. <p style="font-size: 20px;color: red;">使用table标签方式将json导出xls文件 </p>
  4. <button onclick='tableToExcel()'>导出 </button>
  5. </head>
  6. <body>
  7. <script>
  8. const tableToExcel = () => {
  9. // 要导出的json数据
  10. const jsonData = [
  11. {
  12. name: '路人甲' ,
  13. phone: '123456' ,
  14. email: '123@123456.com'
  15. },
  16. {
  17. name: '炮灰乙' ,
  18. phone: '123456' ,
  19. email: '123@123456.com'
  20. },
  21. {
  22. name: '土匪丙' ,
  23. phone: '123456' ,
  24. email: '123@123456.com'
  25. },
  26. {
  27. name: '流氓丁' ,
  28. phone: '123456' ,
  29. email: '123@123456.com'
  30. },
  31. ]
  32. // 列标题
  33. let str = '<tr><td>姓名</td><td>电话</td><td>邮箱</td></tr>' ;
  34. // 循环遍历,每行加入tr标签,每个单元格加td标签
  35. for ( let i = 0 ; i < jsonData.length ; i++ ){
  36. str+= '<tr>' ;
  37. for ( const key in jsonData[i]){
  38. // 增加\t为了不让表格显示科学计数法或者其他格式
  39. str+= `<td>${ jsonData[i][key] + '\t'}</td>` ;
  40. }
  41. str+= '</tr>' ;
  42. }
  43. // Worksheet名
  44. const worksheet = 'Sheet1'
  45. const uri = 'data:application/vnd.ms-excel;base64,' ;
  46. // 下载的表格模板数据
  47. const template = `<html xmlns:o="urn:schemas-microsoft-com:office:office"
  48. xmlns:x="urn:schemas-microsoft-com:office:excel"
  49. xmlns="http://www.w3.org/TR/REC-html40">
  50. <head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>
  51. <x:Name> ${worksheet} </x:Name>
  52. <x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>
  53. </x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->
  54. </head><body><table> ${str} </table></body></html>` ;
  55. // 下载模板
  56. window .location.href = uri + base64(template);
  57. };
  58. // 输出base64编码
  59. const base64 = s => window .btoa( unescape ( encodeURIComponent (s)));
  60. </script>
  61. </body>
  62. </html>

 

如图:

 

 

 

 

方法二

通过将json遍历进行字符串拼接,将字符串输出到csv文件,代码如下


  
  1. <html>
  2. <head>
  3. <p style="font-size: 20px;color: red;">使用a标签方式将json导出csv文件 </p>
  4. <button onclick='tableToExcel()'>导出 </button>
  5. </head>
  6. <body>
  7. <script>
  8. const tableToExcel = () => {
  9. // 要导出的json数据
  10. const jsonData = [
  11. {
  12. name: '路人甲' ,
  13. phone: '123456789' ,
  14. email: '000@123456.com'
  15. },
  16. {
  17. name: '炮灰乙' ,
  18. phone: '123456789' ,
  19. email: '000@123456.com'
  20. },
  21. {
  22. name: '土匪丙' ,
  23. phone: '123456789' ,
  24. email: '000@123456.com'
  25. },
  26. {
  27. name: '流氓丁' ,
  28. phone: '123456789' ,
  29. email: '000@123456.com'
  30. },
  31. ];
  32. // 列标题,逗号隔开,每一个逗号就是隔开一个单元格
  33. let str = `姓名,电话,邮箱\n` ;
  34. // 增加\t为了不让表格显示科学计数法或者其他格式
  35. for ( let i = 0 ; i < jsonData.length ; i++ ){
  36. for ( const key in jsonData[i]){
  37. str+= `${jsonData[i][key] + '\t'},` ;
  38. }
  39. str+= '\n' ;
  40. }
  41. // encodeURIComponent解决中文乱码
  42. const uri = 'data:text/csv;charset=utf-8,\ufeff' + encodeURIComponent (str);
  43. // 通过创建a标签实现
  44. const link = document .createElement( "a" );
  45. link.href = uri;
  46. // 对下载的文件命名
  47. link.download = "json数据表.csv" ;
  48. link.click();
  49. }
  50. </script>
  51. </body>
  52. </html>
 

 

 

如图:

 

 

 

 

参考了很多大佬的博客其中这两篇对我启发最大,感谢!


https://blog.csdn.net/oscar999/article/details/16342699
https://blog.csdn.net/aa122273328/article/details/50388673

我的github:https://github.com/hhzzcc

关注我的公众号,可以看更多优质文章哦,公众号刚建不久希望大家多多支持我一下,我也会努力更新更多好文章的 😊

 


转载:https://blog.csdn.net/hhzzcc_/article/details/80419396
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场