Search code examples
reactjsantdxmltable

antd Table Summary


I have an antd table where I want to summarize columns in the footer. However, I'm having issues getting them to line up properly with my columns. I've tried to use Row / Col to get it to match up but without much luck. Also it needs to be responsive...

 <Table
    columns={columns}
    dataSource={tableData}
    footer={
      <Row>
        <Col span={8}>
          <strong>TOTALS:</strong>
        </Col>
        <Col span={2}>
          123
        </Col>
        <Col span={3} />
        <Col span={2}>
          123
        </Col>
        <Col span={2} />
        <Col span={2}>
          123
        </Col >
        <Col span={8} />
      </Row>
    }
/>

enter image description here

Is there an better way to achieve this?


Solution

  • I found the good solution & its provided by Antd Team in table Component have a look hope this solves your problem. have a look (https://codesandbox.io/s/summary-ant-design-demo-kw93t)

    import ReactDOM from 'react-dom';
    import 'antd/dist/antd.css';
    import './index.css';
    import { Table, Typography } from 'antd';
    
    const { Text } = Typography;
    
    const columns = [
      {
        title: 'Name',
        dataIndex: 'name',
      },
      {
        title: 'Borrow',
        dataIndex: 'borrow',
      },
      {
        title: 'Repayment',
        dataIndex: 'repayment',
      },
    ];
    
    const data = [
      {
        key: '1',
        name: 'John Brown',
        borrow: 10,
        repayment: 33,
      },
      {
        key: '2',
        name: 'Jim Green',
        borrow: 100,
        repayment: 0,
      },
      {
        key: '3',
        name: 'Joe Black',
        borrow: 10,
        repayment: 10,
      },
      {
        key: '4',
        name: 'Jim Red',
        borrow: 75,
        repayment: 45,
      },
    ];
    
    const fixedColumns = [
      {
        title: 'Name',
        dataIndex: 'name',
        fixed: true,
        width: 100,
      },
      {
        title: 'Description',
        dataIndex: 'description',
      },
    ];
    
    const fixedData = [];
    for (let i = 0; i < 6; i += 1) {
      fixedData.push({
        key: i,
        name: i % 2 ? 'Light' : 'Bamboo',
        description: 'Everything that has a beginning, has an end.',
      });
    }
    
    ReactDOM.render(
      <>
        <Table
          columns={columns}
          dataSource={data}
          pagination={false}
          bordered
          summary={pageData => {
            let totalBorrow = 0;
            let totalRepayment = 0;
    
            pageData.forEach(({ borrow, repayment }) => {
              totalBorrow += borrow;
              totalRepayment += repayment;
            });
    
            return (
              <>
                <Table.Summary.Row>
                  <Table.Summary.Cell>Total</Table.Summary.Cell>
                  <Table.Summary.Cell>
                    <Text type="danger">{totalBorrow}</Text>
                  </Table.Summary.Cell>
                  <Table.Summary.Cell>
                    <Text>{totalRepayment}</Text>
                  </Table.Summary.Cell>
                </Table.Summary.Row>
                <Table.Summary.Row>
                  <Table.Summary.Cell>Balance</Table.Summary.Cell>
                  <Table.Summary.Cell colSpan={2}>
                    <Text type="danger">{totalBorrow - totalRepayment}</Text>
                  </Table.Summary.Cell>
                </Table.Summary.Row>
              </>
            );
          }}
        />
      </>,
      document.getElementById('container'),
    );
    

    Thank You.