使用js-xlsx将后端返回数据导出为excel(.xlsx格式)

小鱼儿 2023-03-13 06:51 138阅读 0赞
  1. <html lang="en">
  2. <head>
  3. <meta charset="UTF-8">
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  5. <title>Document</title>
  6. </head>
  7. <body>
  8. <!-- <button id="export">Export Sheet to XLSX</button> -->
  9. <button onclick="downloadExl(jsono)">导出xlsx带样式</button>
  10. <button id="export2">导出xlsx</button>
  11. <!-- 使用js-xlsx将后端返回数据导出为excel(.xlsx格式) -->
  12. <!-- 引入的js只能和下面相连的结合使用 使用时请注释掉138行以下-->
  13. <script src="js/xlsx.core.min.js"></script>
  14. <script>
  15. document.getElementById("export2").onclick = function() {
  16. // 导出多张表
  17. // let data = { '基本信息': [{name: '李四', sex: 'nan', age: 12}], '成绩': [{class: '计算机', teacher: 'Mrs wang', score: 90}] };
  18. // let columnHeaders = { '基本信息': ['name', 'sex', 'age'], '成绩': ['class', 'teacher', 'score']}
  19. // outputXlsxFile(
  20. // data,
  21. // [{ wch: 50 }, { wch: 50 }, { wch: 10 }],
  22. // "test-xlsx"
  23. // );
  24. // function outputXlsxFile(data, wscols, xlsxName) {
  25. // let sheetNames = [];
  26. // let sheetsList = {};
  27. // const wb = XLSX.utils.book_new();
  28. // console.log(wb)
  29. // for (let key in data) {
  30. // sheetNames.push(key);
  31. // let columnHeader = columnHeaders[key] // 此处是每个sheet的表头
  32. // let temp = transferData(data[key], columnHeader);
  33. // console.log(temp)
  34. // sheetsList[key] = XLSX.utils.aoa_to_sheet(temp);
  35. // sheetsList[key]["!cols"] = wscols;
  36. // }
  37. // console.log(sheetsList)
  38. // wb["SheetNames"] = sheetNames;
  39. // wb["Sheets"] = sheetsList;
  40. // XLSX.writeFile(wb, xlsxName + ".xlsx");
  41. // }
  42. // function transferData(data, columnHeader) {
  43. // let content = [];
  44. // content.push(columnHeader);
  45. // data.forEach((item, index) => {
  46. // let arr = [];
  47. // columnHeader.map(column =>{
  48. // arr.push(item[column]);
  49. // })
  50. // content.push(arr);
  51. // });
  52. // return content;
  53. // }
  54. // // 导出一张表
  55. var sheetN = '我是表名字,不是导出文件名'
  56. var data = [{name: '后台返回数据11', sex: 'women', age: 56},{name: '后台返回数据2', sex: 'nan', age: 12}]
  57. var columnHeaders = ['name', 'sex', 'age']
  58. outputXlsxFile(
  59. data, // 数据
  60. [{ wch: 50 }, { wch: 50 }, { wch: 10 }], // 列宽
  61. "test-xlsx" // 导出文件名
  62. );
  63. function outputXlsxFile(data, wscols, xlsxName) {
  64. let sheetsList = {};
  65. console.log(XLSX.utils)
  66. const wb = XLSX.utils.book_new();
  67. let temp = transferData(data, columnHeaders);
  68. temp.unshift(['我是表格上面的标题啊标题,不是表头不是表头'])
  69. console.log(temp)
  70. sheetsList[sheetN] = XLSX.utils.aoa_to_sheet(temp);
  71. console.log(XLSX.utils.aoa_to_sheet(temp))
  72. sheetsList[sheetN]["!merges"] = [{ //合并第一行数据,也就是表头[B1,C1,D1,E1]
  73. s: {//s为开始
  74. c: 0,//开始列
  75. r: 0//开始取值范围
  76. },
  77. e: {//e结束
  78. c: 4,//结束列
  79. r: 0//结束范围
  80. }
  81. }];
  82. sheetsList[sheetN]["!cols"] = wscols;
  83. sheetsList[sheetN]["!rows"] = [{ hpx: 50 }];
  84. // console.log(sheetsList)
  85. // 官网写入样式api,但是引入xlsx.core.min.js没用
  86. // sheetsList[sheetN]['A1'].s = { font: { sz: 14, bold: true, color: { rgb: "FFFFAA00" } }, fill: { bgColor: { indexed: 64 }, fgColor: { rgb: "FFFF00" } } }
  87. wb["SheetNames"] = [sheetN];
  88. wb["Sheets"] = sheetsList;
  89. console.log(wb)
  90. XLSX.writeFile(wb, xlsxName + ".xlsx",{defaultCellStyle: { font: {name: 'Arial', sz: '40'}}});
  91. console.log(XLSX.utils)
  92. function transferData(data, columnHeader) {
  93. let content = [];
  94. content.push(columnHeader);
  95. data.forEach((item, index) => {
  96. let arr = [];
  97. columnHeader.map(column =>{
  98. arr.push(item[column]);
  99. })
  100. content.push(arr);
  101. });
  102. return content;
  103. }
  104. }
  105. }
  106. </script>
  107. <!-- 导出带样式 引入的js只能和下面相连的结合使用,注释掉135行以上-->
  108. <!-- <script src="js/xlsx.full.min.js"></script> -->
  109. <script>
  110. function saveAs(obj, fileName) {
  111. var tmpa = document.createElement("a");
  112. tmpa.download = fileName || "下载";
  113. tmpa.href = URL.createObjectURL(obj);
  114. tmpa.click();
  115. setTimeout(function () {
  116. URL.revokeObjectURL(obj);
  117. }, 100);
  118. }
  119. var jsono = [{
  120. "id": 1, "合并的列头1": "数据11", "合并的列头2": "数据12", "合并的列头3": "数据13", "合并的列头4": "数据14",
  121. }, {
  122. "id": 2, "合并的列头1": "数据21", "合并的列头2": "数据22", "合并的列头3": "数据23", "合并的列头4": "数据24",
  123. }];
  124. const wopts = { bookType: 'xlsx', bookSST: true, type: 'binary', cellStyles: true };
  125. function downloadExl(json, type) {
  126. var tmpdata = json[0];
  127. json.unshift({});
  128. var keyMap = []; //获取keys
  129. for (var k in tmpdata) {
  130. keyMap.push(k);
  131. json[0][k] = k;
  132. }
  133. var tmpdata = [];//用来保存转换好的json
  134. json.map((v, i) => keyMap.map((k, j) => Object.assign({}, {
  135. v: v[k],
  136. position: (j > 25 ? getCharCol(j) : String.fromCharCode(65 + j)) + (i + 1)
  137. }))).reduce((prev, next) => prev.concat(next)).forEach((v, i) => tmpdata[v.position] = {
  138. v: v.v
  139. });
  140. var outputPos = Object.keys(tmpdata); //设置区域,比如表格从A1到D10
  141. console.log(tmpdata)
  142. tmpdata["B1"].s = { font: { sz: 14, bold: true, color: { rgb: "FFFFAA00" } }, fill: { bgColor: { indexed: 64 }, fgColor: { rgb: "FFFF00" } } };//<====设置xlsx单元格样式
  143. tmpdata["!merges"] = [{
  144. s: { c: 1, r: 0 },
  145. e: { c: 4, r: 0 }
  146. }];//<====合并单元格
  147. var tmpWB = {
  148. SheetNames: ['mySheet'], //保存的表标题
  149. Sheets: {
  150. 'mySheet': Object.assign({},
  151. tmpdata, //内容
  152. {
  153. '!ref': outputPos[0] + ':' + outputPos[outputPos.length - 1] //设置填充区域
  154. })
  155. }
  156. };
  157. console.log(XLSX.utils)
  158. tmpDown = new Blob([s2ab(XLSX.write(tmpWB,
  159. { bookType: (type == undefined ? 'xlsx' : type), bookSST: false, type: 'binary' }//这里的数据是用来定义导出的格式类型
  160. ))], {
  161. type: ""
  162. });
  163. saveAs(tmpDown, "这里是下载的文件名" + '.' + (wopts.bookType == "biff2" ? "xls" : wopts.bookType));
  164. }
  165. function getCharCol(n) {
  166. let temCol = '',
  167. s = '',
  168. m = 0
  169. while (n > 0) {
  170. m = n % 26 + 1
  171. s = String.fromCharCode(m + 64) + s
  172. n = (n - m) / 26
  173. }
  174. return s
  175. }
  176. function s2ab(s) {
  177. if (typeof ArrayBuffer !== 'undefined') {
  178. var buf = new ArrayBuffer(s.length);
  179. var view = new Uint8Array(buf);
  180. for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
  181. return buf;
  182. } else {
  183. var buf = new Array(s.length);
  184. for (var i = 0; i != s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF;
  185. return buf;
  186. }
  187. }
  188. </script>
  189. <!-- <script>
  190. var ViewModel = function() {
  191. /* use an array of arrays */
  192. this.aoa = ko.observableArray([
  193. [1,2],
  194. [3,4]
  195. ]);
  196. };
  197. // var UserInfos = [
  198. // { id: 1, name: "张三", age: "21", aclass: "1801" },
  199. // { id: 2, name: "李四", age: "22", aclass: "1802" },
  200. // { id: 3, name: "王五", age: "23", aclass: "1803" }
  201. // ];
  202. // var ViewModel = {};
  203. // ViewModel = function ()
  204. // {
  205. // this.aoa = ko.observableArray(UserInfos);
  206. // }
  207. // ko.applyBindings(ViewModel);
  208. var model = new ViewModel();
  209. ko.applyBindings(model);
  210. /* do an update to confirm KO was loaded properly */
  211. // model.aoa([[1,2,3],[4,5,6]]);
  212. // model.aoa.push([7,8,9]);
  213. // model.aoa([[1,2,3],[4,5,6]]);
  214. document.getElementById("export").onclick = function() {
  215. var aoa = [
  216. ['姓名', '性别', '年龄', '注册时间'],
  217. ['张三', null, null, new Date()],
  218. ['李四', '女', 22, new Date()]
  219. ];
  220. var sheet = XLSX.utils.aoa_to_sheet(aoa);
  221. console.log(sheet)
  222. // openDownloadDialog(sheet2blob(sheet), '导出.xlsx');
  223. /* get array of arrays */
  224. var data = model.aoa();
  225. /* convert to worksheet */
  226. var ws = XLSX.utils.aoa_to_sheet(aoa);
  227. /* build new workbook */
  228. var wb = XLSX.utils.book_new();
  229. XLSX.utils.book_append_sheet(wb, ws, "Sheet1");
  230. /* write file */
  231. XLSX.writeFile(wb, "knockout.xlsx")
  232. };
  233. </script> -->
  234. </body>
  235. </html>

发表评论

表情:
评论列表 (有 0 条评论,138人围观)

还没有评论,来说两句吧...

相关阅读