Files
vxe-table/examples/views/table/advanced/MergeCell.vue
xuliangzhan 2b9995ca58 优化重构
2020-05-07 11:46:04 +08:00

386 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">实现复杂的报表<br><span class="red"><table-api-link prop="span-method"/> 合并的逻辑都是自行实现的该示例仅供参考</span></p>
<vxe-table
border
resizable
ref="xTable"
height="800"
align="center"
column-width="80"
:cell-style="cellStyleMethod"
:span-method="mergeMethod"
:data="tableData">
<vxe-table-column field="a" title="名称"></vxe-table-column>
<vxe-table-column field="b" title="教育经费投入">
<vxe-table-column field="c" title="总计"></vxe-table-column>
<vxe-table-column title="基本投入">
<vxe-table-column title="合计">
<vxe-table-column field="d" title="合计"></vxe-table-column>
<vxe-table-column field="e" title="比上年增长"></vxe-table-column>
</vxe-table-column>
<vxe-table-column field="f" title="人员经费"></vxe-table-column>
<vxe-table-column field="g" title="公用经费"></vxe-table-column>
<vxe-table-column title="其他经费">
<vxe-table-column field="d" title="合计"></vxe-table-column>
<vxe-table-column title="其中">
<vxe-table-column field="h" title="标准化建设"></vxe-table-column>
<vxe-table-column field="i" title="信息化建设"></vxe-table-column>
</vxe-table-column>
</vxe-table-column>
</vxe-table-column>
<vxe-table-column field="j" title="附加信息"></vxe-table-column>
</vxe-table-column>
<vxe-table-column title="其他投入">
<vxe-table-column title="投入">
<vxe-table-column field="k" title="合计"></vxe-table-column>
<vxe-table-column title="其中">
<vxe-table-column field="l" title="人员经费"></vxe-table-column>
<vxe-table-column field="m" title="教育经费"></vxe-table-column>
<vxe-table-column field="n" title="项目经费"></vxe-table-column>
<vxe-table-column field="o" title="基建投入"></vxe-table-column>
</vxe-table-column>
</vxe-table-column>
<vxe-table-column title="社会捐款">
<vxe-table-column field="p" title="合计"></vxe-table-column>
<vxe-table-column title="其中">
<vxe-table-column field="q" title="项目经费"></vxe-table-column>
<vxe-table-column field="r" title="基建投入"></vxe-table-column>
</vxe-table-column>
</vxe-table-column>
</vxe-table-column>
<vxe-table-column title="补充资料">
<vxe-table-column title="信息化建设">
<vxe-table-column field="s" title="本年投入金额"></vxe-table-column>
<vxe-table-column title="其中">
<vxe-table-column field="t" title="合计"></vxe-table-column>
<vxe-table-column field="u" title="建设数"></vxe-table-column>
</vxe-table-column>
<vxe-table-column field="v" title="备注"></vxe-table-column>
</vxe-table-column>
</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>
</div>
</template>
<script>
import hljs from 'highlight.js'
export default {
data () {
return {
tableData: [],
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, style: { color: '#DD001B', fontWeight: 700, fontSize: '40px' } },
{ 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, style: { color: '#ffffff', backgroundColor: '#008000' } },
{ 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, style: { color: '#ffffff', backgroundColor: '#F5680B', fontSize: '40px' } },
{ row: 4, col: 11, rowspan: 2, colspan: 4, style: { color: '#ffffff', backgroundColor: '#409eff' } },
{ 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 }
],
demoCodes: [
`
<vxe-table
border
resizable
ref="xTable"
height="800"
align="center"
column-width="80"
:cell-style="cellStyleMethod"
:span-method="mergeMethod"
:data="tableData">
<vxe-table-column field="a" title="名称"></vxe-table-column>
<vxe-table-column field="b" title="教育经费投入">
<vxe-table-column field="c" title="总计"></vxe-table-column>
<vxe-table-column title="基本投入">
<vxe-table-column title="合计">
<vxe-table-column field="d" title="合计"></vxe-table-column>
<vxe-table-column field="e" title="比上年增长"></vxe-table-column>
</vxe-table-column>
<vxe-table-column field="f" title="人员经费"></vxe-table-column>
<vxe-table-column field="g" title="公用经费"></vxe-table-column>
<vxe-table-column title="其他经费">
<vxe-table-column field="d" title="合计"></vxe-table-column>
<vxe-table-column title="其中">
<vxe-table-column field="h" title="标准化建设"></vxe-table-column>
<vxe-table-column field="i" title="信息化建设"></vxe-table-column>
</vxe-table-column>
</vxe-table-column>
</vxe-table-column>
<vxe-table-column field="j" title="附加信息"></vxe-table-column>
</vxe-table-column>
<vxe-table-column title="其他投入">
<vxe-table-column title="投入">
<vxe-table-column field="k" title="合计"></vxe-table-column>
<vxe-table-column title="其中">
<vxe-table-column field="l" title="人员经费"></vxe-table-column>
<vxe-table-column field="m" title="教育经费"></vxe-table-column>
<vxe-table-column field="n" title="项目经费"></vxe-table-column>
<vxe-table-column field="o" title="基建投入"></vxe-table-column>
</vxe-table-column>
</vxe-table-column>
<vxe-table-column title="社会捐款">
<vxe-table-column field="p" title="合计"></vxe-table-column>
<vxe-table-column title="其中">
<vxe-table-column field="q" title="项目经费"></vxe-table-column>
<vxe-table-column field="r" title="基建投入"></vxe-table-column>
</vxe-table-column>
</vxe-table-column>
</vxe-table-column>
<vxe-table-column title="补充资料">
<vxe-table-column title="信息化建设">
<vxe-table-column field="s" title="本年投入金额"></vxe-table-column>
<vxe-table-column title="其中">
<vxe-table-column field="t" title="合计"></vxe-table-column>
<vxe-table-column field="u" title="建设数"></vxe-table-column>
</vxe-table-column>
<vxe-table-column field="v" title="备注"></vxe-table-column>
</vxe-table-column>
</vxe-table-column>
</vxe-table>
`,
`
export default {
data () {
return {
tableData: [],
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, style: { color: '#DD001B', fontWeight: 700, fontSize: '40px' } },
{ 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, style: { color: '#ffffff', backgroundColor: '#008000' } },
{ 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, style: { color: '#ffffff', backgroundColor: '#F5680B', fontSize: '40px' } },
{ row: 4, col: 11, rowspan: 2, colspan: 4, style: { color: '#ffffff', backgroundColor: '#409eff' } },
{ 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 }
]
}
},
created () {
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
})
}
this.tableData = list
},
methods: {
// 通过单元格样式渲染函数
cellStyleMethod ({ row, column }) {
const { mergeCells } = this
const xTable = this.$refs.xTable
const _rowIndex = xTable._getRowIndex(row)
const _columnIndex = xTable._getColumnIndex(column)
for (let mIndex = 0; mIndex < mergeCells.length; mIndex++) {
const { row, col, style } = mergeCells[mIndex]
if (style && row === _rowIndex && col === _columnIndex) {
return style
}
}
return null
},
// 通用单元格合并函数(将指定区域进行合并)
mergeMethod ({ row, column }) {
const { mergeCells } = this
const xTable = this.$refs.xTable
const _rowIndex = xTable._getRowIndex(row)
const _columnIndex = xTable._getColumnIndex(column)
for (let mIndex = 0; mIndex < mergeCells.length; mIndex++) {
const { row, col, rowspan, colspan } = mergeCells[mIndex]
if (row === _rowIndex && col === _columnIndex) {
return { rowspan, colspan }
}
if (_rowIndex >= row && _rowIndex < row + rowspan && _columnIndex >= col && _columnIndex < col + colspan) {
return { rowspan: 0, colspan: 0 }
}
}
return { rowspan: 1, colspan: 1 }
}
}
}
`
]
}
},
created () {
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
})
}
this.tableData = list
},
mounted () {
Array.from(this.$el.querySelectorAll('pre code')).forEach((block) => {
hljs.highlightBlock(block)
})
},
methods: {
// 通过单元格样式渲染函数
cellStyleMethod ({ row, column }) {
const { mergeCells } = this
const xTable = this.$refs.xTable
const _rowIndex = xTable._getRowIndex(row)
const _columnIndex = xTable._getColumnIndex(column)
for (let mIndex = 0; mIndex < mergeCells.length; mIndex++) {
const { row, col, style } = mergeCells[mIndex]
if (style && row === _rowIndex && col === _columnIndex) {
return style
}
}
return null
},
// 通用单元格合并函数(将指定区域进行合并)
mergeMethod ({ row, column }) {
const { mergeCells } = this
const xTable = this.$refs.xTable
const _rowIndex = xTable._getRowIndex(row)
const _columnIndex = xTable._getColumnIndex(column)
for (let mIndex = 0; mIndex < mergeCells.length; mIndex++) {
const { row, col, rowspan, colspan } = mergeCells[mIndex]
if (row === _rowIndex && col === _columnIndex) {
return { rowspan, colspan }
}
if (_rowIndex >= row && _rowIndex < row + rowspan && _columnIndex >= col && _columnIndex < col + colspan) {
return { rowspan: 0, colspan: 0 }
}
}
return { rowspan: 1, colspan: 1 }
}
}
}
</script>