ElementPlus的el-table表尾合计行

ElementPlus的el-table表尾合计行

1、关于合计行的配置项有以下几个:

  • show-summary:显示合计行,值为 Boolean 类型,默认 true。
  • sum-text:配置合计行第一列显示文字,为空或缺省默认‘合计’。
  • summary-method:自定义合计计算方法。

基础数据导入:

selectData:[], // 手动选择行动态列表
tableData: [{ // 表默认数据
  id: '12987122',
  name: '123',
  amount1: '234文本',
  amount2: '3.2',
  amount3: 10
}, {
  id: '12987123',
  name: '王小虎',
  amount1: '165',
  amount2: '4.43',
  amount3: 12
}, {
  id: '12987124',
  name: '王小虎',
  amount1: '324',
  amount2: '1.9',
  amount3: 9
}, {
  id: '12987125',
  name: '王小虎',
  amount1: '621',
  amount2: '2.2',
  amount3: 17
}, {
  id: '12987126',
  name: '王小虎',
  amount1: '539',
  amount2: '4.1',
  amount3: 15
}]

2、 通过合计方法自定义合计显示

通过属性 :summary-method="getSummaries" 配置合计方法,如下示例:

<el-table
  :data="tableData"
  border
  height="200"
  :summary-method="getSummaries"
  show-summary
  style="width: 100%; margin-top: 20px">
  <el-table-column
    prop="id"
    label="ID"
    width="180">
  </el-table-column>
  <el-table-column
    prop="name"
    label="姓名">
  </el-table-column>
  <el-table-column
    prop="amount1"
    label="数值 1(元)">
  </el-table-column>
  <el-table-column
    prop="amount2"
    label="数值 2(元)">
  </el-table-column>
  <el-table-column
    prop="amount3"
    label="数值 3(元)">
  </el-table-column>
</el-table>
getSummaries(param) {
  const { columns, data } = param;
  const sums = [];
  columns.forEach((column, index) => {
    if (index === 0) {
      sums[index] = '总价:'; // 首列添加自定义合计文字
      return;
    }
    const values = data.map(item => Number(item[column.property]));
    if ((column.property=="amount1" || column.property=="amount2" // 只合计指定行,通过列属性判断
         || column.property=="amount3") && !values.every(value => isNaN(value))) {
      sums[index] = values.reduce((prev, curr) => {
        const value = Number(curr);
        if (!isNaN(value)) { // 若不能转成数字就不进行累加
          return prev + curr;
        } else {
          return prev;
        }
      }, 0);
      sums[index] += ' 元'; // 统一给数字加单位
    } else {
      sums[index] = '';
    }
  });
  return sums;
}

效果如下图:

3、 动态按照勾选行进行合计

在上一节的基础上进行改进。

首先添加一列勾选框,type="selection",然后添加勾选变更事件 selection-change,如下示例:

<el-table 
  :show-summary="table_show_summary"
  :summary-method="getSummaries"
  @selection-change="handleSelectionChange"
>
  <el-table-column type="selection" width="50" align="center"></el-table-column>
  。。。
</el-table>
handleSelectionChange(selection) {
  this.selectData = selection.map(item => item)
},
getSummaries(param) {
  const { columns, data } = param;
  const sums = [];
  columns.forEach((column, index) => {
    if (index === 1) {
      sums[index] = '总价:';
      return;
    }
  // const values = data.map(item => Number(item[column.property]));
  let values = []
  if (this.selectData.length===0) { // this.selectData 为所选择的行列表
    values = [];
  }else{
    values = this.selectData.map(item => Number(item[column.property]));
  }
    if ((column.property=="amount1" || column.property=="amount2"
         || column.property=="amount3") && !values.every(value => isNaN(value))) {
      sums[index] = values.reduce((prev, curr) => {
        const value = Number(curr);
        if (!isNaN(value)) {
          return prev + curr;
        } else {
          return prev;
        }
      }, 0);
      sums[index] += ' 元';
    } else {
      sums[index] = '';
    }
  });
  return sums;
}

效果如下图:

4、 默认方式,将全部可以转成数字的数据进行合计

只用 show-summary 和 sum-text 来进行默认的合计显示。

如下一个简单的示例:

