vue.js-excel上傳+匯出html
by cactus77kiki
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.10/vue.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.10.8/xlsx.full.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.3/FileSaver.min.js"></script>
<div id="app">
<h3>Vue.js - xlsx單檔單工作表上傳、顯示上傳內容;html內容匯出xlsx</h3>
<input type="file" @change="processupload">
<br/><br/>
上傳資料筆數:{{rowcount}}筆<br/>
上傳內容:
<table class="table table-bordered jsontable" id="apptable">
<thead>
<th v-for="(row,index) in filetitle">
{{row}}
</th>
</thead>
<tbody>
<tr v-for="(row,index) in filedata" >
<!--<td>{{row.This}}</td>
<td>{{row.is}}</td>
<td>{{row.a}}</td>
<td>{{row.Test}}</td>-->
<!--<td>{{row.postId}}</td>
<td>{{row.id}}</td>
<td>{{row.name}}</td>
<td>{{row.email}}</td>
<td>{{row.body}}</td>-->
<td v-for="title in filetitle">{{row[title]}}</td>
</tr>
</tbody>
</table>
<br/>
<button v-if="filedata.length>0" @click="exporthtml">表格資料匯出(html匯出)</button><br/>
title:{{filetitle}}
<br/>
資料轉Json:
{{filedata}}
</div>
CSS
table.jsontable {
border-collapse: collapse;
width: 100%;
}
table.jsontable, .jsontable th, .jsontable td {
text-align: left;
padding: 8px;
border: 1px solid #ddd;
/*border-bottom: 1px solid #ddd;*/
}
.jsontable th {
background-color: #7095F6;
color: white;
}
.jsontable tr:nth-child(even) {background-color: #f2f2f2;}
JavaScript
/*
範例:vue.js-excel上傳+匯出html
上傳excel轉json改寫為元件參考: https://jsfiddle.net/cactus77kiki/om1fhzw3/
ref:
upload file(vue)
https://forum.vuejs.org/t/vuejs2-file-input/633/2
upload file and priview(vue)
https://codepen.io/Atinux/pen/qOvawK/
read xlsx(js)
https://codepen.io/serazo/pen/veVwxZ
table css
https://www.w3schools.com/css/css_table.asp
*/
var obj = [];
var vapp=new Vue({
el:"#app",
data:{
//filedata:[] //上傳資料(轉json資料)
filedata: obj
},
computed:{
//取得物件title
filetitle: function(){
var fileary = this.filedata;
if(fileary.length == 0)
return [];
else{
var arry = Object.keys(fileary[0]);
return arry;
}
},
rowcount: function(){
var fileary = this.filedata;
if(fileary.length == 0)
return 0;
else
return fileary.length;
}
},
methods:{
//上傳
processupload: function(e){
var files = e.target.files || e.dataTransfer.files;
if (!files.length)
return;
filetojson(files[0]);
},
//html匯出
exporthtml: function(){
return export_table_to_excel("apptable","downloadtest","sheet_1");
}
}
});
function filetojson(file){
var reader = new FileReader();
reader.onload = function(e) {
var data = e.target.result;
workbook = XLSX.read(data, {type: 'binary' });
var first_sheet_name = workbook.SheetNames[0];
var worksheet = workbook.Sheets[first_sheet_name];
var jsondata = XLSX.utils.sheet_to_json(worksheet,{raw:true});
//vapp.filedata = jsondata;
//obj = jsondata;
console.log(jsondata);
for(var i = 0; i <jsondata.length; i++){
obj.push(jsondata[i]);
}
//console.log(jsondata);
};
reader.readAsBinaryString(file);
}
//param:html id. filename: 檔名(不含檔案類型). sheetname: 工作表名稱
function export_table_to_excel(param,filename,sheetname){
var type="xlsx";
var fn=filename || 'test';
var wb =...