应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

vue使用xlsx.js导出excel。处理合并单元格,字体颜色,边框等

223人阅读 2023/7/7 16:19 总访问:5182785 评论:0 收藏:0 手机
分类: 前端

导出excel的效果:

有合并单元格,字体颜色,边框等。

引入需要使用的组件

  1. import { utils } from 'xlsx'
  2. import XLSX from 'xlsx-style'
  3. import FileSaver from 'file-saver'

xlsx-style用来处理样式,可能这个库里边有包含xlsx的库,不是很确定,没有去尝试

引入了后运行可能会报错

解决方法:
在\node_modules\xlsx-style\dist\cpexcel.js 807行的

  1. var cpt = require('./cpt' + 'able');

改为:

  1. var cpt = cptable;

核心代码

核心代码如下:

  1. // 导出实验课程excel
  2. exportLabroomCourse(cid) {
  3. const levelArray = ['对口', '高质量', '明星']
  4. const typeArray = ['必做', '拓展']
  5. this.$http.get('/education/api/course/GetLabRoomByCourseID', { CourseID: cid }).then(res => {
  6. const excelData = [{ no: '课程实验清单' }]
  7. const header = {
  8. no: '序号',
  9. courseName: '教材名称',
  10. chapterName: '教材章节',
  11. level: '等级',
  12. type: '类型',
  13. labRoomTitle: '实验名称'
  14. }
  15. excelData.push(header)
  16. let index = 1
  17. const chapterMerges = []
  18. console.log(res.data)
  19. res.data.chapterList.forEach((cp) => {
  20. // debugger
  21. chapterMerges.push({
  22. e: { c: 2, r: index + 2 },
  23. s: { c: 2, r: index + 1 + cp.labRoomVMList.length }
  24. })
  25. cp.labRoomVMList.forEach((kp) => {
  26. excelData.push({
  27. no: index,
  28. courseName: res.data.courseName,
  29. chapterName: `${cp.chapterTitle} ${cp.titleContent}`,
  30. level: levelArray[kp.level-1],
  31. type: typeArray[kp.type-1],
  32. labRoomTitle: kp.labRoomTitle
  33. })
  34. index++
  35. })
  36. })
  37. // 合并结束位置 c:列位置 r:表示行位置
  38. const merges = [
  39. { // 标题合并
  40. e: { c: 0, r: 1 },
  41. s: { c: 5, r: 1 }
  42. },
  43. { // 课程名称纵向合并
  44. e: { c: 1, r: 3 },
  45. s: { c: 1, r: index + 1 }
  46. }]
  47. // 合并章节
  48. merges.push(...chapterMerges)
  49. console.log(excelData)
  50. this.exportExcelFile(excelData, merges, res.data.courseName, `${res.data.courseName}.xlsx`, index + 2)
  51. })
  52. },
  53. /**
  54. * 导出 excel 文件
  55. * @param array JSON 数组
  56. * @param sheetName 第一张表名
  57. * @param fileName 文件名
  58. * @param merges 合并单元格json
  59. * @param rowCount 行数
  60. */
  61. exportExcelFile(array, merges, sheetName = 'sheet1', fileName = 'example.xlsx', rowCount) {
  62. console.log(array)
  63. const jsonWorkSheet = utils.json_to_sheet(array)
  64. // 合并单元格
  65. if (merges && merges.length > 0) {
  66. jsonWorkSheet['!merges'] = merges
  67. }
  68. // 不要第一行
  69. jsonWorkSheet['!ref'] = `A2:F${rowCount + 2}`
  70. // 设置列宽
  71. jsonWorkSheet['!cols'] = [
  72. { wpx: 65 },
  73. { wpx: 165 },
  74. { wpx: 280 },
  75. { wpx: 80 },
  76. { wpx: 80 },
  77. { wpx: 280 }]
  78. jsonWorkSheet['!rows'] = [{ hpt: 20 }]// 行高
  79. for (var prop in jsonWorkSheet) {
  80. if (prop.indexOf('!') === -1) {
  81. jsonWorkSheet[prop].s = {
  82. font: {
  83. name: '微软雅黑',
  84. sz: 10,
  85. color: 'FF000000'
  86. },
  87. alignment: { horizontal: 'center', vertical: 'center', wrap_text: true },
  88. border: {
  89. top: { style: 'thin', color: 'FFFFAA00' },
  90. bottom: { style: 'thin', color: 'FFFFAA00' },
  91. left: { style: 'thin', color: 'FFFFAA00' },
  92. right: { style: 'thin', color: 'FFFFAA00' }
  93. }
  94. }
  95. const rc = prop.substring(1, prop.length)
  96. // 从第4行(内容居左)
  97. if (rc > 3 && (prop.indexOf('C') !== -1 || prop.indexOf('F') !== -1)) {
  98. jsonWorkSheet[prop].s.alignment.horizontal = 'left'
  99. }
  100. }
  101. }
  102. console.log(jsonWorkSheet)
  103. const workBook = {
  104. SheetNames: [sheetName],
  105. Sheets: {
  106. [sheetName]: jsonWorkSheet
  107. }
  108. }
  109. var wbout = XLSX.write(workBook, {
  110. bookType: 'xlsx',
  111. bookSST: false,
  112. type: 'binary'
  113. })
  114. FileSaver.saveAs(
  115. new Blob([this.s2ab(wbout)], { type: 'application/octet-stream' }),
  116. fileName
  117. )
  118. },
  119. s2ab(s) {
  120. var buf = new ArrayBuffer(s.length)
  121. var view = new Uint8Array(buf)
  122. for (var i = 0; i !== s.length; ++i) view[i] = s.charCodeAt(i) & 0xff
  123. return buf
  124. }

