sh-view 1.7.6 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/.eslintrc.js +20 -21
  2. package/package.json +10 -10
  3. package/packages/assets/css/animated.scss +167 -2
  4. package/packages/assets/css/loader.scss +42 -42
  5. package/packages/assets/css/main.scss +41 -21
  6. package/packages/assets/css/theme.scss +83 -44
  7. package/packages/components/global-components/sh-alert/index.vue +173 -0
  8. package/packages/components/global-components/sh-badge/index.vue +227 -0
  9. package/packages/components/global-components/sh-card/index.vue +140 -122
  10. package/packages/components/global-components/sh-code-editor/index.vue +260 -260
  11. package/packages/components/global-components/sh-col/css/index.scss +76 -0
  12. package/packages/components/global-components/sh-col/index.vue +83 -0
  13. package/packages/components/global-components/sh-corner/index.vue +1 -9
  14. package/packages/components/global-components/sh-count-to/index.vue +102 -46
  15. package/packages/components/global-components/sh-date/index.vue +40 -0
  16. package/packages/components/global-components/sh-drawer/index.vue +518 -0
  17. package/packages/components/global-components/sh-drawer/scrollbar.js +76 -0
  18. package/packages/components/global-components/sh-empty/index.vue +43 -43
  19. package/packages/components/global-components/{sh-vxe-form → sh-form}/css/index.scss +6 -6
  20. package/packages/components/global-components/{sh-vxe-form → sh-form}/index.vue +114 -115
  21. package/packages/components/global-components/{sh-vxe-form → sh-form}/js/methods.js +146 -157
  22. package/packages/components/global-components/{sh-vxe-form → sh-form}/mixin/defaultData.js +32 -33
  23. package/packages/components/global-components/sh-header/index.vue +293 -269
  24. package/packages/components/global-components/sh-icon/css/default/fonts/ionicons.svg +870 -0
  25. package/packages/components/global-components/sh-icon/css/default/fonts/ionicons.ttf +0 -0
  26. package/packages/components/global-components/sh-icon/css/default/fonts/ionicons.woff +0 -0
  27. package/packages/components/global-components/sh-icon/css/default/fonts/ionicons.woff2 +0 -0
  28. package/packages/components/global-components/sh-icon/css/default/icons.scss +2583 -0
  29. package/packages/components/global-components/sh-icon/css/default/index.scss +27 -0
  30. package/packages/components/global-components/sh-icon/css/font/fonts/iconfont.js +1 -0
  31. package/packages/components/global-components/sh-icon/css/font/fonts/iconfont.json +247 -0
  32. package/packages/components/global-components/sh-icon/css/font/fonts/iconfont.ttf +0 -0
  33. package/packages/components/global-components/sh-icon/css/font/fonts/iconfont.woff +0 -0
  34. package/packages/components/global-components/sh-icon/css/font/fonts/iconfont.woff2 +0 -0
  35. package/packages/components/global-components/sh-icon/css/font/icons.scss +135 -0
  36. package/packages/components/global-components/sh-icon/css/font/index.scss +16 -0
  37. package/packages/components/global-components/sh-icon/icon-default.vue +32 -0
  38. package/packages/components/global-components/sh-icon/{icons.vue → icon-font.vue} +32 -32
  39. package/packages/components/global-components/sh-icon/index.vue +28 -27
  40. package/packages/components/global-components/sh-image/index.vue +123 -0
  41. package/packages/components/global-components/sh-list/index.vue +141 -0
  42. package/packages/components/global-components/sh-loading/index.vue +49 -42
  43. package/packages/components/global-components/{sh-vxe-modal → sh-modal}/index.vue +209 -209
  44. package/packages/components/global-components/sh-noticebar/index.vue +201 -201
  45. package/packages/components/global-components/sh-poptip/index.vue +479 -0
  46. package/packages/components/global-components/sh-poptip/popper.js +115 -0
  47. package/packages/components/global-components/sh-progress/index.vue +290 -0
  48. package/packages/components/global-components/sh-pull-refresh/index.vue +290 -290
  49. package/packages/components/global-components/{sh-vxe-query → sh-query}/index.vue +317 -310
  50. package/packages/components/global-components/sh-result/index.vue +110 -88
  51. package/packages/components/global-components/sh-row/css/index.scss +21 -0
  52. package/packages/components/global-components/sh-row/index.vue +63 -0
  53. package/packages/components/global-components/sh-split/components/trigger.vue +33 -0
  54. package/packages/components/global-components/sh-split/index.vue +334 -142
  55. package/packages/components/global-components/sh-table/components/importModal.vue +351 -0
  56. package/packages/components/global-components/{sh-vxe-table → sh-table}/css/index.scss +4 -22
  57. package/packages/components/global-components/{sh-vxe-table → sh-table}/index.vue +329 -351
  58. package/packages/components/global-components/{sh-vxe-table → sh-table}/js/methods.js +33 -88
  59. package/packages/components/global-components/{sh-vxe-table → sh-table}/js/props.js +304 -313
  60. package/packages/components/global-components/{sh-vxe-table → sh-table}/mixin/defaultData.js +94 -116
  61. package/packages/components/global-components/sh-tabs/index.vue +315 -0
  62. package/packages/components/global-components/sh-tag/index.vue +163 -0
  63. package/packages/components/global-components/{sh-vxe-toolbar → sh-toolbar}/index.vue +177 -172
  64. package/packages/components/global-components/sh-tree/components/table-tree.vue +280 -0
  65. package/packages/components/global-components/sh-tree/css/index.scss +54 -0
  66. package/packages/components/global-components/sh-tree/index.vue +195 -0
  67. package/packages/components/global-components/sh-tree/mixin/treeProps.js +124 -0
  68. package/packages/components/global-components/sh-upload/index.vue +278 -275
  69. package/packages/components/global-components/sh-water-fall/index.vue +87 -87
  70. package/packages/components/index.js +85 -59
  71. package/packages/components/other-components/sh-cron-modal/css/index.scss +2 -2
  72. package/packages/components/other-components/sh-menu-card/index.vue +224 -224
  73. package/packages/css/index.js +4 -6
  74. package/packages/directive/index.js +19 -19
  75. package/packages/directive/module/click-out.js +14 -0
  76. package/packages/directive/module/draggable.js +42 -42
  77. package/packages/directive/module/line-clamp.js +22 -0
  78. package/packages/directive/module/prevent-click.js +18 -0
  79. package/packages/directive/module/resize.js +19 -0
  80. package/packages/directive/module/ripple.js +166 -0
  81. package/packages/index.js +39 -40
  82. package/packages/utils/transfer-queue.js +12 -0
  83. package/packages/vxeTable/css/index.scss +12 -98
  84. package/packages/vxeTable/css/variable.scss +7 -265
  85. package/packages/vxeTable/index.js +184 -183
  86. package/packages/vxeTable/plugins/export.js +450 -0
  87. package/packages/vxeTable/render/cell/vxe-render-checkgroup.vue +36 -36
  88. package/packages/vxeTable/render/cell/vxe-render-goption.vue +94 -93
  89. package/packages/vxeTable/render/cell/vxe-render-img.vue +21 -28
  90. package/packages/vxeTable/render/cell/vxe-render-input.vue +51 -51
  91. package/packages/vxeTable/render/cell/vxe-render-progress.vue +19 -19
  92. package/packages/vxeTable/render/cell/vxe-render-radiogroup.vue +36 -36
  93. package/packages/vxeTable/render/cell/vxe-render-select.vue +36 -36
  94. package/packages/vxeTable/render/cell/vxe-render-tree.vue +59 -59
  95. package/packages/vxeTable/render/globalRenders.jsx +498 -491
  96. package/packages/assets/icons/demo.css +0 -539
  97. package/packages/assets/icons/iconfont.css +0 -415
  98. package/packages/assets/icons/iconfont.js +0 -1
  99. package/packages/assets/icons/iconfont.json +0 -709
  100. package/packages/assets/icons/iconfont.ttf +0 -0
  101. package/packages/assets/icons/iconfont.woff +0 -0
  102. package/packages/assets/icons/iconfont.woff2 +0 -0
  103. package/packages/assets/img/image-error.png +0 -0
  104. package/packages/assets/img/square-image.png +0 -0
  105. package/packages/components/global-components/sh-iv-form/components/iv-group-item.vue +0 -57
  106. package/packages/components/global-components/sh-iv-form/components/iv-single-item.vue +0 -76
  107. package/packages/components/global-components/sh-iv-form/index.vue +0 -255
  108. package/packages/components/global-components/sh-vxe-list/index.vue +0 -149
  109. package/packages/components/global-components/sh-vxe-table/components/importModal.vue +0 -377
  110. package/packages/components/global-components/sh-vxe-tree/components/table-tree.vue +0 -233
  111. package/packages/components/global-components/sh-vxe-tree/css/index.scss +0 -20
  112. package/packages/components/global-components/sh-vxe-tree/index.vue +0 -85
  113. package/packages/components/global-components/sh-vxe-tree/js/props.js +0 -120
  114. package/packages/components/global-components/sh-vxe-tree/js/treeMethods.js +0 -169
  115. package/packages/components/global-components/sh-vxe-tree/mixin/defaultData.js +0 -54
  116. package/packages/components/global-components/sh-vxe-tree/vxe-direct-tree.vue +0 -203
  117. package/packages/components/global-components/sh-vxe-tree/vxe-select-tree.vue +0 -291
  118. package/packages/components/other-components/sh-markdown/tinymce/langs/ar.js +0 -7
  119. package/packages/components/other-components/sh-markdown/tinymce/langs/az.js +0 -7
  120. package/packages/components/other-components/sh-markdown/tinymce/langs/bg_BG.js +0 -7
  121. package/packages/components/other-components/sh-markdown/tinymce/langs/bn_BD.js +0 -7
  122. package/packages/components/other-components/sh-markdown/tinymce/langs/ca.js +0 -7
  123. package/packages/components/other-components/sh-markdown/tinymce/langs/cs.js +0 -7
  124. package/packages/components/other-components/sh-markdown/tinymce/langs/cy.js +0 -7
  125. package/packages/components/other-components/sh-markdown/tinymce/langs/da.js +0 -7
  126. package/packages/components/other-components/sh-markdown/tinymce/langs/de.js +0 -7
  127. package/packages/components/other-components/sh-markdown/tinymce/langs/dv.js +0 -7
  128. package/packages/components/other-components/sh-markdown/tinymce/langs/el.js +0 -7
  129. package/packages/components/other-components/sh-markdown/tinymce/langs/eo.js +0 -7
  130. package/packages/components/other-components/sh-markdown/tinymce/langs/es.js +0 -7
  131. package/packages/components/other-components/sh-markdown/tinymce/langs/es_MX.js +0 -7
  132. package/packages/components/other-components/sh-markdown/tinymce/langs/et.js +0 -7
  133. package/packages/components/other-components/sh-markdown/tinymce/langs/eu.js +0 -7
  134. package/packages/components/other-components/sh-markdown/tinymce/langs/fa.js +0 -7
  135. package/packages/components/other-components/sh-markdown/tinymce/langs/fi.js +0 -7
  136. package/packages/components/other-components/sh-markdown/tinymce/langs/fr_FR.js +0 -7
  137. package/packages/components/other-components/sh-markdown/tinymce/langs/ga.js +0 -7
  138. package/packages/components/other-components/sh-markdown/tinymce/langs/gl.js +0 -7
  139. package/packages/components/other-components/sh-markdown/tinymce/langs/he_IL.js +0 -7
  140. package/packages/components/other-components/sh-markdown/tinymce/langs/hi.js +0 -7
  141. package/packages/components/other-components/sh-markdown/tinymce/langs/hr.js +0 -7
  142. package/packages/components/other-components/sh-markdown/tinymce/langs/hu_HU.js +0 -7
  143. package/packages/components/other-components/sh-markdown/tinymce/langs/hy.js +0 -7
  144. package/packages/components/other-components/sh-markdown/tinymce/langs/id.js +0 -7
  145. package/packages/components/other-components/sh-markdown/tinymce/langs/is_IS.js +0 -7
  146. package/packages/components/other-components/sh-markdown/tinymce/langs/it.js +0 -7
  147. package/packages/components/other-components/sh-markdown/tinymce/langs/ja.js +0 -7
  148. package/packages/components/other-components/sh-markdown/tinymce/langs/kab.js +0 -7
  149. package/packages/components/other-components/sh-markdown/tinymce/langs/kk.js +0 -7
  150. package/packages/components/other-components/sh-markdown/tinymce/langs/ko_KR.js +0 -7
  151. package/packages/components/other-components/sh-markdown/tinymce/langs/ku.js +0 -7
  152. package/packages/components/other-components/sh-markdown/tinymce/langs/lt.js +0 -7
  153. package/packages/components/other-components/sh-markdown/tinymce/langs/lv.js +0 -7
  154. package/packages/components/other-components/sh-markdown/tinymce/langs/nb_NO.js +0 -7
  155. package/packages/components/other-components/sh-markdown/tinymce/langs/ne.js +0 -7
  156. package/packages/components/other-components/sh-markdown/tinymce/langs/nl.js +0 -7
  157. package/packages/components/other-components/sh-markdown/tinymce/langs/nl_BE.js +0 -7
  158. package/packages/components/other-components/sh-markdown/tinymce/langs/oc.js +0 -7
  159. package/packages/components/other-components/sh-markdown/tinymce/langs/pl.js +0 -7
  160. package/packages/components/other-components/sh-markdown/tinymce/langs/pt_BR.js +0 -7
  161. package/packages/components/other-components/sh-markdown/tinymce/langs/ro.js +0 -7
  162. package/packages/components/other-components/sh-markdown/tinymce/langs/ru.js +0 -7
  163. package/packages/components/other-components/sh-markdown/tinymce/langs/sk.js +0 -7
  164. package/packages/components/other-components/sh-markdown/tinymce/langs/sl_SI.js +0 -7
  165. package/packages/components/other-components/sh-markdown/tinymce/langs/sq.js +0 -7
  166. package/packages/components/other-components/sh-markdown/tinymce/langs/sr.js +0 -7
  167. package/packages/components/other-components/sh-markdown/tinymce/langs/sv_SE.js +0 -7
  168. package/packages/components/other-components/sh-markdown/tinymce/langs/ta.js +0 -7
  169. package/packages/components/other-components/sh-markdown/tinymce/langs/tg.js +0 -7
  170. package/packages/components/other-components/sh-markdown/tinymce/langs/th_TH.js +0 -7
  171. package/packages/components/other-components/sh-markdown/tinymce/langs/tr.js +0 -7
  172. package/packages/components/other-components/sh-markdown/tinymce/langs/ug.js +0 -7
  173. package/packages/components/other-components/sh-markdown/tinymce/langs/uk.js +0 -7
  174. package/packages/components/other-components/sh-markdown/tinymce/langs/vi.js +0 -7
  175. package/packages/components/other-components/sh-markdown/tinymce/skins/content/dark/content.css +0 -72
  176. package/packages/components/other-components/sh-markdown/tinymce/skins/content/dark/content.min.css +0 -7
  177. package/packages/components/other-components/sh-markdown/tinymce/skins/content/default/content.min.css +0 -7
  178. package/packages/components/other-components/sh-markdown/tinymce/skins/content/document/content.css +0 -72
  179. package/packages/components/other-components/sh-markdown/tinymce/skins/content/document/content.min.css +0 -7
  180. package/packages/components/other-components/sh-markdown/tinymce/skins/content/writer/content.css +0 -68
  181. package/packages/components/other-components/sh-markdown/tinymce/skins/content/writer/content.min.css +0 -7
  182. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/content.css +0 -714
  183. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/content.inline.css +0 -726
  184. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/content.inline.min.css +0 -7
  185. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/content.min.css +0 -7
  186. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/content.mobile.css +0 -29
  187. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/content.mobile.min.css +0 -7
  188. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff +0 -0
  189. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/skin.css +0 -3047
  190. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/skin.min.css +0 -7
  191. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/skin.mobile.css +0 -673
  192. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/skin.mobile.min.css +0 -7
  193. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/skin.shadowdom.css +0 -37
  194. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css +0 -7
  195. package/packages/directive/directives.js +0 -27
  196. package/packages/iview/css/index.scss +0 -32
  197. package/packages/iview/index.js +0 -25
  198. /package/packages/components/global-components/{sh-vxe-form → sh-form}/components/form-item.vue +0 -0
  199. /package/packages/components/global-components/{sh-vxe-form → sh-form}/js/props.js +0 -0
  200. /package/packages/components/global-components/{sh-vxe-table → sh-table}/js/excel_to_json.js +0 -0
