Export2Excel.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. /* eslint-disable */
  2. require('script-loader!file-saver');
  3. require('./Blob');
  4. require('script-loader!xlsx/dist/xlsx.core.min');
  5. // require('script-loader!xlsx-style/dist/xlsx.core.min');
  6. function generateArray(table) {
  7. var out = [];
  8. var rows = table.querySelectorAll('tr');
  9. var ranges = [];
  10. for (var R = 0; R < rows.length; ++R) {
  11. var outRow = [];
  12. var row = rows[R];
  13. var columns = row.querySelectorAll('td');
  14. for (var C = 0; C < columns.length; ++C) {
  15. var cell = columns[C];
  16. var colspan = cell.getAttribute('colspan');
  17. var rowspan = cell.getAttribute('rowspan');
  18. var cellValue = cell.innerText;
  19. if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;
  20. //Skip ranges
  21. ranges.forEach(function (range) {
  22. if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
  23. for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
  24. }
  25. });
  26. //Handle Row Span
  27. if (rowspan || colspan) {
  28. rowspan = rowspan || 1;
  29. colspan = colspan || 1;
  30. ranges.push({s: {r: R, c: outRow.length}, e: {r: R + rowspan - 1, c: outRow.length + colspan - 1}});
  31. }
  32. ;
  33. //Handle Value
  34. outRow.push(cellValue !== "" ? cellValue : null);
  35. //Handle Colspan
  36. if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
  37. }
  38. out.push(outRow);
  39. }
  40. return [out, ranges];
  41. };
  42. function datenum(v, date1904) {
  43. if (date1904) v += 1462;
  44. var epoch = Date.parse(v);
  45. return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
  46. }
  47. function sheet_from_array_of_arrays(data, opts) {
  48. var ws = {};
  49. var range = {s: {c: 10000000, r: 10000000}, e: {c: 0, r: 0}};
  50. for (var R = 0; R != data.length; ++R) {
  51. for (var C = 0; C != data[R].length; ++C) {
  52. if (range.s.r > R) range.s.r = R;
  53. if (range.s.c > C) range.s.c = C;
  54. if (range.e.r < R) range.e.r = R;
  55. if (range.e.c < C) range.e.c = C;
  56. var cell = {v: data[R][C]};
  57. if (cell.v == null) continue;
  58. var cell_ref = XLSX.utils.encode_cell({c: C, r: R});
  59. if (typeof cell.v === 'number') cell.t = 'n';
  60. else if (typeof cell.v === 'boolean') cell.t = 'b';
  61. else if (cell.v instanceof Date) {
  62. cell.t = 'n';
  63. cell.z = XLSX.SSF._table[14];
  64. cell.v = datenum(cell.v);
  65. }
  66. else cell.t = 's';
  67. ws[cell_ref] = cell;
  68. }
  69. }
  70. if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
  71. return ws;
  72. }
  73. function Workbook() {
  74. if (!(this instanceof Workbook)) return new Workbook();
  75. this.SheetNames = [];
  76. this.Sheets = {};
  77. }
  78. function s2ab(s) {
  79. var buf = new ArrayBuffer(s.length);
  80. var view = new Uint8Array(buf);
  81. for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
  82. return buf;
  83. }
  84. export function export_table_to_excel(id) {
  85. var theTable = document.getElementById(id);
  86. console.log('a')
  87. var oo = generateArray(theTable);
  88. var ranges = oo[1];
  89. /* original data */
  90. var data = oo[0];
  91. var ws_name = "SheetJS";
  92. console.log(data);
  93. var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);
  94. /* add ranges to worksheet */
  95. // ws['!cols'] = ['apple', 'banan'];
  96. ws['!merges'] = ranges;
  97. /* add worksheet to workbook */
  98. wb.SheetNames.push(ws_name);
  99. wb.Sheets[ws_name] = ws;
  100. var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'});
  101. saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), "test.xlsx")
  102. }
  103. function formatJson(jsonData) {
  104. console.log(jsonData)
  105. }
  106. export function export_json_to_excel(th, jsonData, defaultTitle) {
  107. /* original data */
  108. var data = jsonData;
  109. data.unshift(th);
  110. var ws_name = "SheetJS";
  111. var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);
  112. /* add worksheet to workbook */
  113. wb.SheetNames.push(ws_name);
  114. wb.Sheets[ws_name] = ws;
  115. var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'});
  116. var title = defaultTitle || '列表'
  117. saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), title + ".xlsx")
  118. }
  119. export function export_json_to_excel1 (multiHeader, th, merges, data, defaultTitle, autoWidth, totalList, valLocation, mergeRow) {
  120. data = [...data];
  121. data.unshift(th);
  122. if (mergeRow.length > 0) {
  123. data.unshift(mergeRow);
  124. }
  125. // 根据传入的合计字段数组计算合计行数据
  126. // 记录合计值
  127. // 拼接生成合计行
  128. let trList = []
  129. let totalObj = {}
  130. if (totalList.length > 0) {
  131. th.forEach((item, index) => {
  132. if (index === 0) {
  133. trList[0] = '合计'
  134. } else {
  135. trList.push('')
  136. }
  137. })
  138. for (let item in valLocation) {
  139. totalObj[item] = 0
  140. data.forEach((iItem, index) => {
  141. if (index !== 0) {
  142. totalObj[item] += (iItem[valLocation[item]] - 0)
  143. }
  144. })
  145. trList[valLocation[item]] = totalObj[item]
  146. }
  147. data.push(trList)
  148. }
  149. // 将合计行添加到头部
  150. if (multiHeader) {
  151. data.unshift(multiHeader);
  152. }
  153. var ws_name = "SheetJS";
  154. var wb = new Workbook(),
  155. ws = sheet_from_array_of_arrays(data);
  156. /* add worksheet to workbook */
  157. wb.SheetNames.push(ws_name);
  158. //合并单元格
  159. ws["!merges"] = merges;
  160. wb.Sheets[ws_name] = ws;
  161. var dataInfo = wb.Sheets[wb.SheetNames[0]];
  162. var cellArr = merges.map(c => c.s);
  163. var secArr = merges.map(c => c.e);
  164. var cellArr1 = [];
  165. cellArr.forEach(cellObj => {
  166. var cell_ref = XLSX.utils.encode_cell({
  167. c: cellObj.c,
  168. r: cellObj.r
  169. });
  170. cellArr1.push(cell_ref);
  171. });
  172. //设置单元格样式
  173. const borderAll = {
  174. // border: {
  175. // //单元格外侧框线
  176. // top: {
  177. // style: "thin"
  178. // },
  179. // bottom: {
  180. // style: "thin"
  181. // },
  182. // left: {
  183. // style: "thin"
  184. // },
  185. // right: {
  186. // style: "thin"
  187. // }
  188. // },
  189. alignment: {
  190. horizontal: "center",
  191. vertical: "center"
  192. }
  193. };
  194. //给所有单元格加上边框
  195. for (var i in dataInfo) {
  196. if (i == '!ref' || i == '!merges' || i == '!cols' || $.inArray(i, cellArr1) >= 0) {
  197. // console.log(i)
  198. } else {
  199. dataInfo[i + ''].s = {
  200. border: borderAll,
  201. alignment: {
  202. horizontal: 'center',
  203. vertical: 'center'
  204. },
  205. color: {
  206. rgb: "333333"
  207. },
  208. font: {
  209. name: '微软雅黑',
  210. sz: 10,
  211. italic: false,
  212. underline: false
  213. }
  214. }
  215. }
  216. }
  217. if (autoWidth) {
  218. /*设置worksheet每列的最大宽度*/
  219. const colWidth = data.map(row =>
  220. row.map(val => {
  221. /*先判断是否为null/undefined*/
  222. if (val == null || val == undefined || val == "") {
  223. return {
  224. wch: 10
  225. };
  226. } else if (val.toString().charCodeAt(0) > 255) {
  227. // console.log(val, val.toString().length * 2, '中文宽度')
  228. /*再判断是否为中文*/
  229. return {
  230. wch: val.toString().length * 2.2
  231. };
  232. } else {
  233. return {
  234. wch: val.toString().length * 1.5
  235. };
  236. }
  237. })
  238. );
  239. /*以主表第二行为初始值,因为我的第一行是表格标题,会比较长,所以以主表第二行为初始值*/
  240. let result
  241. if (mergeRow.length > 0) {
  242. result = colWidth[1];
  243. } else {
  244. result = colWidth[0];
  245. }
  246. for (let i = 1; i < colWidth.length; i++) {
  247. for (let j = 0; j < colWidth[i].length; j++) {
  248. // console.log('i: ', i, 'j: ',j,result[j],colWidth[i][j]);
  249. if (result[j]["wch"] < colWidth[i][j]["wch"]) {
  250. result[j]["wch"] = colWidth[i][j]["wch"];
  251. }
  252. }
  253. }
  254. ws["!cols"] = result;
  255. }
  256. //设置单元格背景色、字体以及字体大小等
  257. var bgColArr = ["ffffff", 'ffffff', 'ffffff', 'ffffff', 'ffffff'];
  258. //设置主标题样式
  259. var headerStyle = {
  260. font: {
  261. name: '宋体',
  262. color: {
  263. rgb: "333333"
  264. },
  265. bold: true,
  266. italic: false,
  267. underline: false
  268. },
  269. alignment: {
  270. horizontal: "center",
  271. vertical: "center",
  272. },
  273. fill: {
  274. }
  275. };
  276. let mm = 0;
  277. cellArr1.forEach(cellObj => {
  278. var hStyle = Object.assign({}, headerStyle);
  279. hStyle.fill = {
  280. fgColor: {
  281. rgb: bgColArr[mm]
  282. }
  283. };
  284. dataInfo[cellObj].s = hStyle;
  285. mm++;
  286. });
  287. var secCellStyle = Object.assign({}, borderAll, headerStyle);
  288. secArr.forEach((s, index) => {
  289. var hStyle = Object.assign({}, secCellStyle);
  290. hStyle.fill = {
  291. fgColor: {
  292. rgb: bgColArr[index]
  293. }
  294. };
  295. var startIndex = 0;
  296. if (index == 0) {
  297. startIndex = 0;
  298. } else {
  299. startIndex = secArr[index - 1].c + 1;
  300. }
  301. for (var se = startIndex; se <= s.c; se++) {
  302. var cell_ref = XLSX.utils.encode_cell({
  303. c: se,
  304. r: 1
  305. });
  306. dataInfo[cell_ref].s = hStyle;
  307. }
  308. });
  309. var wbout = XLSX.write(wb, {
  310. bookType: 'xlsx',
  311. bookSST: false,
  312. type: 'binary'
  313. });
  314. var title = defaultTitle || '列表'
  315. saveAs(new Blob([s2ab(wbout)], {
  316. type: "application/octet-stream"
  317. }), title + ".xlsx")
  318. }