index.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. (function() {
  2. 'use strict';
  3. function getTableData(sheet) {
  4. const headers = []
  5. const range = XLSX.utils.decode_range(sheet['!ref'])
  6. let C
  7. const R = range.s.r /* start in the first row */
  8. for (C = range.s.c; C <= range.e.c; ++C) { /* walk every column in the range */
  9. var cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })] /* find the cell in the first row */
  10. headers.push({
  11. field: 'column_' + C,
  12. title: 'column_' + C
  13. })
  14. }
  15. let datas = [];
  16. for(let rowIndex = range.s.r; rowIndex <= range.e.r; ++rowIndex) {
  17. let data = {};
  18. for (let colIndex = range.s.c; colIndex <= range.e.c; ++colIndex) { /* walk every column in the range */
  19. var cell = sheet[XLSX.utils.encode_cell({ c: colIndex, r: rowIndex })]; /* find the cell in the first row */
  20. data['column_' + colIndex] = XLSX.utils.format_cell(cell);
  21. }
  22. datas.push(data);
  23. }
  24. return {
  25. columns: headers,
  26. data: datas
  27. }
  28. }
  29. function mergeCell(merge) {
  30. let rowspan = Math.abs(merge.e.r - merge.s.r + 1);
  31. let colspan = Math.abs(merge.e.c - merge.s.c + 1);
  32. $('#table').bootstrapTable('mergeCells', {
  33. index: merge.s.r,
  34. field: 'column_' + merge.s.c,
  35. rowspan: rowspan,
  36. colspan: colspan
  37. });
  38. }
  39. function mergeCells(worksheet) {
  40. var merges = worksheet['!merges'];
  41. if (!merges) { return; }
  42. merges.forEach((merge, index) => {
  43. mergeCell(merge);
  44. })
  45. }
  46. //TODO
  47. /**
  48. * key = AA2, start: A1, end = AA8, return {r: 1, c: 26}
  49. * @param {*} key
  50. * @param {*} start
  51. * @param {*} end
  52. */
  53. function getRowColIndex(key, start) {
  54. start = CUSTOM_UTIL.splitRC(start);
  55. key = CUSTOM_UTIL.splitRC(key);
  56. let col = key.c - start.c ;
  57. let row = CUSTOM_UTIL.computeR(key.r, start.r);
  58. return {
  59. r: col,
  60. c: row
  61. }
  62. }
  63. function setCellStyle(rowColIndex, style) {
  64. var cellDom = $("#table > tbody").find('tr:eq(' + rowColIndex.r + ')').find('td:eq(' + rowColIndex.c + ')');
  65. if(style.font) {
  66. cellDom.css('fontWeight', style.font.bold ? 'bold' : 'normal');
  67. if(style.font.color) {
  68. style.font.color.rgb = style.font.color.rgb == 'FFFFFF' ? 'FF000000' : style.font.color.rgb;
  69. cellDom.css('color', CUSTOM_UTIL.rgbaToRgb(style.font.color.rgb));
  70. }
  71. }
  72. if (style.fill && style.fill.fgColor) {
  73. cellDom.css('backgroundColor', CUSTOM_UTIL.rgbaToRgb(style.fill.fgColor));
  74. }
  75. if (style.alignment && style.alignment.horizontal) {
  76. let alignMap = {'bottom': 'left', 'center': 'center', 'top': 'right'};
  77. cellDom.css('textAlign', alignMap[style.alignment.horizontal]);
  78. }
  79. }
  80. function setStyles(worksheet) {
  81. var range = worksheet['!ref'].split(":");
  82. var start = range[0], end = range[1];
  83. for(let key in worksheet) {
  84. if(key >= start && key <= end) {
  85. var rowColIndex = getRowColIndex(key, start, end);
  86. var style = worksheet[key].s;
  87. if(!style) {return;}
  88. setCellStyle(rowColIndex, style);
  89. }
  90. }
  91. }
  92. function loadTabContent(sheetName, workbook) {
  93. var worksheet = workbook.Sheets[sheetName];
  94. var tableConf = {
  95. height: 600,
  96. showHeader: false
  97. };
  98. var tableData = getTableData(worksheet);
  99. $.extend(tableConf, tableData)
  100. $('#table').bootstrapTable(tableConf);
  101. setStyles(worksheet);
  102. mergeCells(worksheet);
  103. }
  104. function tabChange(target, workbook) {
  105. let sheetName = target.html();
  106. $("#tabNav > li").removeClass('active');
  107. target.parent('li').addClass('active');
  108. $("#tabPanel").empty().append('<div class="table-container"><table id="table"></table></div>');
  109. loadTabContent(sheetName, workbook);
  110. // $("#tabPanel").html(sheetName);
  111. }
  112. function initTabs(sheetNames, workbook) {
  113. $("#tabNav").empty();
  114. $("#tabPanel").empty();
  115. sheetNames.forEach(sheet => {
  116. let nav = $(`<li role="presentation"><a role="tab" data-toggle="tab">${sheet}</a></li>`);
  117. nav.find('a').on('click', (e) => {
  118. tabChange($(e.target), workbook);
  119. });
  120. $("#tabNav").append(nav);
  121. tabChange($("#tabNav > li:first > a"), workbook);
  122. $("#tabNav > li:first").addClass('active');
  123. })
  124. }
  125. function loadFile(e) {
  126. let file = e.target.files;
  127. var fileReader = new FileReader();
  128. fileReader.onload = (ev) => {
  129. try {
  130. var data = ev.target.result,
  131. workbook = XLSX.read(data, {
  132. type: 'binary',
  133. cellStyles: true
  134. }), // 以二进制流方式读取得到整份excel表格对象
  135. persons = []; // 存储获取到的数据
  136. } catch (e) {
  137. console.log('文件类型不正确');
  138. return;
  139. }
  140. //所有表名
  141. var sheetNames = workbook.SheetNames; // 返回 ['sheet1', 'sheet2']
  142. initTabs(sheetNames, workbook);
  143. // //根据表名获取对应某张表
  144. // var worksheet = workbook.Sheets[sheetNames[0]];
  145. }
  146. fileReader.readAsBinaryString(file[0]);
  147. }
  148. $(function() {
  149. $("#file").on('change', function(e) {
  150. loadFile(e);
  151. })
  152. })
  153. })()