分析
前段时间有一朋友说有个需求,所以我就利用自己所学的vue做一个实战练习
需求:excel考试题目
转换成word
需要的依赖 : xlsx的一个包
因为涉及转换而且利用官方推荐的迅捷pdf转换器
转换的只是一张表内容,内容根本无法全覆盖多列内容,因为涉及好几个单元格的拼接,所以只好利用插件解析成数组对象,然后导出
思路
- 利用这个xslx包把excel表第一页解析成对象数组
- 然后利用v-for遍历显示在html页面当中去
- 导出.doc 文件
问题
- 文档里必须经过修改首行字符为zh [已解决]
- li标签导出出现错乱问题 [已解决]
- 一开始认为导出文件直接
ctrl-v
+ ctrl-c
结果出现系统内存分配不足卡机,我也不知道是不是自己电脑配置方面落伍了,感觉应该是数据量太大,遍历占中CPU率太高,所以选择用'data:application/vnd.ms-word;charset=utf-8,'
格式导出word文档 [已解决]
源文件
点击下载
源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script> <script type="text/javascript" src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script> <div id="app"> <input type="file" ref="upload" accept=".xls,.xlsx" class="outputlist_upload"> <input type="text" name="" v-model="filename" style="text-align: center;"><span>.doc</span> <button type="button" @click="getOutword">导出word</button> <div id="downloadwrap"> <ul> <div v-for="item in outputs" :key="item.id"> <h4>{{item.id}}. {{item.title}}( ) <small style="color: #999">[{{item.types}}]</small></h4> <p>A:{{item.a_select}}</p> <p>B:{{item.b_select}}</p> <p>C:{{item.c_select}}<p> <p>D:{{item.d_select}}</p> <div> 正确答案:<font color="red">{{item.answer}}</font> </div> </div> </ul> </div> </div>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| var vm = new Vue({ el:'#app', data(){ return{ filename:'', outputs:[] } }, mounted() { this.$refs.upload.addEventListener('change', e => { this.readExcel(e); }) }, methods:{ readExcel(e) { var that = this; const files = e.target.files; console.log(files); if(files.length<=0){ return false; }else if(!/\.(xls|xlsx)$/.test(files[0].name.toLowerCase())){ this.$Message.error('上传格式不正确,请上传xls或者xlsx格式'); return false; } const fileReader = new FileReader(); fileReader.onload = (ev) => { try { const data = ev.target.result; const workbook = XLSX.read(data, { type: 'binary' }); const wsname = workbook.SheetNames[0]; const ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname]); console.log(ws); that.outputs = []; for(var i= 0;i<ws.length;i++){ var sheetData = { types: ws[i].type, id: ws[i].id, title: ws[i].title, a_select: ws[i].A, b_select: ws[i].B, c_select: ws[i].C, d_select: ws[i].D, answer: ws[i].answer, dif: ws[i].dif, name: ws[i].name
} that.outputs.push(sheetData); } this.$refs.upload.value = ''; } catch (e) { return false; } }; fileReader.readAsBinaryString(files[0]); }, getOutword:function(id,fileName){ var header = "<html xmlns:o='urn:schemas-microsoft-com:office:office' " + "xmlns:w='urn:schemas-microsoft-com:office:word' " + "xmlns='http://www.w3.org/TR/REC-html40'>" + "<head><meta charset='utf-8'><title>Export HTML to Word Document with JavaScript</title></head><body>" var footer = '</body></html>' var sourceHTML = header + document.getElementById('downloadwrap').innerHTML + footer var source = 'data:application/vnd.ms-word;charset=utf-8,' + encodeURIComponent(sourceHTML) var fileDownload = document.createElement('a') document.body.appendChild(fileDownload) fileDownload.href = source fileDownload.download = this.filename + '.doc' fileDownload.click() document.body.removeChild(fileDownload) } }, })
|
演示地址