@@ -0,0 +1,450 @@
1
+ import XEUtils from 'xe-utils'
2
+ import ExcelJS from 'exceljs'
3
+
4
+ let vxetable = null
5
+
6
+ const defaultHeaderBackgroundColor = '80c1ff'
7
+ const defaultCellFontColor = '606266'
8
+ const defaultCellBorderStyle = 'thin'
9
+ const defaultCellBorderColor = 'e7f1ff'
10
+
11
+ function getCellLabel(column, cellValue) {
12
+ if (cellValue) {
13
+ if (column.type === 'seq') {
14
+ return XEUtils.toValueString(cellValue)
15
+ }
16
+ switch (column.cellType) {
17
+ case 'string':
18
+ return XEUtils.toValueString(cellValue)
19
+ case 'number':
20
+ if (!isNaN(cellValue)) {
21
+ return Number(cellValue)
22
+ }
23
+ break
24
+ default:
25
+ if (cellValue.length < 12 && !isNaN(cellValue)) {
26
+ return Number(cellValue)
27
+ }
28
+ break
29
+ }
30
+ }
31
+ return cellValue
32
+ }
33
+
34
+ function getFooterData(opts, footerData) {
35
+ const { footerFilterMethod } = opts
36
+ return footerFilterMethod ? footerData.filter((items, index) => footerFilterMethod({ items, $rowIndex: index })) : footerData
37
+ }
38
+
39
+ function getFooterCellValue($table, opts, rows, column) {
40
+ return getCellLabel(column, rows[$table.getVMColumnIndex(column)])
41
+ }
42
+
43
+ function getValidColumn(column) {
44
+ const { childNodes } = column
45
+ const isColGroup = childNodes && childNodes.length
46
+ if (isColGroup) {
47
+ return getValidColumn(childNodes[0])
48
+ }
49
+ return column
50
+ }
51
+
52
+ function setExcelRowHeight(excelRow, height) {
53
+ if (height) {
54
+ excelRow.height = XEUtils.floor(height * 0.75, 12)
55
+ }
56
+ }
57
+
58
+ function setExcelCellStyle(excelCell, align) {
59
+ excelCell.protection = {
60
+ locked: false
61
+ }
62
+ excelCell.alignment = {
63
+ vertical: 'middle',
64
+ horizontal: align || 'left'
65
+ }
66
+ }
67
+
68
+ function getDefaultBorderStyle() {
69
+ return {
70
+ top: {
71
+ style: defaultCellBorderStyle,
72
+ color: {
73
+ argb: defaultCellBorderColor
74
+ }
75
+ },
76
+ left: {
77
+ style: defaultCellBorderStyle,
78
+ color: {
79
+ argb: defaultCellBorderColor
80
+ }
81
+ },
82
+ bottom: {
83
+ style: defaultCellBorderStyle,
84
+ color: {
85
+ argb: defaultCellBorderColor
86
+ }
87
+ },
88
+ right: {
89
+ style: defaultCellBorderStyle,
90
+ color: {
91
+ argb: defaultCellBorderColor
92
+ }
93
+ }
94
+ }
95
+ }
96
+
97
+ function exportXLSX(params) {
98
+ const msgKey = 'xlsx'
99
+ const { modal, t } = vxetable
100
+ const { $table, options, columns, colgroups, datas } = params
101
+ const { props, reactData } = $table
102
+ const { headerAlign: allHeaderAlign, align: allAlign, footerAlign: allFooterAlign } = props
103
+ const { rowHeight } = reactData
104
+ const { message, sheetName, isHeader, isFooter, isMerge, isColgroup, original, useStyle, sheetMethod } = options
105
+ const showMsg = message !== false
106
+ const mergeCells = $table.getMergeCells()
107
+ const colList = []
108
+ const footList = []
109
+ const sheetCols = []
110
+ const sheetMerges = []
111
+ let beforeRowCount = 0
112
+ let headerRowCount = 0
113
+ const colHead = {}
114
+ columns.forEach(column => {
115
+ const { id, field, renderWidth, headerExportMethod } = column
116
+ colHead[id] = headerExportMethod ? headerExportMethod({ column, $table }) : original ? field : column.getTitle()
117
+ sheetCols.push({
118
+ key: id,
119
+ width: XEUtils.ceil(renderWidth / 8, 1)
120
+ })
121
+ })
122
+ // 处理表头
123
+ if (isHeader) {
124
+ // 处理分组
125
+ if (isColgroup && colgroups) {
126
+ colgroups.forEach((cols, rIndex) => {
127
+ const groupHead = {}
128
+ columns.forEach(column => {
129
+ groupHead[column.id] = null
130
+ })
131
+ cols.forEach(column => {
132
+ const { _colSpan, _rowSpan, headerExportMethod } = column
133
+ const validColumn = getValidColumn(column)
134
+ const columnIndex = columns.indexOf(validColumn)
135
+ groupHead[validColumn.id] = headerExportMethod ? headerExportMethod({ column, $table }) : original ? validColumn.field : column.getTitle()
136
+ if (_colSpan > 1 || _rowSpan > 1) {
137
+ sheetMerges.push({
138
+ s: { r: rIndex, c: columnIndex },
139
+ e: { r: rIndex + _rowSpan - 1, c: columnIndex + _colSpan - 1 }
140
+ })
141
+ }
142
+ })
143
+ colList.push(groupHead)
144
+ })
145
+ } else {
146
+ colList.push(colHead)
147
+ }
148
+ headerRowCount = colList.length
149
+ beforeRowCount += headerRowCount
150
+ }
151
+ // 处理合并
152
+ if (isMerge) {
153
+ mergeCells.forEach(mergeItem => {
154
+ const { row: mergeRowIndex, rowspan: mergeRowspan, col: mergeColIndex, colspan: mergeColspan } = mergeItem
155
+ sheetMerges.push({
156
+ s: { r: mergeRowIndex + beforeRowCount, c: mergeColIndex },
157
+ e: { r: mergeRowIndex + beforeRowCount + mergeRowspan - 1, c: mergeColIndex + mergeColspan - 1 }
158
+ })
159
+ })
160
+ }
161
+ const rowList = datas.map(item => {
162
+ const rest = {}
163
+ columns.forEach(column => {
164
+ rest[column.id] = getCellLabel(column, item[column.id])
165
+ })
166
+ return rest
167
+ })
168
+ beforeRowCount += rowList.length
169
+ // 处理表尾
170
+ if (isFooter) {
171
+ const { footerData } = $table.getTableData()
172
+ const footers = getFooterData(options, footerData)
173
+ const mergeFooterItems = $table.getMergeFooterItems()
174
+ // 处理合并
175
+ if (isMerge) {
176
+ mergeFooterItems.forEach(mergeItem => {
177
+ const { row: mergeRowIndex, rowspan: mergeRowspan, col: mergeColIndex, colspan: mergeColspan } = mergeItem
178
+ sheetMerges.push({
179
+ s: { r: mergeRowIndex + beforeRowCount, c: mergeColIndex },
180
+ e: { r: mergeRowIndex + beforeRowCount + mergeRowspan - 1, c: mergeColIndex + mergeColspan - 1 }
181
+ })
182
+ })
183
+ }
184
+ footers.forEach(rows => {
185
+ const item = {}
186
+ columns.forEach(column => {
187
+ item[column.id] = getFooterCellValue($table, options, rows, column)
188
+ })
189
+ footList.push(item)
190
+ })
191
+ }
192
+ const exportMethod = () => {
193
+ const workbook = new ExcelJS.Workbook()
194
+ const sheet = workbook.addWorksheet(sheetName, { views: [{ state: 'frozen', xSplit: 0, ySplit: headerRowCount }] })
195
+ workbook.creator = 'vxe-table'
196
+ sheet.columns = sheetCols
197
+ if (isHeader) {
198
+ sheet.addRows(colList).forEach(excelRow => {
199
+ if (useStyle) {
200
+ setExcelRowHeight(excelRow, rowHeight)
201
+ }
202
+ excelRow.eachCell(excelCell => {
203
+ const excelCol = sheet.getColumn(excelCell.col)
204
+ const column = $table.getColumnById(excelCol.key)
205
+ const { headerAlign, align } = column
206
+ setExcelCellStyle(excelCell, headerAlign || align || allHeaderAlign || allAlign)
207
+ Object.assign(excelCell, {
208
+ font: {
209
+ bold: true,
210
+ color: {
211
+ argb: defaultCellFontColor
212
+ }
213
+ },
214
+ fill: {
215
+ type: 'pattern',
216
+ pattern: 'solid',
217
+ fgColor: {
218
+ argb: defaultHeaderBackgroundColor
219
+ }
220
+ },
221
+ border: getDefaultBorderStyle()
222
+ })
223
+ })
224
+ })
225
+ }
226
+ sheet.addRows(rowList).forEach(excelRow => {
227
+ if (useStyle) {
228
+ setExcelRowHeight(excelRow, rowHeight)
229
+ }
230
+ excelRow.eachCell(excelCell => {
231
+ const excelCol = sheet.getColumn(excelCell.col)
232
+ const column = $table.getColumnById(excelCol.key)
233
+ if (column) {
234
+ const { align } = column
235
+ setExcelCellStyle(excelCell, align || allAlign)
236
+ if (useStyle) {
237
+ Object.assign(excelCell, {
238
+ font: {
239
+ color: {
240
+ argb: defaultCellFontColor
241
+ }
242
+ },
243
+ border: getDefaultBorderStyle()
244
+ })
245
+ }
246
+ }
247
+ })
248
+ })
249
+ if (isFooter) {
250
+ sheet.addRows(footList).forEach(excelRow => {
251
+ if (useStyle) {
252
+ setExcelRowHeight(excelRow, rowHeight)
253
+ }
254
+ excelRow.eachCell(excelCell => {
255
+ const excelCol = sheet.getColumn(excelCell.col)
256
+ const column = $table.getColumnById(excelCol.key)
257
+ if (column) {
258
+ const { footerAlign, align } = column
259
+ setExcelCellStyle(excelCell, footerAlign || align || allFooterAlign || allAlign)
260
+ if (useStyle) {
261
+ Object.assign(excelCell, {
262
+ font: {
263
+ color: {
264
+ argb: defaultCellFontColor
265
+ }
266
+ },
267
+ border: getDefaultBorderStyle()
268
+ })
269
+ }
270
+ }
271
+ })
272
+ })
273
+ }
274
+ if (useStyle && sheetMethod) {
275
+ sheetMethod({ options: options, workbook, worksheet: sheet, columns, colgroups, datas, $table })
276
+ }
277
+ sheetMerges.forEach(({ s, e }) => {
278
+ sheet.mergeCells(s.r + 1, s.c + 1, e.r + 1, e.c + 1)
279
+ })
280
+ workbook.xlsx.writeBuffer().then(buffer => {
281
+ const blob = new Blob([buffer], { type: 'application/octet-stream' })
282
+ // 导出 xlsx
283
+ downloadFile(params, blob, options)
284
+ if (showMsg && modal) {
285
+ modal.close(msgKey)
286
+ modal.message({ content: t('vxe.table.expSuccess'), status: 'success' })
287
+ }
288
+ })
289
+ }
290
+ if (showMsg && modal) {
291
+ modal.message({ id: msgKey, content: t('vxe.table.expLoading'), status: 'loading', duration: -1 })
292
+ setTimeout(exportMethod, 1500)
293
+ } else {
294
+ exportMethod()
295
+ }
296
+ }
297
+
298
+ function downloadFile(params, blob, options) {
299
+ const { modal, t } = vxetable
300
+ const { message, filename, type } = options
301
+ const showMsg = message !== false
302
+ if (window.Blob) {
303
+ if (navigator.msSaveBlob) {
304
+ navigator.msSaveBlob(blob, `${filename}.${type}`)
305
+ } else {
306
+ const linkElem = document.createElement('a')
307
+ linkElem.target = '_blank'
308
+ linkElem.download = `${filename}.${type}`
309
+ linkElem.href = URL.createObjectURL(blob)
310
+ document.body.appendChild(linkElem)
311
+ linkElem.click()
312
+ document.body.removeChild(linkElem)
313
+ }
314
+ } else {
315
+ if (showMsg && modal) {
316
+ modal.alert({ content: t('vxe.error.notExp'), status: 'error' })
317
+ }
318
+ }
319
+ }
320
+
321
+ function checkImportData(tableFields, fields) {
322
+ return fields.some(field => tableFields.indexOf(field) > -1)
323
+ }
324
+
325
+ function importError(params) {
326
+ const { modal, t } = vxetable
327
+ const { $table, options } = params
328
+ const { internalData } = $table
329
+ const { _importReject } = internalData
330
+ const showMsg = options.message !== false
331
+ if (showMsg && modal) {
332
+ modal.message({ content: t('vxe.error.impFields'), status: 'error' })
333
+ }
334
+ if (_importReject) {
335
+ _importReject({ status: false })
336
+ }
337
+ }
338
+
339
+ function importXLSX(params) {
340
+ const { modal, t } = vxetable
341
+ const { $table, columns, options, file } = params
342
+ const { internalData } = $table
343
+ const { _importResolve } = internalData
344
+ const showMsg = options.message !== false
345
+ const fileReader = new FileReader()
346
+ fileReader.onerror = () => {
347
+ importError(params)
348
+ }
349
+ fileReader.onload = evnt => {
350
+ const tableFields = []
351
+ columns.forEach(column => {
352
+ const field = column.field
353
+ if (field) {
354
+ tableFields.push(field)
355
+ }
356
+ })
357
+ const workbook = new ExcelJS.Workbook()
358
+ const readerTarget = evnt.target
359
+ if (readerTarget) {
360
+ workbook.xlsx.load(readerTarget.result).then(wb => {
361
+ const firstSheet = wb.worksheets[0]
362
+ if (firstSheet) {
363
+ const sheetValues = firstSheet.getSheetValues()
364
+ const fieldIndex = XEUtils.findIndexOf(sheetValues, list => list && list.length > 0)
365
+ const fields = sheetValues[fieldIndex]
366
+ const status = checkImportData(tableFields, fields)
367
+ if (status) {
368
+ const records = sheetValues.slice(fieldIndex).map(list => {
369
+ const item = {}
370
+ list.forEach((cellValue, cIndex) => {
371
+ item[fields[cIndex]] = cellValue
372
+ })
373
+ const record = {}
374
+ tableFields.forEach(field => {
375
+ record[field] = XEUtils.isUndefined(item[field]) ? null : item[field]
376
+ })
377
+ return record
378
+ })
379
+ $table.createData(records).then(data => {
380
+ let loadRest = null
381
+ if (options.mode === 'insert') {
382
+ loadRest = $table.insertAt(data, -1)
383
+ } else {
384
+ loadRest = $table.reloadData(data)
385
+ }
386
+ return loadRest.then(() => {
387
+ if (_importResolve) {
388
+ _importResolve({ status: true })
389
+ }
390
+ })
391
+ })
392
+ if (showMsg && modal) {
393
+ modal.message({ content: t('vxe.table.impSuccess', [records.length]), status: 'success' })
394
+ }
395
+ } else {
396
+ importError(params)
397
+ }
398
+ } else {
399
+ importError(params)
400
+ }
401
+ })
402
+ } else {
403
+ importError(params)
404
+ }
405
+ }
406
+ fileReader.readAsArrayBuffer(file)
407
+ }
408
+
409
+ function handleImportEvent(params) {
410
+ if (params.options.type === 'xlsx') {
411
+ importXLSX(params)
412
+ return false
413
+ }
414
+ }
415
+
416
+ function handleExportEvent(params) {
417
+ if (params.options.type === 'xlsx') {
418
+ exportXLSX(params)
419
+ return false
420
+ }
421
+ }
422
+
423
+ /**
424
+ * 基于 vxe-table 表格的增强插件,支持导出 xlsx 格式
425
+ */
426
+ export const VXETablePluginExportXLSX = {
427
+ install(vxetablecore) {
428
+ const { setup, interceptor } = vxetablecore
429
+
430
+ vxetable = vxetablecore
431
+
432
+ setup({
433
+ export: {
434
+ types: {
435
+ xlsx: 0
436
+ }
437
+ }
438
+ })
439
+ interceptor.mixin({
440
+ 'event.import': handleImportEvent,
441
+ 'event.export': handleExportEvent
442
+ })
443
+ }
444
+ }
445
+
446
+ if (typeof window !== 'undefined' && window.VXETable && window.VXETable.use) {
447
+ window.VXETable.use(VXETablePluginExportXLSX)
448
+ }
449
+
450
+ export default VXETablePluginExportXLSX
@@ -1,36 +1,36 @@
1
- <template>
2
- <span class="vxe-render--inner" :class="{ 'form-render': rform, 'td-render': !rform }">
3
- <template v-if="redit || isEditAll">
4
- <vxe-checkbox-group v-model="renderValue" v-bind="rprops" :size="rsize" @change="vxeCheckCallBack">
5
- <vxe-checkbox v-for="checkitem in rprops.options" :key="checkitem.value" :label="checkitem.value" :content="checkitem.label" />
6
- </vxe-checkbox-group>
7
- <span style="display: none" v-html="renderText"></span>
8
- </template>
9
- <template v-else-if="!redit && showType">
10
- <div v-for="roption in rprops.options" :key="roption">
11
- <Tag v-if="roptionShow(roption)" :color="roption.tagColor || rprops.tagColor" :type="roption.tagType || rprops.tagType">{{ roption.label }}</Tag>
12
- </div>
13
- </template>
14
- <template v-else>
15
- <span v-html="renderText"></span>
16
- </template>
17
- </span>
18
- </template>
19
-
20
- <script>
21
- import mixin from '../mixin/cell-mixin'
22
- export default {
23
- name: 'VxeRenderCheckgroup',
24
- mixins: [mixin],
25
- computed: {
26
- showType() {
27
- return this.rprops.showType === 'tag'
28
- }
29
- },
30
- methods: {
31
- roptionShow(roption) {
32
- return this.renderText.split(this.rprops.split).includes(roption.label)
33
- }
34
- }
35
- }
36
- </script>
1
+ <template>
2
+ <span class="vxe-render--inner" :class="{ 'form-render': rform, 'td-render': !rform }">
3
+ <template v-if="redit || isEditAll">
4
+ <vxe-checkbox-group v-model="renderValue" v-bind="rprops" :size="rsize" @change="vxeCheckCallBack">
5
+ <vxe-checkbox v-for="checkitem in rprops.options" :key="checkitem.value" :label="checkitem.value" :content="checkitem.label" />
6
+ </vxe-checkbox-group>
7
+ <span style="display: none" v-html="renderText"></span>
8
+ </template>
9
+ <template v-else-if="!redit && showType">
10
+ <div v-for="roption in rprops.options" :key="roption">
11
+ <sh-tag v-if="roptionShow(roption)" :color="roption.tagColor || rprops.tagColor" :type="roption.tagType || rprops.tagType">{{ roption.label }}</sh-tag>
12
+ </div>
13
+ </template>
14
+ <template v-else>
15
+ <span v-html="renderText"></span>
16
+ </template>
17
+ </span>
18
+ </template>
19
+
20
+ <script>
21
+ import mixin from '../mixin/cell-mixin'
22
+ export default {
23
+ name: 'VxeRenderCheckgroup',
24
+ mixins: [mixin],
25
+ computed: {
26
+ showType() {
27
+ return this.rprops.showType === 'tag'
28
+ }
29
+ },
30
+ methods: {
31
+ roptionShow(roption) {
32
+ return this.renderText.split(this.rprops.split).includes(roption.label)
33
+ }
34
+ }
35
+ }
36
+ </script>