{"id":368,"date":"2026-06-11T21:30:50","date_gmt":"2026-06-11T13:30:50","guid":{"rendered":"https:\/\/chengyuxia.com\/?page_id=368"},"modified":"2026-06-11T21:30:51","modified_gmt":"2026-06-11T13:30:51","slug":"%e4%ba%9a%e5%85%8b%e5%8a%9b%e6%89%b9%e9%87%8f%e6%8a%a5%e4%bb%b7%e5%b7%a5%e5%85%b7%ef%bc%88excel%e6%99%ba%e8%83%bd%e5%af%bc%e5%85%a5%ef%bc%89","status":"publish","type":"page","link":"https:\/\/chengyuxia.com\/index.php\/%e4%ba%9a%e5%85%8b%e5%8a%9b%e6%89%b9%e9%87%8f%e6%8a%a5%e4%bb%b7%e5%b7%a5%e5%85%b7%ef%bc%88excel%e6%99%ba%e8%83%bd%e5%af%bc%e5%85%a5%ef%bc%89\/","title":{"rendered":"\u4e9a\u514b\u529b\u6279\u91cf\u62a5\u4ef7\u5de5\u5177\uff08Excel\u667a\u80fd\u5bfc\u5165\uff09"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=yes\">\n    <title>\u4e9a\u514b\u529b\u6279\u91cf\u62a5\u4ef7\u5de5\u5177\uff08Excel\u667a\u80fd\u5bfc\u5165\uff09<\/title>\n    <style>\n        * {\n            box-sizing: border-box;\n            font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;\n        }\n        body {\n            background: #f0f2f5;\n            padding: 24px;\n            margin: 0;\n        }\n        .container {\n            max-width: 1400px;\n            margin: 0 auto;\n            background: white;\n            border-radius: 32px;\n            box-shadow: 0 20px 35px -12px rgba(0,0,0,0.1);\n            padding: 28px 24px 36px;\n        }\n        h2 {\n            font-size: 1.8rem;\n            font-weight: 600;\n            margin: 0 0 0.5rem 0;\n            color: #1e2a3e;\n        }\n        .sub {\n            color: #5b6e8c;\n            font-size: 0.85rem;\n            border-left: 3px solid #3b82f6;\n            padding-left: 12px;\n            margin: 0 0 24px 0;\n        }\n        .toolbar {\n            margin-bottom: 20px;\n            display: flex;\n            gap: 16px;\n            flex-wrap: wrap;\n            align-items: center;\n        }\n        button {\n            background: #3b82f6;\n            border: none;\n            padding: 8px 20px;\n            border-radius: 40px;\n            font-size: 0.9rem;\n            font-weight: 500;\n            color: white;\n            cursor: pointer;\n            transition: 0.2s;\n        }\n        button:hover {\n            background: #2563eb;\n        }\n        .btn-success {\n            background: #10b981;\n        }\n        .btn-success:hover {\n            background: #059669;\n        }\n        .btn-upload {\n            background: #8b5cf6;\n        }\n        .btn-upload:hover {\n            background: #7c3aed;\n        }\n        table {\n            width: 100%;\n            border-collapse: collapse;\n            font-size: 0.85rem;\n            overflow-x: auto;\n            display: block;\n        }\n        th, td {\n            border: 1px solid #cfdee9;\n            padding: 10px 6px;\n            text-align: center;\n            vertical-align: middle;\n        }\n        th {\n            background: #f8fafc;\n            font-weight: 600;\n        }\n        input, select {\n            width: 100%;\n            padding: 6px 8px;\n            border-radius: 12px;\n            border: 1px solid #cbd5e1;\n            font-size: 0.85rem;\n            text-align: center;\n        }\n        .result-table {\n            margin-top: 32px;\n            overflow-x: auto;\n        }\n        .total-row {\n            font-weight: bold;\n            background: #e6f7e6;\n        }\n        .footnote {\n            font-size: 0.7rem;\n            color: #6c7a91;\n            text-align: center;\n            margin-top: 24px;\n            padding-top: 16px;\n            border-top: 1px solid #e2e8f0;\n        }\n        @media (max-width: 700px) {\n            .container {\n                padding: 16px;\n            }\n            th, td {\n                font-size: 0.7rem;\n                padding: 6px 3px;\n            }\n        }\n    <\/style>\n<\/head>\n<body>\n<div class=\"container\">\n    <h2>\ud83d\udcca \u4e9a\u514b\u529b\u6279\u91cf\u62a5\u4ef7\u5de5\u5177\uff08Excel\u667a\u80fd\u5bfc\u5165\uff09<\/h2>\n    <div class=\"sub\">\u4e0a\u4f20Excel \u2192 \u81ea\u52a8\u8bc6\u522b\u5217 \u2192 \u5728\u7ebf\u7f16\u8f91 \u2192 \u4e00\u952e\u8ba1\u7b97\u62a5\u4ef7<\/div>\n\n    <div class=\"toolbar\">\n        <input type=\"file\" id=\"uploadExcel\" accept=\".xlsx, .xls, .csv\" style=\"display:none;\">\n        <button id=\"uploadBtn\" class=\"btn-upload\">\ud83d\udcc2 \u4e0a\u4f20Excel\u6587\u4ef6<\/button>\n        <button id=\"addRowBtn\">\u2795 \u6dfb\u52a0\u4e00\u884c<\/button>\n        <button id=\"calcBtn\" class=\"btn-success\">\ud83d\udcb0 \u8ba1\u7b97\u62a5\u4ef7<\/button>\n        <button id=\"exportBtn\">\ud83d\udcce \u5bfc\u51fa\u7ed3\u679cExcel<\/button>\n    <\/div>\n\n    <div style=\"overflow-x: auto;\">\n        <table id=\"dataTable\">\n            <thead>\n                <tr>\n                    <th>\u5e8f\u53f7<\/th>\n                    <th>\u9879\u76ee\u540d\u79f0<\/th>\n                    <th>\u957f(mm)<\/th><th>\u5bbd(mm)<\/th><th>\u539a(mm)<\/th><th>\u6570\u91cf<\/th>\n                    <th>\u6750\u6599\u7b49\u7ea7<br>(23\u56fd\u4ea7\/35\u8fdb\u53e3)<\/th>\n                    <th>\u8868\u9762\u5de5\u827a<br>(60UV\/120\u70e4\u6f06+UV)<\/th>\n                    <th>\u62a5\u4ef7\u7cfb\u6570<br>(1.5\/2.0\/2.5)<\/th>\n                    <th style=\"width:60px\">\u64cd\u4f5c<\/th>\n                <\/tr>\n            <\/thead>\n            <tbody id=\"tableBody\">\n                <!-- \u52a8\u6001\u884c -->\n            <\/tbody>\n        <\/table>\n    <\/div>\n\n    <div id=\"resultArea\" class=\"result-table\" style=\"display: none;\"><\/div>\n    <div class=\"footnote\">\n        * \u4e0a\u4f20Excel\u65f6\uff0c\u7cfb\u7edf\u4f1a\u81ea\u52a8\u8bc6\u522b\u201c\u957f\u5ea6\u201d\u3001\u201c\u5bbd\u5ea6\u201d\u3001\u201c\u539a\u5ea6\u201d\u3001\u201c\u6570\u91cf\u201d\u3001\u201c\u6750\u6599\u201d\u3001\u201c\u5de5\u827a\u201d\u7b49\u5217\uff08\u652f\u6301\u4e2d\u82f1\u6587\u522b\u540d\uff09\u3002<br>\n        * \u6750\u6599\u5217\u53ef\u5305\u542b\u201c\u56fd\u4ea7\u201d\u3001\u201c\u8fdb\u53e3\u201d\u6216\u76f4\u63a5\u519923\/35\uff1b\u5de5\u827a\u5217\u53ef\u5305\u542b\u201cUV\u201d\u3001\u201c\u70e4\u6f06\u201d\u621660\/120\u3002<br>\n        * \u53ef\u5728\u7ebf\u7f16\u8f91\u4efb\u610f\u5355\u5143\u683c\uff0c\u7136\u540e\u70b9\u51fb\u201c\u8ba1\u7b97\u62a5\u4ef7\u201d\u3002\u5bfc\u51fa\u7ed3\u679c\u5305\u542b\u6240\u6709\u8ba1\u7b97\u660e\u7ec6\u3002\n    <\/div>\n<\/div>\n\n<script src=\"https:\/\/cdn.sheetjs.com\/xlsx-0.20.2\/package\/dist\/xlsx.full.min.js\"><\/script>\n<script>\n    const tbody = document.getElementById('tableBody');\n\n    function renumberRows() {\n        const rows = tbody.querySelectorAll('tr');\n        rows.forEach((row, idx) => {\n            const seqCell = row.cells[0];\n            if (seqCell) seqCell.innerText = (idx + 1).toString();\n        });\n    }\n\n    function escapeHtml(str) {\n        if (!str) return '';\n        return str.replace(\/[&<>]\/g, function(m) {\n            if (m === '&') return '&amp;';\n            if (m === '<') return '&lt;';\n            if (m === '>') return '&gt;';\n            return m;\n        });\n    }\n\n    function createRow(projectName = '', len = 100, wid = 200, thick = 3, qty = 1, materialVal = 23, processVal = 60, factor = 2.0) {\n        const tr = document.createElement('tr');\n        tr.innerHTML = `\n            <td class=\"seq\">0<\/td>\n            <td><input type=\"text\" class=\"projectName\" value=\"${escapeHtml(projectName)}\" placeholder=\"\u53ef\u9009\"><\/td>\n            <td><input type=\"number\" step=\"1\" value=\"${len}\" class=\"len\"><\/td>\n            <td><input type=\"number\" step=\"1\" value=\"${wid}\" class=\"wid\"><\/td>\n            <td><input type=\"number\" step=\"1\" value=\"${thick}\" class=\"thick\"><\/td>\n            <td><input type=\"number\" step=\"1\" value=\"${qty}\" class=\"qty\"><\/td>\n            <td><select class=\"material\">${materialVal==23 ? '<option value=\"23\" selected>23 (\u56fd\u4ea7)<\/option><option value=\"35\">35 (\u8fdb\u53e3)<\/option>' : '<option value=\"23\">23 (\u56fd\u4ea7)<\/option><option value=\"35\" selected>35 (\u8fdb\u53e3)<\/option>'}<\/select><\/td>\n            <td><select class=\"process\">${processVal==60 ? '<option value=\"60\" selected>60 (UV)<\/option><option value=\"120\">120 (\u70e4\u6f06+UV)<\/option>' : '<option value=\"60\">60 (UV)<\/option><option value=\"120\" selected>120 (\u70e4\u6f06+UV)<\/option>'}<\/select><\/td>\n            <td><select class=\"factor\">${factor==1.5 ? '<option value=\"1.5\">1.5<\/option><option value=\"2.0\">2.0<\/option><option value=\"2.5\">2.5<\/option>' : (factor==2.0 ? '<option value=\"1.5\">1.5<\/option><option value=\"2.0\" selected>2.0<\/option><option value=\"2.5\">2.5<\/option>' : '<option value=\"1.5\">1.5<\/option><option value=\"2.0\">2.0<\/option><option value=\"2.5\" selected>2.5<\/option>')}<\/select><\/td>\n            <td><button class=\"delRowBtn\" style=\"background:#ef4444; padding:4px 8px;\">\ud83d\uddd1\ufe0f<\/button><\/td>\n        `;\n        return tr;\n    }\n\n    function initTable() {\n        tbody.innerHTML = '';\n        tbody.appendChild(createRow('\u793a\u4f8b\u95e8\u724c', 100, 200, 3, 1, 23, 60, 2.0));\n        tbody.appendChild(createRow('\u793a\u4f8b\u6307\u5f15\u724c', 150, 200, 5, 2, 23, 60, 2.0));\n        renumberRows();\n    }\n    initTable();\n\n    document.getElementById('addRowBtn').addEventListener('click', () => {\n        tbody.appendChild(createRow('', 100, 200, 3, 1, 23, 60, 2.0));\n        renumberRows();\n    });\n\n    tbody.addEventListener('click', (e) => {\n        if (e.target.classList.contains('delRowBtn')) {\n            const row = e.target.closest('tr');\n            if (row && tbody.children.length > 1) {\n                row.remove();\n                renumberRows();\n            } else {\n                alert(\"\u81f3\u5c11\u4fdd\u7559\u4e00\u884c\u6570\u636e\");\n            }\n        }\n    });\n\n    \/\/ \u667a\u80fd\u6620\u5c04\u5217\u540d\n    function findColumn(headers, patterns) {\n        for (let pattern of patterns) {\n            const idx = headers.findIndex(h => h && typeof h === 'string' && h.toLowerCase().includes(pattern.toLowerCase()));\n            if (idx !== -1) return idx;\n        }\n        return -1;\n    }\n\n    function parseMaterialValue(val) {\n        if (typeof val === 'number') return val;\n        if (typeof val === 'string') {\n            const lower = val.trim().toLowerCase();\n            if (lower === '\u56fd\u4ea7' || lower === '\u56fd') return 23;\n            if (lower === '\u8fdb\u53e3' || lower === '\u8fdb') return 35;\n            const num = parseFloat(val);\n            if (!isNaN(num)) return num;\n        }\n        return 23;\n    }\n\n    function parseProcessValue(val) {\n        if (typeof val === 'number') return val;\n        if (typeof val === 'string') {\n            const lower = val.trim().toLowerCase();\n            if (lower === 'uv' || lower === '\u76f4\u63a5uv') return 60;\n            if (lower === '\u70e4\u6f06' || lower === '\u70e4\u6f06+uv' || lower === '\u70e4\u6f06uv') return 120;\n            const num = parseFloat(val);\n            if (!isNaN(num)) return num;\n        }\n        return 60;\n    }\n\n    function parseFactorValue(val) {\n        const num = parseFloat(val);\n        if (!isNaN(num) && (num === 1.5 || num === 2.0 || num === 2.5)) return num;\n        return 2.0;\n    }\n\n    document.getElementById('uploadBtn').addEventListener('click', () => {\n        document.getElementById('uploadExcel').click();\n    });\n\n    document.getElementById('uploadExcel').addEventListener('change', (e) => {\n        const file = e.target.files[0];\n        if (!file) return;\n        const reader = new FileReader();\n        reader.onload = function(evt) {\n            const data = new Uint8Array(evt.target.result);\n            const workbook = XLSX.read(data, { type: 'array' });\n            const firstSheet = workbook.Sheets[workbook.SheetNames[0]];\n            const rows = XLSX.utils.sheet_to_json(firstSheet, { header: 1, defval: \"\" });\n            if (!rows || rows.length < 2) {\n                alert(\"Excel\u81f3\u5c11\u5305\u542b\u8868\u5934\u548c\u6570\u636e\u884c\");\n                return;\n            }\n            const headers = rows[0].map(cell => (cell ? cell.toString().trim() : ''));\n            const lenIdx = findColumn(headers, ['\u957f\u5ea6', '\u957f', 'len', 'length', '\u957f(mm)', '\u957f\u5ea6mm']);\n            const widIdx = findColumn(headers, ['\u5bbd\u5ea6', '\u5bbd', 'wid', 'width', '\u5bbd(mm)', '\u5bbd\u5ea6mm']);\n            const thickIdx = findColumn(headers, ['\u539a\u5ea6', '\u539a', 'thick', 'thickness', '\u539a(mm)', '\u539a\u5ea6mm']);\n            const qtyIdx = findColumn(headers, ['\u6570\u91cf', '\u6570', 'qty', 'quantity', '\u4e2a\u6570']);\n            const materialIdx = findColumn(headers, ['\u6750\u6599', '\u7b49\u7ea7', '\u6750\u8d28', 'material', 'grade']);\n            const processIdx = findColumn(headers, ['\u5de5\u827a', '\u8868\u9762', 'process', 'surface']);\n            const factorIdx = findColumn(headers, ['\u7cfb\u6570', '\u62a5\u4ef7\u7cfb\u6570', 'factor', '\u500d\u6570']);\n            const nameIdx = findColumn(headers, ['\u9879\u76ee', '\u540d\u79f0', '\u4ea7\u54c1', 'name', '\u9879\u76ee\u540d\u79f0']);\n\n            if (lenIdx === -1 || widIdx === -1 || thickIdx === -1 || qtyIdx === -1) {\n                alert(\"\u7f3a\u5c11\u5173\u952e\u5217\uff1a\u957f\u5ea6\u3001\u5bbd\u5ea6\u3001\u539a\u5ea6\u6216\u6570\u91cf\u3002\u8bf7\u786e\u4fdd\u8868\u5934\u5305\u542b\u8fd9\u4e9b\u5173\u952e\u8bcd\u3002\");\n                return;\n            }\n\n            const newRows = [];\n            for (let i = 1; i < rows.length; i++) {\n                const row = rows[i];\n                const len = parseFloat(row[lenIdx]);\n                const wid = parseFloat(row[widIdx]);\n                const thick = parseFloat(row[thickIdx]);\n                const qty = parseFloat(row[qtyIdx]);\n                if (isNaN(len) || isNaN(wid) || isNaN(thick) || isNaN(qty)) continue;\n                if (len <= 0 || wid <= 0 || thick <= 0 || qty <= 0) continue;\n\n                let materialVal = 23;\n                if (materialIdx !== -1) materialVal = parseMaterialValue(row[materialIdx]);\n                let processVal = 60;\n                if (processIdx !== -1) processVal = parseProcessValue(row[processIdx]);\n                let factorVal = 2.0;\n                if (factorIdx !== -1) factorVal = parseFactorValue(row[factorIdx]);\n                let projectName = '';\n                if (nameIdx !== -1) projectName = row[nameIdx] ? row[nameIdx].toString() : '';\n                newRows.push(createRow(projectName, len, wid, thick, qty, materialVal, processVal, factorVal));\n            }\n            if (newRows.length === 0) {\n                alert(\"\u6ca1\u6709\u6709\u6548\u7684\u62a5\u4ef7\u6570\u636e\u884c\");\n                return;\n            }\n            tbody.innerHTML = '';\n            newRows.forEach(row => tbody.appendChild(row));\n            renumberRows();\n            alert(`\u6210\u529f\u5bfc\u5165 ${newRows.length} \u884c\u6570\u636e\uff0c\u8bf7\u786e\u8ba4\u5e76\u70b9\u51fb\u300c\u8ba1\u7b97\u62a5\u4ef7\u300d`);\n        };\n        reader.readAsArrayBuffer(file);\n        e.target.value = '';\n    });\n\n    function calcRow(row) {\n        const projectNameInput = row.querySelector('.projectName');\n        const projectName = projectNameInput ? projectNameInput.value : '';\n        const len = parseFloat(row.querySelector('.len').value);\n        const wid = parseFloat(row.querySelector('.wid').value);\n        const thick = parseFloat(row.querySelector('.thick').value);\n        const qty = parseFloat(row.querySelector('.qty').value);\n        const material = parseFloat(row.querySelector('.material').value);\n        const process = parseFloat(row.querySelector('.process').value);\n        const factor = parseFloat(row.querySelector('.factor').value);\n        if (isNaN(len) || isNaN(wid) || isNaN(thick) || isNaN(qty) || isNaN(material) || isNaN(process) || isNaN(factor)) return null;\n        if (len<=0 || wid<=0 || thick<=0 || qty<=0) return null;\n        const area = len * wid \/ 1000000;\n        const lenM = len \/ 1000;\n        const widM = wid \/ 1000;\n        const thickM = thick \/ 1000;\n        const weight = lenM * widM * thickM * 1200;\n        const boardCost = weight * material;\n        const processCost = area * process;\n        const subtotal = boardCost + processCost;\n        const unitPrice = subtotal * factor;\n        const total = unitPrice * qty;\n        return {\n            projectName, len, wid, thick, qty, material, process, factor,\n            area, weight, boardCost, processCost, subtotal, unitPrice, total\n        };\n    }\n\n    function renderResults(results) {\n        const container = document.getElementById('resultArea');\n        if (!results.length) {\n            container.style.display = 'none';\n            return;\n        }\n        let totalQty = 0, totalSum = 0;\n        results.forEach(r => { totalQty += r.qty; totalSum += r.total; });\n        \/\/ \u6784\u9020\u8868\u683c\uff0c\u786e\u4fdd\u5217\u6570\u5bf9\u9f50\n        let html = `<h3 style=\"margin:0 0 16px 0;\">\ud83d\udcb0 \u62a5\u4ef7\u7ed3\u679c<\/h3>\n                    <table style=\"width:100%; border-collapse:collapse;\">\n                        <thead>\n                            <tr>\n                                <th>\u5e8f\u53f7<\/th><th>\u9879\u76ee\u540d\u79f0<\/th><th>\u957f(mm)<\/th><th>\u5bbd(mm)<\/th><th>\u539a(mm)<\/th><th>\u6570\u91cf<\/th>\n                                <th>\u6750\u6599\u4ef7<\/th><th>\u5de5\u827a\u4ef7<\/th><th>\u7cfb\u6570<\/th>\n                                <th>\u9762\u79ef(\u33a1)<\/th><th>\u91cd\u91cf(kg)<\/th><th>\u677f\u6750\u8d39(\u5143)<\/th><th>\u5de5\u827a\u8d39(\u5143)<\/th>\n                                <th>\u5c0f\u8ba1(\u5143)<\/th><th>\u5355\u4ef7(\u5143)<\/th><th>\u603b\u4ef7(\u5143)<\/th>\n                            <\/tr>\n                        <\/thead>\n                        <tbody>`;\n        results.forEach((r, idx) => {\n            html += `<tr>\n                        <td>${idx+1}<\/td>\n                        <td>${escapeHtml(r.projectName)}<\/td>\n                        <td>${r.len}<\/td><td>${r.wid}<\/td><td>${r.thick}<\/td><td>${r.qty}<\/td>\n                        <td>${r.material}<\/td><td>${r.process}<\/td><td>${r.factor}<\/td>\n                        <td>${r.area.toFixed(6)}<\/td><td>${r.weight.toFixed(2)}<\/td>\n                        <td>${r.boardCost.toFixed(2)}<\/td><td>${r.processCost.toFixed(2)}<\/td>\n                        <td>${r.subtotal.toFixed(2)}<\/td><td>${r.unitPrice.toFixed(2)}<\/td><td>${r.total.toFixed(2)}<\/td>\n                    <\/tr>`;\n        });\n        html += `<tr class=\"total-row\"><td colspan=\"5\">\u5408\u8ba1<\/td><td>${totalQty}<\/td><td colspan=\"9\">${totalSum.toFixed(2)} \u5143<\/td><\/tr>`;\n        html += `<\/tbody><\/table>`;\n        container.innerHTML = html;\n        container.style.display = 'block';\n    }\n\n    document.getElementById('calcBtn').addEventListener('click', () => {\n        const rows = tbody.querySelectorAll('tr');\n        const results = [];\n        for (let row of rows) {\n            const res = calcRow(row);\n            if (res) results.push(res);\n        }\n        if (results.length === 0) {\n            alert(\"\u6ca1\u6709\u6709\u6548\u7684\u62a5\u4ef7\u6570\u636e\");\n            return;\n        }\n        renderResults(results);\n    });\n\n    document.getElementById('exportBtn').addEventListener('click', () => {\n        const rows = tbody.querySelectorAll('tr');\n        const results = [];\n        for (let row of rows) {\n            const res = calcRow(row);\n            if (res) results.push(res);\n        }\n        if (results.length === 0) {\n            alert(\"\u6ca1\u6709\u6709\u6548\u6570\u636e\uff0c\u8bf7\u5148\u8ba1\u7b97\u62a5\u4ef7\");\n            return;\n        }\n        const sheetData = [\n            [\"\u5e8f\u53f7\",\"\u9879\u76ee\u540d\u79f0\",\"\u957f(mm)\",\"\u5bbd(mm)\",\"\u539a(mm)\",\"\u6570\u91cf\",\"\u6750\u6599\u5355\u4ef7\",\"\u5de5\u827a\u5355\u4ef7\",\"\u7cfb\u6570\",\n             \"\u9762\u79ef(\u33a1)\",\"\u91cd\u91cf(kg)\",\"\u677f\u6750\u8d39(\u5143)\",\"\u5de5\u827a\u8d39(\u5143)\",\"\u5c0f\u8ba1(\u5143)\",\"\u5355\u4ef7(\u5143)\",\"\u603b\u4ef7(\u5143)\"]\n        ];\n        results.forEach((r, idx) => {\n            sheetData.push([\n                idx+1, r.projectName, r.len, r.wid, r.thick, r.qty,\n                r.material, r.process, r.factor,\n                r.area.toFixed(6), r.weight.toFixed(2),\n                r.boardCost.toFixed(2), r.processCost.toFixed(2),\n                r.subtotal.toFixed(2), r.unitPrice.toFixed(2), r.total.toFixed(2)\n            ]);\n        });\n        const ws = XLSX.utils.aoa_to_sheet(sheetData);\n        const wb = XLSX.utils.book_new();\n        XLSX.utils.book_append_sheet(wb, ws, \"\u4e9a\u514b\u529b\u6279\u91cf\u62a5\u4ef7\u7ed3\u679c\");\n        XLSX.writeFile(wb, `\u4e9a\u514b\u529b\u6279\u91cf\u62a5\u4ef7_${new Date().toISOString().slice(0,19).replace(\/:\/g, '-')}.xlsx`);\n    });\n<\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>\u4e9a\u514b\u529b\u6279\u91cf\u62a5\u4ef7\u5de5\u5177\uff08Excel\u667a\u80fd\u5bfc\u5165\uff09 \ud83d\udcca \u4e9a\u514b\u529b\u6279\u91cf\u62a5\u4ef7\u5de5\u5177\uff08Excel\u667a\u80fd\u5bfc\u5165\uff09 \u4e0a\u4f20Excel \u2192 \u81ea&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-368","page","type-page","status-publish","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/chengyuxia.com\/index.php\/wp-json\/wp\/v2\/pages\/368","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/chengyuxia.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/chengyuxia.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/chengyuxia.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/chengyuxia.com\/index.php\/wp-json\/wp\/v2\/comments?post=368"}],"version-history":[{"count":1,"href":"https:\/\/chengyuxia.com\/index.php\/wp-json\/wp\/v2\/pages\/368\/revisions"}],"predecessor-version":[{"id":369,"href":"https:\/\/chengyuxia.com\/index.php\/wp-json\/wp\/v2\/pages\/368\/revisions\/369"}],"wp:attachment":[{"href":"https:\/\/chengyuxia.com\/index.php\/wp-json\/wp\/v2\/media?parent=368"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}