<el-table
  :data="tableData"
  border
  show-summary
  sum-text="合计-自定义"
  style="width: 100%">
  <el-table-column
    prop="id"
    label="ID"
    width="180">
  </el-table-column>
  <el-table-column
    prop="name"
    label="姓名">
  </el-table-column>
  <el-table-column
    prop="amount1"
    sortable
    label="数值 1">
  </el-table-column>
  <el-table-column
    prop="amount2"
    sortable
    label="数值 2">
  </el-table-column>
  <el-table-column
    prop="amount3"
    sortable
    label="数值 3">
  </el-table-column>
</el-table>

效果如下图:

5、实际操作示例

# :summary-method为合计方法
# show-summary是是否显示合计
<el-card class="full-table" shadow="hover" :body-style= "{ padding:  '0px'}">
<span style="margin: auto;color:darkorange;font-size: large;font-weight: bold;">应收表</span>
<el-table 
ref="feeInTableRef"
:data="feeInTableData" 
style="width: 100%;"
:cell-style="{padding:'2px 0'}"
max-height="400"
height="380"
v-loading="loading" 
row-key="id"
:default-sort="{prop: 'sortCode', order: 'ascending'}"
show-summary
:summary-method="getFeeInSum"
@selection-change="handleSelectionChangeFeeIn"
@row-click="rowclickFeeIn"
highlight-current-row
border>
<!-- font-size:0.9rem; -->
<el-table-column type="selection" width="55" align="center" fixed=""> </el-table-column>
<el-table-column type="index" label="序号" width="55" align="center" sortable fixed  />
<el-table-column prop="id" label="主键" width="70" align="center" sortable v-if="false"/>
<el-table-column prop="orderId" label="订单主键" width="100" align="center" sortable v-if="false"/>
<el-table-column label="审核" width="80" align="center" sortable show-overflow-tooltip>
    <template #default="scope">
        <el-tag type="success" v-if="scope.row.isCheck">是</el-tag>
        <el-tag type="danger" v-else>否</el-tag>
    </template>
</el-table-column>
<el-table-column prop="feeitem" label="费用项目" width="100" align="center" sortable v-if="false"/>
<el-table-column prop="feeitemName" label="费用名称" width="110" align="center" sortable show-overflow-tooltip/>
<el-table-column prop="customId" label="结算单位" width="100" align="center" sortable v-if="false"/>
<el-table-column prop="customName" label="结算单位" width="200" align="center" sortable show-overflow-tooltip/>
<el-table-column prop="price" label="单价" width="80" align="center" sortable />
<el-table-column prop="quantity" label="数量" width="80" align="center" sortable />
<el-table-column prop="totalMoney" label="总金额" width="110" align="center" sortable />
<el-table-column prop="profitDep" label="利润部门" width="100" align="center" sortable v-if="false"/>
<el-table-column prop="profitDepName" label="利润部门" width="100" align="center" sortable v-if="false"/>
<el-table-column prop="checkDate" label="审核日期" width="100" align="center" sortable v-if="false"/>
<el-table-column prop="checkUser" label="审核人员" width="100" align="center" sortable v-if="false"/>
<el-table-column prop="checkUserName" label="审核人员" width="100" align="center" sortable v-if="false"/>
<el-table-column prop="orderCode" label="内部结算号" width="120" align="center" sortable show-overflow-tooltip/>
<el-table-column label="是否垫付" width="110" align="center" sortable show-overflow-tooltip>
    <template #default="scope">
        <el-tag type="success" v-if="scope.row.isPayment">是</el-tag>
        <el-tag type="danger" v-else>否</el-tag>
    </template>
