mirror of
https://gitee.com/xuliangzhan_admin/vxe-table.git
synced 2026-01-21 05:27:57 +08:00
418 lines
16 KiB
Vue
418 lines
16 KiB
Vue
<template>
|
||
<div>
|
||
<p class="tip">
|
||
单元格与表尾数据合并,可以通过绑定参数 <table-api-link prop="merge-cells"/> 或调用函数 <table-api-link prop="setMergeCells"/>、<table-api-link prop="setMergeCells"/> 来控制单元格的临时合并状态<br>
|
||
<span class="red">(注意:合并数据属于临时行为,例如:操作数据源、显示隐藏列、固定列...等操作都会导致合并状态被取消)</span>
|
||
</p>
|
||
|
||
<vxe-toolbar ref="xToolbar" print></vxe-toolbar>
|
||
|
||
<vxe-table
|
||
border
|
||
resizable
|
||
show-footer
|
||
ref="xTable"
|
||
height="800"
|
||
align="center"
|
||
:loading="demo1.loading"
|
||
:print-config="{}"
|
||
:column-config="{width: 90}"
|
||
:merge-cells="demo1.mergeCells"
|
||
:merge-footer-items="demo1.mergeFooterItems"
|
||
:footer-method="footerMethod"
|
||
:data="demo1.tableData">
|
||
<vxe-column field="a" title="名称"></vxe-column>
|
||
<vxe-colgroup field="b" title="教育经费投入">
|
||
<vxe-column field="c" title="总计"></vxe-column>
|
||
<vxe-colgroup title="基本投入">
|
||
<vxe-colgroup title="合计">
|
||
<vxe-column field="d" title="合计"></vxe-column>
|
||
<vxe-column field="e" title="比上年增长"></vxe-column>
|
||
</vxe-colgroup>
|
||
<vxe-column field="f" title="人员经费"></vxe-column>
|
||
<vxe-column field="g" title="公用经费"></vxe-column>
|
||
<vxe-colgroup title="其他经费">
|
||
<vxe-column field="w" title="合计"></vxe-column>
|
||
<vxe-colgroup title="其中">
|
||
<vxe-column field="h" title="标准化建设"></vxe-column>
|
||
<vxe-column field="i" title="信息化建设"></vxe-column>
|
||
</vxe-colgroup>
|
||
</vxe-colgroup>
|
||
</vxe-colgroup>
|
||
<vxe-column field="j" title="附加信息"></vxe-column>
|
||
</vxe-colgroup>
|
||
<vxe-colgroup title="其他投入">
|
||
<vxe-colgroup title="投入">
|
||
<vxe-column field="k" title="合计"></vxe-column>
|
||
<vxe-colgroup title="其中">
|
||
<vxe-column field="l" title="人员经费"></vxe-column>
|
||
<vxe-column field="m" title="教育经费"></vxe-column>
|
||
<vxe-column field="n" title="项目经费"></vxe-column>
|
||
<vxe-column field="o" title="基建投入"></vxe-column>
|
||
</vxe-colgroup>
|
||
</vxe-colgroup>
|
||
<vxe-colgroup title="社会捐款">
|
||
<vxe-column field="p" title="合计"></vxe-column>
|
||
<vxe-colgroup title="其中">
|
||
<vxe-column field="q" title="项目经费"></vxe-column>
|
||
<vxe-column field="r" title="基建投入"></vxe-column>
|
||
</vxe-colgroup>
|
||
</vxe-colgroup>
|
||
</vxe-colgroup>
|
||
<vxe-colgroup title="补充资料">
|
||
<vxe-colgroup title="信息化建设">
|
||
<vxe-column field="s" title="本年投入金额"></vxe-column>
|
||
<vxe-colgroup title="其中">
|
||
<vxe-column field="t" title="合计"></vxe-column>
|
||
<vxe-column field="u" title="建设数"></vxe-column>
|
||
</vxe-colgroup>
|
||
<vxe-column field="v" title="备注"></vxe-column>
|
||
</vxe-colgroup>
|
||
</vxe-colgroup>
|
||
</vxe-table>
|
||
|
||
<p class="demo-code">{{ $t('app.body.button.showCode') }}</p>
|
||
|
||
<pre>
|
||
<pre-code class="xml">{{ demoCodes[0] }}</pre-code>
|
||
<pre-code class="typescript">{{ demoCodes[1] }}</pre-code>
|
||
</pre>
|
||
</div>
|
||
</template>
|
||
|
||
<script lang="ts">
|
||
import { defineComponent, reactive, ref, nextTick } from 'vue'
|
||
import { VxeTablePropTypes, VxeTableInstance, VxeToolbarInstance } from '../../../../types/index'
|
||
|
||
export default defineComponent({
|
||
setup () {
|
||
const xTable = ref({} as VxeTableInstance)
|
||
const xToolbar = ref({} as VxeToolbarInstance)
|
||
|
||
const demo1 = reactive({
|
||
loading: false,
|
||
tableData: [] as any[],
|
||
mergeCells: [] as VxeTablePropTypes.MergeCell[],
|
||
mergeFooterItems: [] as VxeTablePropTypes.MergeFooterItem[]
|
||
})
|
||
|
||
const handleMerge = () => {
|
||
// 根据行数据计算合并规则
|
||
const mergeCells = [
|
||
{ row: 0, col: 0, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 1, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 2, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 3, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 4, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 5, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 6, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 7, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 8, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 9, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 15, rowspan: 10, colspan: 1 },
|
||
{ row: 0, col: 16, rowspan: 10, colspan: 1 },
|
||
{ row: 0, col: 18, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 19, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 20, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 21, rowspan: 2, colspan: 1 },
|
||
{ row: 1, col: 11, rowspan: 1, colspan: 4 },
|
||
|
||
{ row: 2, col: 0, rowspan: 4, colspan: 2 },
|
||
{ row: 2, col: 2, rowspan: 4, colspan: 1 },
|
||
{ row: 2, col: 3, rowspan: 4, colspan: 1 },
|
||
{ row: 2, col: 6, rowspan: 4, colspan: 1 },
|
||
{ row: 2, col: 7, rowspan: 4, colspan: 1 },
|
||
{ row: 2, col: 8, rowspan: 4, colspan: 1 },
|
||
{ row: 2, col: 9, rowspan: 4, colspan: 1 },
|
||
{ row: 2, col: 17, rowspan: 4, colspan: 1 },
|
||
{ row: 2, col: 18, rowspan: 3, colspan: 1 },
|
||
{ row: 2, col: 19, rowspan: 3, colspan: 1 },
|
||
{ row: 2, col: 20, rowspan: 3, colspan: 2 },
|
||
{ row: 3, col: 4, rowspan: 2, colspan: 2 },
|
||
{ row: 4, col: 11, rowspan: 2, colspan: 4 },
|
||
{ row: 5, col: 18, rowspan: 1, colspan: 4 },
|
||
|
||
{ row: 6, col: 0, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 1, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 4, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 5, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 6, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 7, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 8, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 9, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 18, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 19, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 20, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 21, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 2, rowspan: 1, colspan: 2 },
|
||
{ row: 8, col: 2, rowspan: 1, colspan: 2 },
|
||
{ row: 9, col: 0, rowspan: 1, colspan: 15 },
|
||
|
||
{ row: 11, col: 5, rowspan: 4, colspan: 12 }
|
||
]
|
||
// 根据行数据计算表尾合并规则
|
||
const mergeFooterItems = [
|
||
{ row: 0, col: 1, rowspan: 1, colspan: 2 },
|
||
{ row: 0, col: 6, rowspan: 1, colspan: 2 },
|
||
{ row: 0, col: 14, rowspan: 2, colspan: 5 },
|
||
{ row: 1, col: 4, rowspan: 1, colspan: 8 }
|
||
]
|
||
demo1.mergeCells = mergeCells
|
||
demo1.mergeFooterItems = mergeFooterItems
|
||
}
|
||
|
||
const footerMethod: VxeTablePropTypes.FooterMethod = ({ columns }) => {
|
||
return [
|
||
columns.map((column, index) => index),
|
||
columns.map((column, index) => 1000 + index)
|
||
]
|
||
}
|
||
|
||
demo1.loading = true
|
||
setTimeout(() => {
|
||
const list = []
|
||
for (let index = 0; index < 15; index++) {
|
||
list.push({
|
||
a: 'a' + index,
|
||
b: 'b' + index,
|
||
c: 'c' + index,
|
||
d: 'd' + index,
|
||
e: 'e' + index,
|
||
f: 'f' + index,
|
||
g: 'g' + index,
|
||
h: 'h' + index,
|
||
i: 'i' + index,
|
||
j: 'j' + index,
|
||
k: 'k' + index,
|
||
l: 'l' + index,
|
||
m: 'm' + index,
|
||
n: 'n' + index,
|
||
o: 'o' + index,
|
||
p: 'p' + index,
|
||
q: 'q' + index,
|
||
r: 'r' + index,
|
||
s: 's' + index,
|
||
t: 't' + index,
|
||
u: 'u' + index,
|
||
v: 'v' + index,
|
||
w: 'w' + index
|
||
})
|
||
}
|
||
demo1.loading = false
|
||
demo1.tableData = list
|
||
handleMerge()
|
||
}, 100)
|
||
|
||
nextTick(() => {
|
||
// 将表格和工具栏进行关联
|
||
const $table = xTable.value
|
||
const $toolbar = xToolbar.value
|
||
$table.connect($toolbar)
|
||
})
|
||
|
||
return {
|
||
xTable,
|
||
xToolbar,
|
||
demo1,
|
||
footerMethod,
|
||
demoCodes: [
|
||
`
|
||
<vxe-toolbar ref="xToolbar" print></vxe-toolbar>
|
||
|
||
<vxe-table
|
||
border
|
||
resizable
|
||
show-footer
|
||
ref="xTable"
|
||
height="800"
|
||
align="center"
|
||
:loading="demo1.loading"
|
||
:print-config="{}"
|
||
:column-config="{width: 90}"
|
||
:merge-cells="demo1.mergeCells"
|
||
:merge-footer-items="demo1.mergeFooterItems"
|
||
:footer-method="footerMethod"
|
||
:data="demo1.tableData">
|
||
<vxe-column field="a" title="名称"></vxe-column>
|
||
<vxe-colgroup field="b" title="教育经费投入">
|
||
<vxe-column field="c" title="总计"></vxe-column>
|
||
<vxe-colgroup title="基本投入">
|
||
<vxe-colgroup title="合计">
|
||
<vxe-column field="d" title="合计"></vxe-column>
|
||
<vxe-column field="e" title="比上年增长"></vxe-column>
|
||
</vxe-colgroup>
|
||
<vxe-column field="f" title="人员经费"></vxe-column>
|
||
<vxe-column field="g" title="公用经费"></vxe-column>
|
||
<vxe-colgroup title="其他经费">
|
||
<vxe-column field="w" title="合计"></vxe-column>
|
||
<vxe-colgroup title="其中">
|
||
<vxe-column field="h" title="标准化建设"></vxe-column>
|
||
<vxe-column field="i" title="信息化建设"></vxe-column>
|
||
</vxe-colgroup>
|
||
</vxe-colgroup>
|
||
</vxe-colgroup>
|
||
<vxe-column field="j" title="附加信息"></vxe-column>
|
||
</vxe-colgroup>
|
||
<vxe-colgroup title="其他投入">
|
||
<vxe-colgroup title="投入">
|
||
<vxe-column field="k" title="合计"></vxe-column>
|
||
<vxe-colgroup title="其中">
|
||
<vxe-column field="l" title="人员经费"></vxe-column>
|
||
<vxe-column field="m" title="教育经费"></vxe-column>
|
||
<vxe-column field="n" title="项目经费"></vxe-column>
|
||
<vxe-column field="o" title="基建投入"></vxe-column>
|
||
</vxe-colgroup>
|
||
</vxe-colgroup>
|
||
<vxe-colgroup title="社会捐款">
|
||
<vxe-column field="p" title="合计"></vxe-column>
|
||
<vxe-colgroup title="其中">
|
||
<vxe-column field="q" title="项目经费"></vxe-column>
|
||
<vxe-column field="r" title="基建投入"></vxe-column>
|
||
</vxe-colgroup>
|
||
</vxe-colgroup>
|
||
</vxe-colgroup>
|
||
<vxe-colgroup title="补充资料">
|
||
<vxe-colgroup title="信息化建设">
|
||
<vxe-column field="s" title="本年投入金额"></vxe-column>
|
||
<vxe-colgroup title="其中">
|
||
<vxe-column field="t" title="合计"></vxe-column>
|
||
<vxe-column field="u" title="建设数"></vxe-column>
|
||
</vxe-colgroup>
|
||
<vxe-column field="v" title="备注"></vxe-column>
|
||
</vxe-colgroup>
|
||
</vxe-colgroup>
|
||
</vxe-table>
|
||
`,
|
||
`
|
||
import { defineComponent, reactive } from 'vue'
|
||
import { VxeTablePropTypes } from 'vxe-table'
|
||
|
||
export default defineComponent({
|
||
setup () {
|
||
const demo1 = reactive({
|
||
loading: false,
|
||
tableData: [] as any[],
|
||
mergeCells: [] as VxeTablePropTypes.MergeCell[],
|
||
mergeFooterItems: [] as VxeTablePropTypes.MergeFooterItem[]
|
||
})
|
||
|
||
const handleMerge = () => {
|
||
// 根据行数据计算合并规则
|
||
const mergeCells = [
|
||
{ row: 0, col: 0, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 1, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 2, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 3, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 4, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 5, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 6, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 7, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 8, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 9, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 15, rowspan: 10, colspan: 1 },
|
||
{ row: 0, col: 16, rowspan: 10, colspan: 1 },
|
||
{ row: 0, col: 18, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 19, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 20, rowspan: 2, colspan: 1 },
|
||
{ row: 0, col: 21, rowspan: 2, colspan: 1 },
|
||
{ row: 1, col: 11, rowspan: 1, colspan: 4 },
|
||
|
||
{ row: 2, col: 0, rowspan: 4, colspan: 2 },
|
||
{ row: 2, col: 2, rowspan: 4, colspan: 1 },
|
||
{ row: 2, col: 3, rowspan: 4, colspan: 1 },
|
||
{ row: 2, col: 6, rowspan: 4, colspan: 1 },
|
||
{ row: 2, col: 7, rowspan: 4, colspan: 1 },
|
||
{ row: 2, col: 8, rowspan: 4, colspan: 1 },
|
||
{ row: 2, col: 9, rowspan: 4, colspan: 1 },
|
||
{ row: 2, col: 17, rowspan: 4, colspan: 1 },
|
||
{ row: 2, col: 18, rowspan: 3, colspan: 1 },
|
||
{ row: 2, col: 19, rowspan: 3, colspan: 1 },
|
||
{ row: 2, col: 20, rowspan: 3, colspan: 2 },
|
||
{ row: 3, col: 4, rowspan: 2, colspan: 2 },
|
||
{ row: 4, col: 11, rowspan: 2, colspan: 4 },
|
||
{ row: 5, col: 18, rowspan: 1, colspan: 4 },
|
||
|
||
{ row: 6, col: 0, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 1, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 4, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 5, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 6, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 7, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 8, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 9, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 18, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 19, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 20, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 21, rowspan: 3, colspan: 1 },
|
||
{ row: 6, col: 2, rowspan: 1, colspan: 2 },
|
||
{ row: 8, col: 2, rowspan: 1, colspan: 2 },
|
||
{ row: 9, col: 0, rowspan: 1, colspan: 15 },
|
||
|
||
{ row: 11, col: 5, rowspan: 4, colspan: 12 }
|
||
]
|
||
// 根据行数据计算表尾合并规则
|
||
const mergeFooterItems = [
|
||
{ row: 0, col: 1, rowspan: 1, colspan: 2 },
|
||
{ row: 0, col: 6, rowspan: 1, colspan: 2 },
|
||
{ row: 0, col: 14, rowspan: 2, colspan: 5 },
|
||
{ row: 1, col: 4, rowspan: 1, colspan: 8 }
|
||
]
|
||
demo1.mergeCells = mergeCells
|
||
demo1.mergeFooterItems = mergeFooterItems
|
||
}
|
||
|
||
const footerMethod: VxeTablePropTypes.FooterMethod = ({ columns }) => {
|
||
return [
|
||
columns.map((column, index) => index),
|
||
columns.map((column, index) => 1000 + index)
|
||
]
|
||
}
|
||
|
||
demo1.loading = true
|
||
setTimeout(() => {
|
||
const list = []
|
||
for (let index = 0; index < 15; index++) {
|
||
list.push({
|
||
a: 'a' + index,
|
||
b: 'b' + index,
|
||
c: 'c' + index,
|
||
d: 'd' + index,
|
||
e: 'e' + index,
|
||
f: 'f' + index,
|
||
g: 'g' + index,
|
||
h: 'h' + index,
|
||
i: 'i' + index,
|
||
j: 'j' + index,
|
||
k: 'k' + index,
|
||
l: 'l' + index,
|
||
m: 'm' + index,
|
||
n: 'n' + index,
|
||
o: 'o' + index,
|
||
p: 'p' + index,
|
||
q: 'q' + index,
|
||
r: 'r' + index,
|
||
s: 's' + index,
|
||
t: 't' + index,
|
||
u: 'u' + index,
|
||
v: 'v' + index,
|
||
w: 'w' + index
|
||
})
|
||
}
|
||
demo1.loading = false
|
||
demo1.tableData = list
|
||
handleMerge()
|
||
}, 100)
|
||
|
||
return {
|
||
demo1,
|
||
footerMethod
|
||
}
|
||
}
|
||
})
|
||
`
|
||
]
|
||
}
|
||
}
|
||
})
|
||
</script>
|