react项目里js实现数据预览及下载

8 篇文章 0 订阅
5 篇文章 0 订阅

定义参数

// 打印功能参数
    const [printData, setPrintData] = useState([])
    const [printGroupData, setPrintGroupData] = useState([])
定义页面宽度,根据页面宽度赋值表单的宽
let screenWidth = document.documentElement.scrollWidth || body.scrollWidth

定义打印的每一列数据

const printCol = [
        { key: 'number', name: '序号', },
        { key: 'customer_name', name: '客户名称', },
        { key: 'name', name: '项目名称', },
        { key: 'category_name', name: '品类', },
        { key: 'fabric_sn', name: '面料编号', },
        { key: 'composition', name: '面料成分', },
        { key: 'quantity', name: '件数', },
        { key: 'size', name: '尺码', },
        { key: 'style_describe', name: '款式描述', },
        { key: 'technic_describe', name: '工艺要求', },
        { key: 'fabric_fee', name: '面料费', },
        { key: 'process_fee', name: '加工费', },
        { key: 'clothes_fee', name: '成衣费', },
        { key: 'delivery', name: '交期', },
        { key: 'remark', name: '备注', },
        { key: 'image', name: '图片', },
    ];

创建打印数据

const createPrintData = (data) => {
        let printArr = []
        data.forEach((item, index) => {
            const colData = {};
            printCol.forEach(j => {
                colData[j.key] = item[j.key];
            })
            colData.number = index + 1;
            colData.state = GOG_STATE[colData.state];
            printArr.push(colData)
        });
        setPrintData(printArr)
        setPrintGroupData([printArr])
    }

创建表单标题

const createTitle = (title) => (
        <table style={{ width: screenWidth }}>
            <tbody style={styleObj.title}>
                <tr><th colSpan="10">{title}</th></tr>
            </tbody>
        </table>
    )

创建表单头部信息

const createHeader = (headerData) => {
        headerData = [
            { l: '日期', value: `${searchData[0]}至${searchData[1]}`, },
            { l: '报表时间', value: getNowTime(), }
        ];
        return (
            <table style={{ width: screenWidth, marginTop: 20 }}>
                <tbody style={styleObj.header}>
                    <tr>
                        {headerData.map((d, i) => <Fragment key={i}><th colSpan="3" style={{ textAlign: "right" }}>{d.l}:</th>
                            <th colSpan="3" style={{ textAlign: "left" }}>{d.value}
                            </th></Fragment>)}
                    </tr>
                </tbody>
            </table>
        )
    }

antd的upload组件显示图片

 const dealData = (item) => {
        let arr = [];
        for (let i in item) {
            let obj = {}, uid = i, name = item[i].name, type = item[i].file_type,
                url = proxy + item[i].path, path = item[i].path;
            obj.uid = uid, obj.name = name, obj.type = type, obj.status = 'done', obj.url = url, obj.path = path;
            arr.push(obj);
        }
        return arr;
    }
    const printImage = (data) => {
        const fileList = data != null ? dealData(stringToJsonArr(data)) : [];
        const props = {
            showUploadList: {
                showPreviewIcon: true,
                showRemoveIcon: false,
            }
        }
        return <Upload
            disabled={true}
            listType="picture"
            {...props}
            fileList={fileList}
        > </Upload>
    }

创建表单

const createForm = (printCol, printList) => (
        <table style={styleObj.printTable} style={{ width: screenWidth, marginTop: 10 }}>
            <tbody >
                {
                    (
                        <tr style={styleObj.printTableTr}>
                            {printCol.map((item, i) => <th key={i} style={{ ...styleObj[item.key], ...styleObj.printTableTtable }}><div>{item.name}</div></th>)}
                        </tr>
                    )
                }
                {
                    printList.map((item, i) => (
                        <tr key={i} style={styleObj.printTableTr}>
                            {Object.keys(item).map(m =>
                                <th key={m} style={styleObj.printTableTh}>{m == 'image' ?
                                    printImage(item[m])
                                    : item[m]
                                }</th>
                            )}
                        </tr>
                    ))

                }
            </tbody>
        </table >
    )

打印方法

   const handlePrint = () => {
        const win = window.open('', 'printwindow');
        win.document.write(window.document.getElementById('printArea').innerHTML);
        win.print();
        win.close();
    }

创建打印的全部内容

 const createPrintArea = (printCol) => {
        return (
            printGroupData.map((item, index) => {
                if (item.length) {
                    return (
                        <div style={styleObj.printArea} key={index} style={{ width: printArea }}>
                            {createTitle(form.data_type == 1 ? '样品信息报表' : '业务详情报表')}
                            {createHeader()}
                            {createForm(printCol, item)}
                        </div>
                    )
                }
            })
        )
    }

return 返回

<div id='printArea'>
                        <div style={styleObj.printArea}>
                            {printCol.length && printData.length > 0 ? createPrintArea(printCol) : null}
                        </div>
                    </div>

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值