</el-table-column>
<el-table-column prop="currency" label="币别" width="80" align="center" sortable v-if="false"/>
<el-table-column prop="currencyName" label="币别" width="80" align="center" sortable />
<el-table-column prop="currencyRate" label="汇率" width="80" align="center" sortable />
<el-table-column prop="settleRate" label="税率Id" width="80" align="center" sortable v-if="false"/>
<el-table-column prop="settleRateName" label="税率" width="90" align="center" sortable />
<el-table-column prop="settleRateB" label="财务税率" width="100" align="center" sortable v-if="false"/>
<el-table-column prop="settleRateBName" label="财务税率" width="100" align="center" sortable v-if="false"/>
<el-table-column prop="settleRateSZ" label="税率数值" width="100" align="center" sortable v-if="false"/>
<el-table-column prop="rateFreeMoney" label="不含税金额" width="120" align="center" sortable />
<el-table-column prop="rateMoney" label="税额" width="80" align="center" sortable />
<el-table-column prop="statementCode" label="对账单号" width="120" align="center" sortable show-overflow-tooltip/>
<el-table-column prop="hxMoney" label="核销金额" width="110" align="center" sortable /> 
<el-table-column prop="invoiceCode" label="发票编号" width="120" align="center" sortable show-overflow-tooltip/>
<el-table-column prop="kpMoney" label="开票金额" width="110" align="center" sortable />
<el-table-column prop="paymentCode" label="收款单号" width="120" align="center" sortable show-overflow-tooltip/>
<el-table-column prop="sfMoney" label="收款金额" width="110" align="center" sortable />
<el-table-column prop="voucherNo" label="A凭证号" width="100" align="center" sortable v-if="false"/>
<el-table-column prop="voucherYear" label="A凭证年" width="70" align="center" sortable v-if="false"/>
<el-table-column prop="voucherMonth" label="A凭证月" width="70" align="center" sortable v-if="false"/>
<el-table-column prop="voucherUser" label="A凭证人员" width="70" align="center" sortable v-if="false"/>
<el-table-column prop="voucherDate" label="A凭证日期" width="70" align="center" sortable v-if="false"/>
<el-table-column prop="voucherCount" label="A记账次数" width="70" align="center" sortable v-if="false"/>
<el-table-column prop="isVoucherB" label="B凭证号" width="70" align="center" sortable v-if="false"/>
<el-table-column label="是否锁定" width="110" align="center" sortable show-overflow-tooltip v-if="false">
    <template #default="scope">
        <el-tag type="success" v-if="scope.row.isLock">是</el-tag>
        <el-tag type="danger" v-else>否</el-tag>
    </template>
</el-table-column>
<el-table-column label="自动生成" width="110" align="center" sortable show-overflow-tooltip v-if="false">
    <template #default="scope">
        <el-tag type="success" v-if="scope.row.isCreate">是</el-tag>
        <el-tag type="danger" v-else>否</el-tag>
    </template>
</el-table-column>
<el-table-column prop="feeoutId" label="应付费用主键" width="70" align="center" sortable v-if="false"/>
<el-table-column prop="pcno" label="陆运派车批次号" width="70" align="center" sortable v-if="false"/>
<el-table-column prop="createUserId" label="创建人Id" width="70" align="center" sortable v-if="false"/>
<el-table-column prop="createUserName" label="创建人" width="100" align="center" sortable />
<el-table-column prop="createTime" label="创建时间" width="160" align="center" sortable />
<el-table-column prop="note" label="备注" width="200" align="center" sortable show-overflow-tooltip/>
<el-table-column prop="sortCode" label="排序" width="90" align="center" sortable />
<el-table-column prop="tenantId" label="租户Id" width="70" align="center" sortable v-if="false"/>
<!-- <el-table-column label="操作" width="140" fixed="right" align="center" show-overflow-tooltip>
    <template #default="scope">
        <el-button icon="ele-Edit" size="small" text type="primary" @click="openEditPos(scope.row)" v-auth="'sysPos:update'"> 编辑 </el-button>
        <el-button icon="ele-Delete" size="small" text type="danger" @click="delPos(scope.row)" v-auth="'sysPos:delete'"> 删除 </el-button>
    </template>
</el-table-column> -->
</el-table>
</el-card>
//...省略取值方法
//#region 自定义绑定事件
//自定义应收合计方法(此处使用改变数组索引元素的方式修改合计的数组数据)
const getFeeInSum=({ columns, data }: any)=> {
	const sums: any = [];
	columns.forEach((column: any, index: any) => {
		if (column.label == '费用名称') {
		sums[index] = '总计';
		return;
		}
		else if(column.label != "不含税金额" && column.label != "税额" && column.label != "总金额"){
		sums[index] = '';
		return;
		}
		const values = data.map((item: any) => Number(item[column.property]));
		if (!values.every((value: any) => isNaN(value))) {
		sums[index] = values.reduce((prev: any, curr: any) => {
			const value = Number(curr);
			if (!isNaN(value)) {
			return prev + curr;
			} else {
			return prev;
			}
		}, 0);
		// sums[index] += ' 元';
		sums[index] = sums[index].toFixed(2)
		} else {
		// sums[index] = 'N/A';
		}
	});
	return sums;
}

效果如图: