cloud-web-corejs-haier 1.0.43 → 1.0.45

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 (228) hide show
  1. package/package.json +8 -6
  2. package/src/api/user.js +54 -46
  3. package/src/components/baseAlert/index.vue +57 -53
  4. package/src/components/baseInputExport/index.vue +3 -3
  5. package/src/components/baseTabs/mixins.js +12 -1
  6. package/src/components/errorMsg/index.vue +78 -78
  7. package/src/components/excelExport/button.vue +54 -45
  8. package/src/components/excelExport/exportFieldDialog.vue +3 -3
  9. package/src/components/excelExport/index.js +1 -43
  10. package/src/components/excelExport/index.vue +62 -34
  11. package/src/components/excelExport/mixins.js +74 -87
  12. package/src/components/excelImport/index.js +1 -62
  13. package/src/components/excelImport/mixins.js +1 -774
  14. package/src/components/fileLibrary/index.vue +113 -33
  15. package/src/components/fileLibrary/propertiesDialog.vue +6 -0
  16. package/src/components/hiprint/view/design/index.vue +139 -47
  17. package/src/components/hiprint/view/design/preview.vue +75 -52
  18. package/src/components/hiprint/view/json-view.vue +31 -31
  19. package/src/components/luckysheet/dialog.vue +159 -0
  20. package/src/components/luckysheet/export.js +595 -0
  21. package/src/components/luckysheet/fileUtils.js +147 -0
  22. package/src/components/luckysheet/index.js +69 -0
  23. package/src/components/luckysheet/templateJson.js +12078 -0
  24. package/src/components/luckysheet/view.vue +210 -0
  25. package/src/components/onlineTalk/index.vue +328 -6
  26. package/src/components/onlineTalk/talkUserDialog.vue +280 -0
  27. package/src/components/wf/addTaskUserdialog.vue +5 -5
  28. package/src/components/wf/content.vue +1244 -1169
  29. package/src/components/wf/content2.vue +604 -604
  30. package/src/components/wf/mixins/setCandidateDialog.js +228 -2
  31. package/src/components/wf/mixins/setCandidateDialog2.js +116 -101
  32. package/src/components/wf/mixins/wfTaskUserRangeDialog.js +67 -1
  33. package/src/components/wf/setCandidateDialog.vue +5 -7
  34. package/src/components/wf/setCandidateDialog2.vue +14 -10
  35. package/src/components/wf/wf.js +2325 -2209
  36. package/src/components/wf/wfTaskUserRangeDialog.vue +1 -1
  37. package/src/components/wf/wfUtil.js +129 -91
  38. package/src/components/xform/form-designer/designer.js +1994 -9
  39. package/src/components/xform/form-designer/form-widget/container-widget/data-table-widget.vue +10 -0
  40. package/src/components/xform/form-designer/form-widget/container-widget/detail-pane-widget.vue +3 -2
  41. package/src/components/xform/form-designer/form-widget/dialog/formDialog.vue +5 -1
  42. package/src/components/xform/form-designer/form-widget/dialog/importDialogMixin - /345/211/257/346/234/254.js" +1639 -0
  43. package/src/components/xform/form-designer/form-widget/dialog/importDialogMixin.js +1756 -2
  44. package/src/components/xform/form-designer/form-widget/field-widget/baseAttachment-widget.vue +1 -0
  45. package/src/components/xform/form-designer/form-widget/field-widget/dropdown-item-widget.vue +10 -1
  46. package/src/components/xform/form-designer/form-widget/field-widget/dropdown-widget.vue +170 -0
  47. package/src/components/xform/form-designer/form-widget/field-widget/fieldMixin.js +1630 -1
  48. package/src/components/xform/form-designer/form-widget/field-widget/form-item-wrapper.vue +153 -40
  49. package/src/components/xform/form-designer/form-widget/field-widget/status-widget.vue +65 -46
  50. package/src/components/xform/form-designer/form-widget/field-widget/vue-page-widget.vue +231 -0
  51. package/src/components/xform/form-designer/setting-panel/form-setting.vue +7 -4
  52. package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/edit-tree-button-group-config-dialog.vue +281 -0
  53. package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/table-column-dialog.vue +659 -221
  54. package/src/components/xform/form-designer/setting-panel/property-editor/container-detail/detail-editor.vue +3 -3
  55. package/src/components/xform/form-designer/setting-panel/property-editor/dropdownFlag-editor.vue +133 -0
  56. package/src/components/xform/form-designer/setting-panel/property-editor/event-handler/onClick-editor.vue +14 -6
  57. package/src/components/xform/form-designer/setting-panel/property-editor/field-import-button/import-button-editor.vue +1 -1
  58. package/src/components/xform/form-designer/setting-panel/property-editor/field-import-button/import2-button-editor.vue +1 -1
  59. package/src/components/xform/form-designer/setting-panel/property-editor/field-vue-page/vue-page-editor.vue +48 -0
  60. package/src/components/xform/form-designer/setting-panel/property-editor/labelIconClass-editor.vue +18 -17
  61. package/src/components/xform/form-designer/setting-panel/property-editor/labelIconPosition-editor.vue +26 -26
  62. package/src/components/xform/form-designer/setting-panel/property-editor/labelTooltip-editor.vue +67 -13
  63. package/src/components/xform/form-designer/setting-panel/property-editor/name-editor.vue +2 -0
  64. package/src/components/xform/form-designer/setting-panel/property-editor/showViewButton-editor.vue +29 -0
  65. package/src/components/xform/form-designer/setting-panel/propertyRegister.js +8 -6
  66. package/src/components/xform/form-designer/widget-panel/widgetsConfig.js +1 -0
  67. package/src/components/xform/form-render/container-item/data-table-mixin.js +20 -17
  68. package/src/components/xform/form-render/container-item/detail-item.vue +72 -48
  69. package/src/components/xform/form-render/container-item/sub-form-item.vue +10 -2
  70. package/src/components/xform/form-render/container-item/table2-item.vue +40 -10
  71. package/src/components/xform/form-render/indexMixin.js +3705 -1
  72. package/src/components/xform/icon-picker/icons.json +284 -0
  73. package/src/components/xform/icon-picker/index.vue +145 -0
  74. package/src/components/xform/lang/zh-CN.js +2 -1
  75. package/src/components/xform/mixins/defaultHandle.js +366 -2
  76. package/src/components/xform/utils/formula-util.js +3 -0
  77. package/src/components/xform/utils/sfc-generator.js +2 -2
  78. package/src/components/xform/utils/smart-vue-i18n/index.js +2 -1
  79. package/src/components/xform/utils/tableColumnHelper.js +54 -10
  80. package/src/components/xform/utils/util.js +1547 -1
  81. package/src/index.js +190 -211
  82. package/src/lang/locale/en/login.js +26 -19
  83. package/src/lang/locale/zh/login.js +25 -19
  84. package/src/layout/components/Sidebar/default.vue +252 -71
  85. package/src/layout/components/Sidebar/index.vue +6 -1
  86. package/src/layout/components/TagsView/index.vue +6 -0
  87. package/src/layout/components/langTool.vue +32 -29
  88. package/src/layout/defaultLayout.vue +16 -8
  89. package/src/layout/index.vue +5 -3
  90. package/src/permission.js +135 -1
  91. package/src/router/index.js +1 -4
  92. package/src/store/config/index.js +667 -1
  93. package/src/store/getters.js +2 -1
  94. package/src/store/modules/permission.js +332 -1
  95. package/src/store/modules/settings.js +26 -1
  96. package/src/store/modules/tagsView.js +190 -1
  97. package/src/store/modules/user.js +358 -1
  98. package/src/utils/aes.js +15 -1
  99. package/src/utils/auth.js +27 -1
  100. package/src/utils/componentDialog.js +217 -0
  101. package/src/utils/request.js +368 -1
  102. package/src/utils/vab.js +1256 -7
  103. package/src/views/bd/setting/bd_company_env/dialog.vue +174 -174
  104. package/src/views/bd/setting/bd_company_env/edit.vue +193 -193
  105. package/src/views/bd/setting/formVersion/button.vue +55 -0
  106. package/src/views/bd/setting/formVersion/compareBasicSection.vue +125 -0
  107. package/src/views/bd/setting/formVersion/compareCodeSection.vue +539 -0
  108. package/src/views/bd/setting/formVersion/compareContMixin.scss +65 -0
  109. package/src/views/bd/setting/formVersion/compareContent.vue +63 -0
  110. package/src/views/bd/setting/formVersion/compareDialog.vue +88 -0
  111. package/src/views/bd/setting/formVersion/compareMixin.js +93 -0
  112. package/src/views/bd/setting/formVersion/fieldCompare.vue +54 -0
  113. package/src/views/bd/setting/formVersion/formScriptCompareView.vue +94 -0
  114. package/src/views/bd/setting/formVersion/formTemplateCompareView.vue +74 -0
  115. package/src/views/bd/setting/formVersion/ftHistoryDialog.vue +491 -0
  116. package/src/views/bd/setting/formVersion/link.vue +58 -0
  117. package/src/views/bd/setting/formVersion/preformDialog.vue +87 -0
  118. package/src/views/bd/setting/formVersion/reverButton.vue +82 -0
  119. package/src/views/bd/setting/formVersion/tableDetailDiff.js +99 -0
  120. package/src/views/bd/setting/formVersion/tableModelCompareView.vue +514 -0
  121. package/src/views/bd/setting/formVersion/textDiff.js +102 -0
  122. package/src/views/bd/setting/form_import_log/edit.vue +6 -3
  123. package/src/views/bd/setting/form_import_log/list.vue +5 -0
  124. package/src/views/bd/setting/form_script/edit.vue +196 -83
  125. package/src/views/bd/setting/form_script/edit1.vue +410 -220
  126. package/src/views/bd/setting/form_script/form_list.vue +19 -0
  127. package/src/views/bd/setting/form_script/list.vue +95 -21
  128. package/src/views/bd/setting/form_script/list1.vue +24 -0
  129. package/src/views/bd/setting/form_script/mixins/dialog.js +2 -2
  130. package/src/views/bd/setting/form_script/mixins/edit.js +265 -207
  131. package/src/views/bd/setting/form_script/mixins/edit1.js +259 -201
  132. package/src/views/bd/setting/form_script/mixins/form_list.js +322 -296
  133. package/src/views/bd/setting/form_script/mixins/list.js +163 -95
  134. package/src/views/bd/setting/form_script/mixins/list1.js +244 -155
  135. package/src/views/bd/setting/form_script/mixins/otherAuthDialog.js +1 -1
  136. package/src/views/bd/setting/form_template/batchWfObjConfigDialog.vue +1 -1
  137. package/src/views/bd/setting/form_template/edit.vue +355 -205
  138. package/src/views/bd/setting/form_template/formDesignerDialog.vue +171 -0
  139. package/src/views/bd/setting/form_template/list.vue +49 -74
  140. package/src/views/bd/setting/form_template/mixins/batchWfObjConfigDialog.js +3 -3
  141. package/src/views/bd/setting/form_template/mixins/edit.js +51 -8
  142. package/src/views/bd/setting/form_template/mixins/itemList.js +1 -1
  143. package/src/views/bd/setting/form_template/mixins/list.js +114 -82
  144. package/src/views/bd/setting/form_template/mixins/list2.js +3 -3
  145. package/src/views/bd/setting/form_template/mixins/otherAuthDialog.js +1 -1
  146. package/src/views/bd/setting/form_template/mixins/wf_list.js +3 -7
  147. package/src/views/bd/setting/form_template/wfObjConfigDialog.vue +254 -254
  148. package/src/views/bd/setting/form_template/wf_list.vue +161 -127
  149. package/src/views/bd/setting/request_async_setting/edit.vue +320 -320
  150. package/src/views/bd/setting/request_setting/edit.vue +300 -300
  151. package/src/views/bd/setting/request_setting/list.vue +15 -25
  152. package/src/views/bd/setting/table_model/edit.vue +702 -498
  153. package/src/views/bd/setting/table_model/list.vue +28 -0
  154. package/src/views/bd/setting/table_model/mixins/dialog.js +1 -1
  155. package/src/views/bd/setting/table_model/mixins/edit copy.js +903 -0
  156. package/src/views/bd/setting/table_model/mixins/edit.js +228 -121
  157. package/src/views/bd/setting/table_model/mixins/list.js +55 -20
  158. package/src/views/bd/setting/table_model/mixins/otherAuthDialog.js +1 -1
  159. package/src/views/bd/setting/table_model/mixins/zdDialog.js +50 -46
  160. package/src/views/bd/setting/utils/index.js +15 -0
  161. package/src/views/user/api_request/list.vue +203 -203
  162. package/src/views/user/bill_setting/list.vue +345 -345
  163. package/src/views/user/code_rules/list.vue +204 -204
  164. package/src/views/user/common_attribute/list.vue +378 -378
  165. package/src/views/user/common_script/list.vue +341 -341
  166. package/src/views/user/company_info/dialog.vue +80 -49
  167. package/src/views/user/country/list.vue +197 -197
  168. package/src/views/user/extend_datasource/dialog.vue +0 -3
  169. package/src/views/user/extend_datasource/edit.vue +1 -2
  170. package/src/views/user/extend_datasource/list.vue +221 -224
  171. package/src/views/user/fieldTranslation/editDialog.vue +1 -1
  172. package/src/views/user/fieldTranslation/list.vue +473 -473
  173. package/src/views/user/field_values_invisible/list.vue +207 -207
  174. package/src/views/user/file_type/list.vue +271 -271
  175. package/src/views/user/file_view_area/list.vue +331 -331
  176. package/src/views/user/form/vform/designer.vue +303 -287
  177. package/src/views/user/form/vform/formFieldMapping.js +2 -3
  178. package/src/views/user/form/view/edit.vue +19 -1
  179. package/src/views/user/form/view/list.vue +59 -17
  180. package/src/views/user/groups/list.vue +158 -158
  181. package/src/views/user/home/default.vue +274 -182
  182. package/src/views/user/home/default2.vue +1148 -0
  183. package/src/views/user/home/index.vue +2 -1
  184. package/src/views/user/lang_tag/list.vue +170 -170
  185. package/src/views/user/language_setting/list.vue +208 -208
  186. package/src/views/user/ledger_library/list.vue +12 -10
  187. package/src/views/user/login/default.vue +1 -1
  188. package/src/views/user/login/indexMixin.js +204 -169
  189. package/src/views/user/menu/list.vue +575 -575
  190. package/src/views/user/notify_message/dialog.vue +7 -1
  191. package/src/views/user/notify_template/list.vue +192 -192
  192. package/src/views/user/notify_template/list2.vue +190 -190
  193. package/src/views/user/position/list.vue +188 -188
  194. package/src/views/user/project_tag/list.vue +175 -175
  195. package/src/views/user/push_setting/list.vue +236 -236
  196. package/src/views/user/request_setting/list.vue +248 -248
  197. package/src/views/user/role/list.vue +182 -182
  198. package/src/views/user/system_notice/infoDialog.vue +61 -2
  199. package/src/views/user/system_notice/list.vue +203 -203
  200. package/src/views/user/system_parameter/list.vue +141 -141
  201. package/src/views/user/user/edit.vue +45 -0
  202. package/src/views/user/user/form_list.vue +245 -245
  203. package/src/views/user/user/info.vue +253 -140
  204. package/src/views/user/user_log_classify/list.vue +197 -197
  205. package/src/views/user/wf/iframe/index.vue +46 -46
  206. package/src/views/user/wf/wfReport/index.vue +1 -1
  207. package/src/views/user/wf/wf_auto_submit_data/list.vue +659 -659
  208. package/src/views/user/wf/wf_diy_attribute/edit.vue +1 -1
  209. package/src/views/user/wf/wf_manage/list.vue +795 -795
  210. package/src/views/user/wf/wf_manage/wfContentDialog.vue +106 -106
  211. package/src/views/user/wf/wf_obj_config/dialog.vue +2 -2
  212. package/src/views/user/wf/wf_obj_config/edit.vue +1 -1
  213. package/src/views/user/wf/wf_obj_config/edit_form.vue +2 -2
  214. package/src/views/user/wf/wf_obj_config/itemEdit.vue +1 -1
  215. package/src/views/user/wf/wf_obj_config/itemEdit_form.vue +1 -1
  216. package/src/views/user/wf/wf_obj_config/itemOperateDialog.vue +4 -4
  217. package/src/views/user/wf/wf_obj_config/list.vue +28 -28
  218. package/src/views/user/wf/wf_obj_config/list_form.vue +5 -5
  219. package/src/views/user/wf/wf_obj_config/wfBizDataSettingDialog.vue +292 -292
  220. package/src/views/user/wf/wf_param/edit.vue +1 -1
  221. package/src/views/user/wf/wf_transfer_setting/edit.vue +1 -1
  222. package/src/views/user/wf/wf_transfer_setting/list.vue +321 -319
  223. package/src/views/user/wf/wf_work_calendar/components/calendar.vue +369 -367
  224. package/src/views/user/wf/wf_work_calendar/components/calendar2.vue +401 -399
  225. package/src/views/user/wf/wf_work_calendar/configDialog.vue +6 -6
  226. package/src/views/user/wf/wf_work_calendar/date.js +84 -83
  227. package/src/views/user/wf/wf_work_calendar/list.vue +6 -6
  228. package/src/views/user/workbench_menu/list.vue +555 -0