使用一个按钮执行这个方法即可,传递了一个课程id

  1. <el-button size="mini" type="text" @click="exportLabroomCourse(scope.row.id)">导出</el-button>

贴一下接口返回的测试数据

测试数据如下:

  1. {
  2. "code": 0,
  3. "data": {
  4. "courseID": "1a9b5c35f6ad47ddab639d39f4c02664",
  5. "courseName": "C语言程序设计(V12.0.0)",
  6. "chapterList": [
  7. {
  8. "chapterID": "14e204abb35a4dc29bcb79be9a0a4768",
  9. "chapterTitle": "第1章",
  10. "titleContent": "编程的基本概念",
  11. "kpList": null,
  12. "labRoomVMList": [
  13. {
  14. "labRoomID": "79cea8e744ac4225820fa81d21da3420",
  15. "chapterID": "14e204abb35a4dc29bcb79be9a0a4768",
  16. "labRoomTitle": "完成安装Visual Studio 2010",
  17. "level": 1,
  18. "type": 2
  19. },
  20. {
  21. "labRoomID": "82da1c41cb7542cba2ec6b47f54ebd9e",
  22. "chapterID": "14e204abb35a4dc29bcb79be9a0a4768",
  23. "labRoomTitle": "完成在控制台输出“Hello World”",
  24. "level": 1,
  25. "type": 1
  26. },
  27. {
  28. "labRoomID": "59cb300285404556a6a6208ad936244c",
  29. "chapterID": "14e204abb35a4dc29bcb79be9a0a4768",
  30. "labRoomTitle": "完成在控制台打印“我爱熊猫”图案",
  31. "level": 1,
  32. "type": 1
  33. },
  34. {
  35. "labRoomID": "f6f88d40e6254b189c441a7b3e8d766d",
  36. "chapterID": "14e204abb35a4dc29bcb79be9a0a4768",
  37. "labRoomTitle": "完成打印一个菱形图案",
  38. "level": 1,
  39. "type": 1
  40. },
  41. {
  42. "labRoomID": "0337c524550445bd9a3c9ae668b51c00",
  43. "chapterID": "14e204abb35a4dc29bcb79be9a0a4768",
  44. "labRoomTitle": "啊啊啊啊啊啊",
  45. "level": 2,
  46. "type": 1
  47. }
  48. ]
  49. },
  50. {
  51. "chapterID": "7d93c5eb862b49078aa451453d65ef63",
  52. "chapterTitle": "第2章",
  53. "titleContent": "变量、常量和数据类型",
  54. "kpList": null,
  55. "labRoomVMList": [
  56. {
  57. "labRoomID": "edcea5c1d08449f4b6f451c1a1898f51",
  58. "chapterID": "7d93c5eb862b49078aa451453d65ef63",
  59. "labRoomTitle": "完成交换两个变量的值",
  60. "level": 1,
  61. "type": 1
  62. },
  63. {
  64. "labRoomID": "5763dee5c407425485ff2fd15899a335",
  65. "chapterID": "7d93c5eb862b49078aa451453d65ef63",
  66. "labRoomTitle": "完成计算五门课程的总成绩和平均成绩",
  67. "level": 1,
  68. "type": 1
  69. },
  70. {
  71. "labRoomID": "10b3bd176e9549138f13ea0547d03d31",
  72. "chapterID": "7d93c5eb862b49078aa451453d65ef63",
  73. "labRoomTitle": "完成求圆的面积和周长",
  74. "level": 1,
  75. "type": 1
  76. },
  77. {
  78. "labRoomID": "f3a19f52795644cbb0d4d45dc18389d2",
  79. "chapterID": "7d93c5eb862b49078aa451453d65ef63",
  80. "labRoomTitle": "完成进行算术运算输出运算图形",
  81. "level": 1,
  82. "type": 1
  83. },
  84. {
  85. "labRoomID": "d931b2e157984f1fa463f0a28d7c5c03",
  86. "chapterID": "7d93c5eb862b49078aa451453d65ef63",
  87. "labRoomTitle": "AJ上传的测试实验",
  88. "level": 1,
  89. "type": 1
  90. },
  91. {
  92. "labRoomID": "2d04eba77d0341b9b96f61f2a97ee398",
  93. "chapterID": "7d93c5eb862b49078aa451453d65ef63",
  94. "labRoomTitle": "完成进行算术运算输出运算图形",
  95. "level": 1,
  96. "type": 1
  97. }
  98. ]
  99. },
  100. {
  101. "chapterID": "62c7deff7b3b4520a7429b566750b314",
  102. "chapterTitle": "第3章",
  103. "titleContent": "运算符与表达式",
  104. "kpList": null,
  105. "labRoomVMList": [
  106. {
  107. "labRoomID": "8463c8e35a4a4455bbc2d0668d8a122b",
  108. "chapterID": "62c7deff7b3b4520a7429b566750b314",
  109. "labRoomTitle": "完成在三个不相同的数中求最大值",
  110. "level": 1,
  111. "type": 1
  112. },
  113. {
  114. "labRoomID": "57ba743fdfeb4e7e9e3fe3dc90ad84ff",
  115. "chapterID": "62c7deff7b3b4520a7429b566750b314",
  116. "labRoomTitle": "完成大小写互换",
  117. "level": 1,
  118. "type": 1
  119. },
  120. {
  121. "labRoomID": "6d66d991520b4d92bddd7626e11da2ff",
  122. "chapterID": "62c7deff7b3b4520a7429b566750b314",
  123. "labRoomTitle": "完成求一个五位数各个位上数字和",
  124. "level": 1,
  125. "type": 1
  126. },
  127. {
  128. "labRoomID": "f84ae8e39f4840239d92ff0a3ecf1606",
  129. "chapterID": "62c7deff7b3b4520a7429b566750b314",
  130. "labRoomTitle": "完成在四个不同的数中求最小值",
  131. "level": 1,
  132. "type": 1
  133. },
  134. {
  135. "labRoomID": "daff898455584845b36d17b4a6147534",
  136. "chapterID": "62c7deff7b3b4520a7429b566750b314",
  137. "labRoomTitle": "增加第三章实验",
  138. "level": 3,
  139. "type": 1
  140. }
  141. ]
  142. },
  143. {
  144. "chapterID": "27a7ec69305747d3a8d0ad4f2db57b21",
  145. "chapterTitle": "第4章",
  146. "titleContent": "输入输出语句",
  147. "kpList": null,
  148. "labRoomVMList": [
  149. {
  150. "labRoomID": "fd7fa47b8d5542afb76537998c94e5a4",
  151. "chapterID": "27a7ec69305747d3a8d0ad4f2db57b21",
  152. "labRoomTitle": "完成计算圆相关的数据",
  153. "level": 1,
  154. "type": 1
  155. },
  156. {
  157. "labRoomID": "83acde49d5694befb8e8611f98b24cea",
  158. "chapterID": "27a7ec69305747d3a8d0ad4f2db57b21",
  159. "labRoomTitle": "完成实现单个汉字的输入输出",
  160. "level": 1,
  161. "type": 1
  162. }
  163. ]
  164. },
  165. {
  166. "chapterID": "3f408833fca74a80b8211ef43c9b2c43",
  167. "chapterTitle": "第5章",
  168. "titleContent": "条件语句1",
  169. "kpList": null,
  170. "labRoomVMList": [
  171. {
  172. "labRoomID": "33d6e120db084d35bc912d176bdc09b2",
  173. "chapterID": "3f408833fca74a80b8211ef43c9b2c43",
  174. "labRoomTitle": "完成通过条件语句实现数学计算操作",
  175. "level": 1,
  176. "type": 1
  177. },
  178. {
  179. "labRoomID": "9916059f248b4e3b88fdb97f80cf3e42",
  180. "chapterID": "3f408833fca74a80b8211ef43c9b2c43",
  181. "labRoomTitle": "完成判断成绩等级",
  182. "level": 1,
  183. "type": 2
  184. },
  185. {
  186. "labRoomID": "9709c2c526194eb6bed9ea55e60ab82a",
  187. "chapterID": "3f408833fca74a80b8211ef43c9b2c43",
  188. "labRoomTitle": "完成判断三角形类型",
  189. "level": 1,
  190. "type": 1
  191. },
  192. {
  193. "labRoomID": "a503294f126e4390854f13ae418d80f5",
  194. "chapterID": "3f408833fca74a80b8211ef43c9b2c43",
  195. "labRoomTitle": "完成计算个人所得税",
  196. "level": 1,
  197. "type": 1
  198. }
  199. ]
  200. },
  201. {
  202. "chapterID": "d83d73af5d544586bff8fc9aeccfe2ba",
  203. "chapterTitle": "第6章",
  204. "titleContent": "条件语句2",
  205. "kpList": null,
  206. "labRoomVMList": [
  207. {
  208. "labRoomID": "233b282eae17459ea1e7932f46f1557f",
  209. "chapterID": "d83d73af5d544586bff8fc9aeccfe2ba",
  210. "labRoomTitle": "完成使用switch-case实现菜单选择",
  211. "level": 1,
  212. "type": 1
  213. },
  214. {
  215. "labRoomID": "737649e346d4471fa18e10b7f3e5aba6",
  216. "chapterID": "d83d73af5d544586bff8fc9aeccfe2ba",
  217. "labRoomTitle": "完成计算某天是某年里的第几天",
  218. "level": 1,
  219. "type": 2
  220. },
  221. {
  222. "labRoomID": "c1d86ec5756c43b5bff714fc0904a581",
  223. "chapterID": "d83d73af5d544586bff8fc9aeccfe2ba",
  224. "labRoomTitle": "完成计算自2005年以来的总天数",
  225. "level": 1,
  226. "type": 1
  227. }
  228. ]
  229. },
  230. ]
  231. }
  232. ]
  233. },
  234. "success": true,
  235. }

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价