Files
vxe-table/examples/views/table/advanced/Export.vue
xuliangzhan a4b48dbed4 更新文档
2020-01-07 17:22:27 +08:00

539 lines
17 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div>
<p class="tip">
通过调用 <table-api-link prop="exportData"/> 函数指定 type='csv' 可以直接将表格导出为 CSV/HTML/XML/TXT 格式的文件<br>
默认会排除 field 为空和 type 相关的功能列可以通过自定义 <table-api-link prop="data"/> <table-api-link prop="columns"/> 导出数据<br>
<span class="red">只支持基本数据结构目前不支持分组合并等树结构和虚拟滚动只允许导出数据源</span>
</p>
<vxe-toolbar>
<template v-slot:buttons>
<vxe-button @click="exportDataEvent">默认导出</vxe-button>
<vxe-button @click="exportSelectEvent">导出选中</vxe-button>
</template>
</vxe-toolbar>
<vxe-table
highlight-hover-row
border="none"
ref="xTable1"
height="300"
:data="tableData">
<vxe-table-column type="checkbox" width="60"></vxe-table-column>
<vxe-table-column type="seq" width="60"></vxe-table-column>
<vxe-table-column field="name" title="Name"></vxe-table-column>
<vxe-table-column field="sex" title="Sex"></vxe-table-column>
<vxe-table-column field="age" title="Age" sortable></vxe-table-column>
<vxe-table-column field="address" title="Address" show-overflow></vxe-table-column>
</vxe-table>
<p class="demo-code">{{ $t('app.body.button.showCode') }}</p>
<pre>
<code class="xml">{{ demoCodes[0] }}</code>
<code class="javascript">{{ demoCodes[1] }}</code>
</pre>
<p class="tip">配置 <table-api-link prop="columnFilterMethod"/> 参数过滤指定列</p>
<vxe-toolbar>
<template v-slot:buttons>
<vxe-button @click="exportDataEvent2">导出指定列 [name,sex]</vxe-button>
</template>
</vxe-toolbar>
<vxe-table
highlight-hover-row
ref="xTable2"
height="300"
:data="tableData">
<vxe-table-column type="seq" width="60"></vxe-table-column>
<vxe-table-column field="name" title="Name"></vxe-table-column>
<vxe-table-column field="sex" title="Sex"></vxe-table-column>
<vxe-table-column field="age" title="Age" sortable></vxe-table-column>
<vxe-table-column field="address" title="Address" show-overflow></vxe-table-column>
</vxe-table>
<p class="demo-code">{{ $t('app.body.button.showCode') }}</p>
<pre>
<code class="xml">{{ demoCodes[2] }}</code>
<code class="javascript">{{ demoCodes[3] }}</code>
</pre>
<p class="tip">配置 <table-api-link prop="dataFilterMethod"/> 参数过滤指定行</p>
<vxe-toolbar>
<template v-slot:buttons>
<vxe-button @click="exportDataEvent3">导出指定第10-20行</vxe-button>
</template>
</vxe-toolbar>
<vxe-table
show-footer
highlight-hover-row
height="300"
ref="xTable3"
:footer-method="footerMethod"
:data="tableData">
<vxe-table-column type="seq" width="60"></vxe-table-column>
<vxe-table-column field="name" title="Name"></vxe-table-column>
<vxe-table-column field="sex" title="Sex" :formatter="formatterSex"></vxe-table-column>
<vxe-table-column field="age" title="Age" sortable></vxe-table-column>
<vxe-table-column field="address" title="Address" show-overflow></vxe-table-column>
</vxe-table>
<p class="demo-code">{{ $t('app.body.button.showCode') }}</p>
<pre>
<code class="xml">{{ demoCodes[4] }}</code>
<code class="javascript">{{ demoCodes[5] }}</code>
</pre>
<p class="tip">不导出表头指定文件名导出源数据,格式化数据</p>
<vxe-toolbar>
<template v-slot:buttons>
<vxe-button @click="exportCurrDataEvent4">导出当前页</vxe-button>
<vxe-button @click="exportDataEvent4">自定义数据导出</vxe-button>
<vxe-button @click="exportAllDataEvent4">全量导出后台数据</vxe-button>
</template>
</vxe-toolbar>
<vxe-table
border
show-footer
highlight-hover-row
ref="xTable4"
height="300"
:loading="loading"
:footer-method="footerMethod"
:data="tableData4">
<vxe-table-column type="seq" width="60"></vxe-table-column>
<vxe-table-column field="name" title="Name"></vxe-table-column>
<vxe-table-column field="sex" title="Sex" :formatter="formatterSex"></vxe-table-column>
<vxe-table-column field="age" title="Age"></vxe-table-column>
<vxe-table-column field="role" title="Role"></vxe-table-column>
</vxe-table>
<vxe-pager
:loading="loading"
:current-page="tablePage4.currentPage"
:page-size="tablePage4.pageSize"
:total="tablePage4.totalResult"
:layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
@page-change="handlePageChange">
</vxe-pager>
<p class="demo-code">{{ $t('app.body.button.showCode') }}</p>
<pre>
<code class="xml">{{ demoCodes[6] }}</code>
<code class="javascript">{{ demoCodes[7] }}</code>
</pre>
</div>
</template>
<script>
import XEUtils from 'xe-utils'
import XEAjax from 'xe-ajax'
import hljs from 'highlight.js'
export default {
data () {
return {
loading: false,
tableData: [],
tableData4: [],
tablePage4: {
currentPage: 1,
pageSize: 10,
totalResult: 0
},
demoCodes: [
`
<vxe-toolbar>
<template v-slot:buttons>
<vxe-button @click="exportDataEvent">默认导出</vxe-button>
<vxe-button @click="exportSelectEvent">导出选中</vxe-button>
</template>
</vxe-toolbar>
<vxe-table
highlight-hover-row
border="none"
ref="xTable1"
height="300"
:data="tableData">
<vxe-table-column type="checkbox" width="60"></vxe-table-column>
<vxe-table-column type="seq" width="60"></vxe-table-column>
<vxe-table-column field="name" title="Name"></vxe-table-column>
<vxe-table-column field="sex" title="Sex"></vxe-table-column>
<vxe-table-column field="age" title="Age" sortable></vxe-table-column>
<vxe-table-column field="address" title="Address" show-overflow></vxe-table-column>
</vxe-table>
`,
`
export default {
data () {
return {
tableData: []
}
},
created () {
this.tableData = window.MOCK_DATA_LIST.slice(0, 50)
},
methods: {
exportDataEvent () {
this.$refs.xTable1.exportData({ type: 'csv' })
},
exportSelectEvent () {
this.$refs.xTable1.exportData({
data: this.$refs.xTable1.getCheckboxRecords()
})
}
}
}
`,
`
<vxe-toolbar>
<template v-slot:buttons>
<vxe-button @click="exportDataEvent2">导出指定列 [name,sex]</vxe-button>
</template>
</vxe-toolbar>
<vxe-table
highlight-hover-row
ref="xTable2"
height="300"
:data="tableData">
<vxe-table-column type="seq" width="60"></vxe-table-column>
<vxe-table-column field="name" title="Name"></vxe-table-column>
<vxe-table-column field="sex" title="Sex"></vxe-table-column>
<vxe-table-column field="age" title="Age" sortable></vxe-table-column>
<vxe-table-column field="address" title="Address" show-overflow></vxe-table-column>
</vxe-table>
`,
`
export default {
data () {
return {
tableData: []
}
},
created () {
this.tableData = window.MOCK_DATA_LIST.slice(0, 50)
},
methods: {
exportDataEvent2 () {
this.$refs.xTable2.exportData({
type: 'csv',
columnFilterMethod: column => ['name', 'sex'].includes(column.property)
})
}
}
}
`,
`
<vxe-toolbar>
<template v-slot:buttons>
<vxe-button @click="exportDataEvent3">导出指定第10-20行</vxe-button>
</template>
</vxe-toolbar>
<vxe-table
show-footer
highlight-hover-row
height="300"
ref="xTable3"
:footer-method="footerMethod"
:data="tableData">
<vxe-table-column type="seq" width="60"></vxe-table-column>
<vxe-table-column field="name" title="Name"></vxe-table-column>
<vxe-table-column field="sex" title="Sex" :formatter="formatterSex"></vxe-table-column>
<vxe-table-column field="age" title="Age" sortable></vxe-table-column>
<vxe-table-column field="address" title="Address" show-overflow></vxe-table-column>
</vxe-table>
`,
`
export default {
data () {
return {
tableData: []
}
},
created () {
this.tableData = window.MOCK_DATA_LIST.slice(0, 50)
},
methods: {
formatterSex ({ cellValue }) {
if (cellValue === '1') {
return '男'
} else if (cellValue === '0') {
return '女'
}
return cellValue
},
footerMethod ({ columns, data }) {
const footerData = [
columns.map((column, columnIndex) => {
if (columnIndex === 0) {
return '平均'
}
if (['age'].includes(column.property)) {
return XEUtils.mean(data, column.property)
}
return null
})
]
return footerData
},
exportDataEvent3 () {
this.$refs.xTable3.exportData({
type: 'csv',
dataFilterMethod: (row, rowIndex) => rowIndex >= 9 && rowIndex < 20
})
}
}
}
`,
`
<vxe-toolbar>
<template v-slot:buttons>
<vxe-button @click="exportCurrDataEvent4">导出当前页</vxe-button>
<vxe-button @click="exportDataEvent4">自定义数据导出</vxe-button>
<vxe-button @click="exportAllDataEvent4">全量导出后台数据</vxe-button>
</template>
</vxe-toolbar>
<vxe-table
border
show-footer
highlight-hover-row
ref="xTable4"
height="300"
:loading="loading"
:footer-method="footerMethod"
:data="tableData4">
<vxe-table-column type="seq" width="60"></vxe-table-column>
<vxe-table-column field="name" title="Name"></vxe-table-column>
<vxe-table-column field="sex" title="Sex" :formatter="formatterSex"></vxe-table-column>
<vxe-table-column field="age" title="Age"></vxe-table-column>
<vxe-table-column field="role" title="Role"></vxe-table-column>
</vxe-table>
<vxe-pager
:loading="loading"
:current-page="tablePage4.currentPage"
:page-size="tablePage4.pageSize"
:total="tablePage4.totalResult"
:layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
@page-change="handlePageChange">
</vxe-pager>
`,
`
export default {
data () {
return {
tableData4: [],
tablePage4: {
currentPage: 1,
pageSize: 10,
totalResult: 0
}
}
},
created () {
this.findList()
},
methods: {
findList () {
this.loading = true
XEAjax.get(\`/api/user/page/list/\${this.tablePage4.pageSize}/\${this.tablePage4.currentPage}\`).then(({ page, result }) => {
this.tableData4 = result
this.tablePage4.totalResult = page.totalResult
this.loading = false
}).catch(e => {
this.loading = false
})
},
handlePageChange ({ currentPage, pageSize }) {
this.tablePage4.currentPage = currentPage
this.tablePage4.pageSize = pageSize
this.findList()
},
formatterSex ({ cellValue }) {
if (cellValue === '1') {
return '男'
} else if (cellValue === '0') {
return '女'
}
return cellValue
},
footerMethod ({ columns, data }) {
const footerData = [
columns.map((column, columnIndex) => {
if (columnIndex === 0) {
return '平均'
}
if (['age'].includes(column.property)) {
return XEUtils.mean(data, column.property)
}
return null
})
]
return footerData
},
exportCurrDataEvent4 () {
this.$refs.xTable4.exportData({
filename: '自定义文件名',
type: 'html',
isHeader: true,
isFooter: true
})
},
exportDataEvent4 () {
this.$refs.xTable4.exportData({
filename: '自定义文件名',
type: 'html',
isHeader: true,
isFooter: true,
// 自定义导出的数据源
data: [
{ name: 'Name1', sex: '男', age: 26, role: '前端' },
{ name: 'Name2', sex: '女', age: 20, role: '测试' },
{ name: 'Name3', sex: '男', age: 32, role: '后端' },
{ name: 'Name4', sex: '女', age: 22, role: '设计师' }
]
})
},
exportAllDataEvent4 () {
this.loading = true
XEAjax.get('/api/user/full').then(data => {
this.$refs.xTable4.exportData({
filename: '自定义文件名',
type: 'csv',
isHeader: true,
isFooter: true,
data
})
this.loading = false
}).catch(e => {
this.loading = false
})
}
}
}
`
]
}
},
created () {
this.tableData = window.MOCK_DATA_LIST.slice(0, 50)
this.findList()
},
mounted () {
Array.from(this.$el.querySelectorAll('pre code')).forEach((block) => {
hljs.highlightBlock(block)
})
},
methods: {
findList () {
this.loading = true
XEAjax.get(`/api/user/page/list/${this.tablePage4.pageSize}/${this.tablePage4.currentPage}`).then(({ page, result }) => {
this.tableData4 = result
this.tablePage4.totalResult = page.totalResult
this.loading = false
}).catch(e => {
this.loading = false
})
},
handlePageChange ({ currentPage, pageSize }) {
this.tablePage4.currentPage = currentPage
this.tablePage4.pageSize = pageSize
this.findList()
},
formatterSex ({ cellValue }) {
if (cellValue === '1') {
return '男'
} else if (cellValue === '0') {
return '女'
}
return cellValue
},
footerMethod ({ columns, data }) {
const footerData = [
columns.map((column, columnIndex) => {
if (columnIndex === 0) {
return '平均'
}
if (['age'].includes(column.property)) {
return XEUtils.mean(data, column.property)
}
return null
})
]
return footerData
},
exportDataEvent () {
this.$refs.xTable1.exportData({ type: 'csv' })
},
exportSelectEvent () {
this.$refs.xTable1.exportData({
data: this.$refs.xTable1.getCheckboxRecords()
})
},
exportDataEvent2 () {
this.$refs.xTable2.exportData({
type: 'csv',
columnFilterMethod: column => ['name', 'sex'].includes(column.property)
})
},
exportDataEvent3 () {
this.$refs.xTable3.exportData({
type: 'csv',
dataFilterMethod: (row, rowIndex) => rowIndex >= 9 && rowIndex < 20
})
},
exportCurrDataEvent4 () {
this.$refs.xTable4.exportData({
filename: '自定义文件名',
type: 'html',
isHeader: true,
isFooter: true
})
},
exportDataEvent4 () {
this.$refs.xTable4.exportData({
filename: '自定义文件名',
type: 'html',
isHeader: true,
isFooter: true,
// 自定义导出的数据源
data: [
{ name: 'Name1', sex: '男', age: 26, role: '前端' },
{ name: 'Name2', sex: '女', age: 20, role: '测试' },
{ name: 'Name3', sex: '男', age: 32, role: '后端' },
{ name: 'Name4', sex: '女', age: 22, role: '设计师' }
]
})
},
exportAllDataEvent4 () {
this.loading = true
XEAjax.get('/api/user/full').then(data => {
this.$refs.xTable4.exportData({
filename: '自定义文件名',
type: 'csv',
isHeader: true,
isFooter: true,
data
})
this.loading = false
}).catch(e => {
this.loading = false
})
}
}
}
</script>