@@ -0,0 +1,595 @@
1
+ // import { createCellPos } from './translateNumToLetter'
2
+ const Excel = require('exceljs')
3
+
4
+ import FileSaver from 'file-saver'
5
+ export const testaaa = function (){
6
+ console.log("...");
7
+ }
8
+
9
+ export const exportExcel = function(luckysheet, value) {
10
+ // 参数为luckysheet.getluckysheetfile()获取的对象
11
+ // 1.创建工作簿,可以为工作簿添加属性
12
+ const workbook = new Excel.Workbook()
13
+ // 设置工作簿属性
14
+ workbook.creator = 'SF Cloud Web';
15
+ workbook.lastModifiedBy = 'SF Cloud Web';
16
+ workbook.created = new Date();
17
+ workbook.modified = new Date();
18
+
19
+ // 2.创建表格,第二个参数可以配置创建什么样的工作表
20
+ if (Object.prototype.toString.call(luckysheet) === '[object Object]') {
21
+ luckysheet = [luckysheet]
22
+ }
23
+ luckysheet.forEach(function(table) {
24
+ if (table.data.length === 0) return true
25
+
26
+ // 创建工作表并设置属性
27
+ const worksheet = workbook.addWorksheet(table.name, {
28
+ properties: {
29
+ defaultRowHeight: 20, // 默认行高
30
+ tabColor: { argb: 'FFC0000' }
31
+ },
32
+ pageSetup: {
33
+ paperSize: 9, // A4
34
+ orientation: 'portrait' // 纵向
35
+ }
36
+ })
37
+
38
+ const merge = (table.config && table.config.merge) || {}
39
+ const borderInfo = (table.config && table.config.borderInfo) || {}
40
+ const columnWidths = (table.config && table.config.columnlen) || {} // 获取列宽配置
41
+ const rowHeights = (table.config && table.config.rowlen) || {} // 获取行高配置
42
+
43
+ // 3.设置单元格合并,设置单元格边框,设置单元格样式,设置值
44
+ setStyleAndValue(table.data, worksheet)
45
+ setColumnWidths(worksheet, columnWidths) // 设置列宽
46
+ setRowHeights(worksheet, rowHeights) // 设置行高
47
+ setMerge(merge, worksheet)
48
+ setBorder(borderInfo, worksheet)
49
+ return true
50
+ })
51
+
52
+ // 4.写入 buffer
53
+ const buffer = workbook.xlsx.writeBuffer().then(data => {
54
+ const blob = new Blob([data], {
55
+ type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
56
+ })
57
+ console.log("导出成功!")
58
+ FileSaver.saveAs(blob, `${value}.xlsx`)
59
+ })
60
+ return buffer
61
+ }
62
+
63
+ export const generateExcelBlob = function(luckysheet, fileName) {
64
+ // 参数为luckysheet.getluckysheetfile()获取的对象,返回Blob对象
65
+ const workbook = new Excel.Workbook()
66
+ workbook.creator = 'SF Cloud Web';
67
+ workbook.lastModifiedBy = 'SF Cloud Web';
68
+ workbook.created = new Date();
69
+ workbook.modified = new Date();
70
+
71
+ if (Object.prototype.toString.call(luckysheet) === '[object Object]') {
72
+ luckysheet = [luckysheet]
73
+ }
74
+ luckysheet.forEach(function(table) {
75
+ if (table.data.length === 0) return true
76
+
77
+ const worksheet = workbook.addWorksheet(table.name, {
78
+ properties: {
79
+ defaultRowHeight: 20,
80
+ tabColor: { argb: 'FFC0000' }
81
+ },
82
+ pageSetup: {
83
+ paperSize: 9,
84
+ orientation: 'portrait'
85
+ }
86
+ })
87
+
88
+ const merge = (table.config && table.config.merge) || {}
89
+ const borderInfo = (table.config && table.config.borderInfo) || {}
90
+ const columnWidths = (table.config && table.config.columnlen) || {}
91
+ const rowHeights = (table.config && table.config.rowlen) || {}
92
+
93
+ setStyleAndValue(table.data, worksheet)
94
+ setColumnWidths(worksheet, columnWidths)
95
+ setRowHeights(worksheet, rowHeights)
96
+ setMerge(merge, worksheet)
97
+ setBorder(borderInfo, worksheet)
98
+ return true
99
+ })
100
+
101
+ return workbook.xlsx.writeBuffer().then(data => {
102
+ const blob = new Blob([data], {
103
+ type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
104
+ })
105
+ if (fileName) {
106
+ blob.name = `${fileName}.xlsx`
107
+ }
108
+ return blob
109
+ })
110
+ }
111
+
112
+ export const generateExcelFile = function(luckysheet, fileName) {
113
+ // 参数为luckysheet.getluckysheetfile()获取的对象,返回File对象
114
+ return generateExcelBlob(luckysheet, fileName).then(blob => {
115
+ const file = new File([blob], `${fileName || 'export'}.xlsx`, {
116
+ type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
117
+ })
118
+ return file
119
+ })
120
+ }
121
+
122
+ let setMerge = function(luckyMerge = {}, worksheet) {
123
+ const mergearr = Object.values(luckyMerge)
124
+ mergearr.forEach(function(elem) {
125
+ // elem格式:{r: 0, c: 0, rs: 1, cs: 2}
126
+ // 按开始行,开始列,结束行,结束列合并(相当于 K10:M12)
127
+ worksheet.mergeCells(
128
+ elem.r + 1,
129
+ elem.c + 1,
130
+ elem.r + elem.rs,
131
+ elem.c + elem.cs
132
+ )
133
+ })
134
+ }
135
+
136
+ let setBorder = function(luckyBorderInfo, worksheet) {
137
+ if (!Array.isArray(luckyBorderInfo)) return
138
+ // console.log('luckyBorderInfo', luckyBorderInfo)
139
+ luckyBorderInfo.forEach(function(elem) {
140
+ // 现在只兼容到borderType 为range的情况
141
+ // console.log('ele', elem)
142
+ if (elem.rangeType === 'range') {
143
+ // 添加对elem.borderType, elem.style, elem.color的检查
144
+ if (!elem.borderType) return;
145
+
146
+ let border = borderConvert(elem.borderType, elem.style, elem.color)
147
+ let rang = elem.range[0]
148
+ // console.log('range', rang)
149
+ let row = rang.row
150
+ let column = rang.column
151
+ for (let i = row[0] + 1; i < row[1] + 2; i++) {
152
+ for (let y = column[0] + 1; y < column[1] + 2; y++) {
153
+ worksheet.getCell(i, y).border = border
154
+ }
155
+ }
156
+ }
157
+ if (elem.rangeType === 'cell') {
158
+ // col_index: 2
159
+ // row_index: 1
160
+ // b: {
161
+ // color: '#d0d4e3'
162
+ // style: 1
163
+ // }
164
+ const { col_index, row_index } = elem.value
165
+ // 添加对elem.value的检查
166
+ if (!elem.value) return;
167
+
168
+ const borderData = Object.assign({}, elem.value)
169
+ delete borderData.col_index
170
+ delete borderData.row_index
171
+
172
+ // 添加对borderData的验证
173
+ let hasValidBorder = false;
174
+ for (const key in borderData) {
175
+ if (borderData[key] && typeof borderData[key] === 'object' && borderData[key].color) {
176
+ hasValidBorder = true;
177
+ break;
178
+ }
179
+ }
180
+
181
+ if (!hasValidBorder) return;
182
+
183
+ let border = addborderToCell(borderData, row_index, col_index)
184
+ // console.log('bordre', border, borderData)
185
+ worksheet.getCell(row_index + 1, col_index + 1).border = border
186
+ }
187
+ // console.log(rang.column_focus + 1, rang.row_focus + 1)
188
+ // worksheet.getCell(rang.row_focus + 1, rang.column_focus + 1).border = border
189
+ })
190
+ }
191
+
192
+ // 新增:设置列宽
193
+ let setColumnWidths = function(worksheet, columnWidths) {
194
+ if (!columnWidths || Object.keys(columnWidths).length === 0) {
195
+ // 如果没有列宽配置,设置默认列宽
196
+ worksheet.columns.forEach(column => {
197
+ column.width = 15; // 默认宽度
198
+ });
199
+ return;
200
+ }
201
+
202
+ // 根据配置设置列宽
203
+ Object.keys(columnWidths).forEach(colIndex => {
204
+ const width = columnWidths[colIndex];
205
+ // 转换为Excel的列宽单位(大约是字符宽度的倍数)
206
+ const excelWidth = Math.max(8, Math.min(100, width / 7)); // 限制在合理范围内
207
+ worksheet.getColumn(parseInt(colIndex) + 1).width = excelWidth;
208
+ });
209
+ }
210
+
211
+ // 新增:设置行高
212
+ let setRowHeights = function(worksheet, rowHeights) {
213
+ if (!rowHeights || Object.keys(rowHeights).length === 0) return;
214
+
215
+ Object.keys(rowHeights).forEach(rowIndex => {
216
+ const height = rowHeights[rowIndex];
217
+ worksheet.getRow(parseInt(rowIndex) + 1).height = Math.max(15, Math.min(409, height)); // 限制在合理范围内
218
+ });
219
+ }
220
+
221
+ let setStyleAndValue = function(cellArr, worksheet) {
222
+ if (!Array.isArray(cellArr)) return
223
+
224
+ cellArr.forEach(function(row, rowid) {
225
+ row.every(function(cell, columnid) {
226
+ if (!cell) return true
227
+
228
+ let fill = fillConvert(cell.bg)
229
+ let font = fontConvert(
230
+ cell.ff,
231
+ cell.fc,
232
+ cell.bl,
233
+ cell.it,
234
+ cell.fs,
235
+ cell.cl,
236
+ cell.ul
237
+ )
238
+ let alignment = alignmentConvert(cell.vt, cell.ht, cell.tb, cell.tr)
239
+ let value = ''
240
+
241
+ // 处理不同类型的值
242
+ if (cell.f) {
243
+ value = { formula: cell.f, result: cell.v }
244
+ } else if (!cell.v && cell.ct && cell.ct.s) {
245
+ cell.ct.s.forEach(arr => {
246
+ value += arr.v
247
+ })
248
+ } else {
249
+ value = cell.v
250
+ }
251
+
252
+ let letter = createCellPos(columnid)
253
+ let target = worksheet.getCell(letter + (rowid + 1))
254
+
255
+ // 应用样式
256
+ for (const key in fill) {
257
+ target.fill = fill
258
+ break
259
+ }
260
+ target.font = font
261
+ target.alignment = alignment
262
+ target.value = value
263
+
264
+ // 处理数字格式
265
+ if (cell.ct && cell.ct.fa) {
266
+ target.numFmt = convertNumberFormat(cell.ct.fa)
267
+ }
268
+
269
+ return true
270
+ })
271
+ })
272
+ }
273
+
274
+ // 新增:转换数字格式
275
+ let convertNumberFormat = function(format) {
276
+ const formatMap = {
277
+ 'General': 'General',
278
+ '0': '0',
279
+ '0.00': '0.00',
280
+ '#,##0': '#,##0',
281
+ '#,##0.00': '#,##0.00',
282
+ '0%': '0%',
283
+ '0.00%': '0.00%',
284
+ '0.00E+00': '0.00E+00',
285
+ '# ?/?': '# ?/?',
286
+ '# ??/??': '# ??/??',
287
+ 'mm-dd-yy': 'mm-dd-yy',
288
+ 'd-mmm-yy': 'd-mmm-yy',
289
+ 'd-mmm': 'd-mmm',
290
+ 'mmm-yy': 'mmm-yy',
291
+ 'h:mm AM/PM': 'h:mm AM/PM',
292
+ 'h:mm:ss AM/PM': 'h:mm:ss AM/PM',
293
+ 'h:mm': 'h:mm',
294
+ 'h:mm:ss': 'h:mm:ss',
295
+ 'm/d/yy h:mm': 'm/d/yy h:mm',
296
+ '#,##0 ;(#,##0)': '#,##0 ;(#,##0)',
297
+ '#,##0 ;[Red](#,##0)': '#,##0 ;[Red](#,##0)',
298
+ '#,##0.00;(#,##0.00)': '#,##0.00;(#,##0.00)',
299
+ '#,##0.00;[Red](#,##0.00)': '#,##0.00;[Red](#,##0.00)',
300
+ 'mm:ss': 'mm:ss',
301
+ '[h]:mm:ss': '[h]:mm:ss',
302
+ 'mmss.0': 'mmss.0',
303
+ '##0.0E+0': '##0.0E+0',
304
+ '@': '@'
305
+ }
306
+
307
+ return formatMap[format] || 'General'
308
+ }
309
+
310
+ let fillConvert = function(bg) {
311
+ if (!bg) {
312
+ return {}
313
+ }
314
+
315
+ // 处理不同的颜色格式
316
+ let bgColor = bg;
317
+
318
+ // 处理rgb()格式的颜色
319
+ if (bg.startsWith('rgb(')) {
320
+ const rgbMatch = bg.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/);
321
+ if (rgbMatch) {
322
+ const r = parseInt(rgbMatch[1]).toString(16).padStart(2, '0');
323
+ const g = parseInt(rgbMatch[2]).toString(16).padStart(2, '0');
324
+ const b = parseInt(rgbMatch[3]).toString(16).padStart(2, '0');
325
+ bgColor = `#${r}${g}${b}`;
326
+ }
327
+ }
328
+
329
+ // 处理十六进制颜色格式
330
+ bgColor = bgColor.replace('#', '');
331
+ if (bgColor.length === 8) {
332
+ // 包含alpha通道,转换为ARGB
333
+ const alpha = bgColor.substring(0, 2);
334
+ const rgb = bgColor.substring(2);
335
+ bgColor = alpha + rgb;
336
+ } else if (bgColor.length === 6) {
337
+ // RGB格式,添加不透明的alpha通道
338
+ bgColor = 'FF' + bgColor;
339
+ } else if (bgColor.length === 3) {
340
+ // 简写格式 #RGB -> #RRGGBB
341
+ bgColor = 'FF' + bgColor.split('').map(c => c + c).join('');
342
+ }
343
+
344
+ let fill = {
345
+ type: 'pattern',
346
+ pattern: 'solid',
347
+ fgColor: { argb: bgColor.toUpperCase() }
348
+ }
349
+ return fill
350
+ }
351
+
352
+ let fontConvert = function(
353
+ ff = 0,
354
+ fc = '#000000',
355
+ bl = 0,
356
+ it = 0,
357
+ fs = 10,
358
+ cl = 0,
359
+ ul = 0
360
+ ) {
361
+ // luckysheet:ff(样式), fc(颜色), bl(粗体), it(斜体), fs(大小), cl(删除线), ul(下划线)
362
+ const luckyToExcel = {
363
+ 0: 'Microsoft YaHei', // 微软雅黑
364
+ 1: 'SimSun', // 宋体
365
+ 2: 'SimHei', // 黑体
366
+ 3: 'KaiTi', // 楷体
367
+ 4: 'FangSong', // 仿宋
368
+ 5: 'NSimSun', // 新宋体
369
+ 6: 'STXinwei', // 华文新魏
370
+ 7: 'STXingkai', // 华文行楷
371
+ 8: 'STLiti', // 华文隶书
372
+ 9: 'Arial',
373
+ 10: 'Times New Roman',
374
+ 11: 'Tahoma',
375
+ 12: 'Verdana',
376
+ num2bl: function(num) {
377
+ return num === 0 ? false : true
378
+ }
379
+ }
380
+
381
+ // 处理字体颜色,支持rgb()格式
382
+ let fontColor = fc || '#000000';
383
+ if (fontColor.startsWith('rgb(')) {
384
+ const rgbMatch = fontColor.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/);
385
+ if (rgbMatch) {
386
+ const r = parseInt(rgbMatch[1]).toString(16).padStart(2, '0');
387
+ const g = parseInt(rgbMatch[2]).toString(16).padStart(2, '0');
388
+ const b = parseInt(rgbMatch[3]).toString(16).padStart(2, '0');
389
+ fontColor = `#${r}${g}${b}`;
390
+ }
391
+ }
392
+
393
+ // 处理十六进制颜色格式
394
+ fontColor = fontColor.replace('#', '');
395
+ if (fontColor.length === 8) {
396
+ // 包含alpha通道
397
+ const alpha = fontColor.substring(0, 2);
398
+ const rgb = fontColor.substring(2);
399
+ fontColor = alpha + rgb;
400
+ } else if (fontColor.length === 6) {
401
+ // RGB格式
402
+ fontColor = 'FF' + fontColor;
403
+ } else if (fontColor.length === 3) {
404
+ // 简写格式 #RGB -> #RRGGBB
405
+ fontColor = 'FF' + fontColor.split('').map(c => c + c).join('');
406
+ }
407
+
408
+ let font = {
409
+ name: typeof ff === 'number' ? luckyToExcel[ff] : ff,
410
+ family: 2, // 修改为更通用的字体族
411
+ size: Math.max(8, Math.min(72, fs)), // 限制字体大小范围
412
+ color: { argb: fontColor.toUpperCase() },
413
+ bold: luckyToExcel.num2bl(bl),
414
+ italic: luckyToExcel.num2bl(it),
415
+ underline: luckyToExcel.num2bl(ul),
416
+ strike: luckyToExcel.num2bl(cl)
417
+ }
418
+
419
+ return font
420
+ }
421
+
422
+ let alignmentConvert = function(
423
+ vt = 'default',
424
+ ht = 'default',
425
+ tb = 'default',
426
+ tr = 'default'
427
+ ) {
428
+ const luckyToExcel = {
429
+ vertical: {
430
+ 0: 'middle',
431
+ 1: 'top',
432
+ 2: 'bottom',
433
+ default: 'middle' // 修改默认值为居中
434
+ },
435
+ horizontal: {
436
+ 0: 'center',
437
+ 1: 'left',
438
+ 2: 'right',
439
+ default: 'left'
440
+ },
441
+ wrapText: {
442
+ 0: false,
443
+ 1: false,
444
+ 2: true,
445
+ default: false
446
+ },
447
+ textRotation: {
448
+ 0: 0,
449
+ 1: 45,
450
+ 2: -45,
451
+ 3: 'vertical',
452
+ 4: 90,
453
+ 5: -90,
454
+ default: 0
455
+ }
456
+ }
457
+
458
+ let alignment = {
459
+ vertical: luckyToExcel.vertical[vt],
460
+ horizontal: luckyToExcel.horizontal[ht],
461
+ wrapText: luckyToExcel.wrapText[tb],
462
+ textRotation: luckyToExcel.textRotation[tr]
463
+ }
464
+ return alignment
465
+ }
466
+
467
+ let borderConvert = function(borderType, style = 1, color = '#000') {
468
+ if (!borderType) {
469
+ return {}
470
+ }
471
+
472
+ const luckyToExcel = {
473
+ type: {
474
+ 'border-all': 'all',
475
+ 'border-top': 'top',
476
+ 'border-right': 'right',
477
+ 'border-bottom': 'bottom',
478
+ 'border-left': 'left'
479
+ },
480
+ style: {
481
+ 0: 'none',
482
+ 1: 'thin',
483
+ 2: 'hair',
484
+ 3: 'dotted',
485
+ 4: 'dashDot',
486
+ 5: 'dashDot',
487
+ 6: 'dashDotDot',
488
+ 7: 'double',
489
+ 8: 'medium',
490
+ 9: 'mediumDashed',
491
+ 10: 'mediumDashDot',
492
+ 11: 'mediumDashDotDot',
493
+ 12: 'slantDashDot',
494
+ 13: 'thick'
495
+ }
496
+ }
497
+
498
+ // 处理边框颜色,添加边界检查
499
+ let borderColor = color || '#000'; // 确保color有默认值
500
+ if (typeof borderColor === 'string') {
501
+ borderColor = borderColor.replace('#', '')
502
+ if (borderColor.length === 8) {
503
+ const alpha = borderColor.substring(0, 2)
504
+ const rgb = borderColor.substring(2)
505
+ borderColor = alpha + rgb
506
+ } else if (borderColor.length === 6) {
507
+ borderColor = 'FF' + borderColor
508
+ }
509
+ } else {
510
+ borderColor = 'FF000000' // 默认黑色
511
+ }
512
+
513
+ let template = {
514
+ style: luckyToExcel.style[style],
515
+ color: { argb: borderColor }
516
+ }
517
+ let border = {}
518
+
519
+ if (luckyToExcel.type[borderType] === 'all') {
520
+ border['top'] = template
521
+ border['right'] = template
522
+ border['bottom'] = template
523
+ border['left'] = template
524
+ } else {
525
+ border[luckyToExcel.type[borderType]] = template
526
+ }
527
+
528
+ return border
529
+ }
530
+
531
+ function addborderToCell(borders, row_index, col_index) {
532
+ let border = {}
533
+ const luckyExcel = {
534
+ type: {
535
+ l: 'left',
536
+ r: 'right',
537
+ b: 'bottom',
538
+ t: 'top'
539
+ },
540
+ style: {
541
+ 0: 'none',
542
+ 1: 'thin',
543
+ 2: 'hair',
544
+ 3: 'dotted',
545
+ 4: 'dashDot',
546
+ 5: 'dashDot',
547
+ 6: 'dashDotDot',
548
+ 7: 'double',
549
+ 8: 'medium',
550
+ 9: 'mediumDashed',
551
+ 10: 'mediumDashDot',
552
+ 11: 'mediumDashDotDot',
553
+ 12: 'slantDashDot',
554
+ 13: 'thick'
555
+ }
556
+ }
557
+
558
+ for (const bor in borders) {
559
+ // 添加边界检查,确保borders[bor]存在且有color属性
560
+ if (!borders[bor] || !borders[bor].color) {
561
+ continue;
562
+ }
563
+
564
+ let borderColor = borders[bor].color
565
+ if (borderColor.indexOf('rgb') === -1) {
566
+ borderColor = borderColor.replace('#', '')
567
+ if (borderColor.length === 8) {
568
+ const alpha = borderColor.substring(0, 2)
569
+ const rgb = borderColor.substring(2)
570
+ borderColor = alpha + rgb
571
+ } else if (borderColor.length === 6) {
572
+ borderColor = 'FF' + borderColor
573
+ }
574
+ }
575
+
576
+ border[luckyExcel.type[bor]] = {
577
+ style: luckyExcel.style[borders[bor].style],
578
+ color: { argb: borderColor }
579
+ }
580
+ }
581
+
582
+ return border
583
+ }
584
+
585
+ function createCellPos(n) {
586
+ let ordA = 'A'.charCodeAt(0)
587
+ let ordZ = 'Z'.charCodeAt(0)
588
+ let len = ordZ - ordA + 1
589
+ let s = ''
590
+ while (n >= 0) {
591
+ s = String.fromCharCode((n % len) + ordA) + s
592
+ n = Math.floor(n / len) - 1
593
+ }
594
+ return s
595
+ }