更新成果导出功能

This commit is contained in:
ForeverSmiYng 2026-03-17 11:55:29 +08:00
parent 8bf3d5e773
commit 4e343cccf1
3 changed files with 319 additions and 25 deletions

View File

@ -580,8 +580,14 @@ export async function exportFile(fileName: string, data: any): Promise<void> {
// 按模板生成最终工作簿:填充封面、目录、各分表及汇总数据。
async function generateTemplate(data) {
data.contracts[0].services[0].tasks = ['依据本项目在招标阶段确认的设计图纸工程量,结合工程量清单计量支付规则,对设计工程量进行复核,包括构件工程量、明细表工程量和汇总表工程量,同时与相关方核对工程量', '依据核对后确认的设计图纸数量,细化与合并招标工程量清单或合同工程量清单,建立各维度清单间的数据链接,与相关单位完成核对与确认', '依据确定的招标工程量清单或合同工程量清单,拆解与合并相应的清单费用,与相关单位完成核对与确认', '现场勘查与测量现场实施工程量'];
// const downTextTmp = { richText: [{ font: { charset: 134, color: { theme: 1 }, italic: true, name: '宋体', size: 10 }, text: '常规' }, { font: { charset: 134, color: { theme: 1 }, italic: true, name: 'Calibri', size: 10, vertAlign: 'subscript' }, text: '下标' }] };
console.log(data)
// 编制说明 → 工作内容的前后默认项
let prefixIDs = [6, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27];
let suffixIDs = [6, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27];
const prefixTexts = ['收集并整理各阶段及各项造价咨询所需的基础资料,审核基础资料的完整性和合理性', '编制造价咨询服务总体及各分项的服务计划、服务大纲及工作方案', '了解建设工程项目所在地的建设条件'];
const suffixTexts = ['协助委托人完成咨询服务相应造价文件的报审、报备、报批、检查与审计涉及的解释与回复、修改与调整等工作', '完成本合同造价档案的收集、整理和归档'];
try {
// 获取模板
let templateExcel = 'template20260226001test010';
@ -645,10 +651,15 @@ async function generateTemplate(data) {
let allReserve = {};
let allMajors = {};
let allServiceMajors = new Set();
let allMethods = new Set();
let allReserveMethods = { 0: { coe: [], cid: [], coeSet: new Set() }, 4: [], 5: [] };
let contractFeeSummary = [];
data.scale?.forEach(sci => {
allMajors[sci.major] = { [data.contracts.length]: sci };
});
data.contracts.forEach((ci, index) => {
contractFeeSummary.push(`${ci.name} ${Number(ci.fee).toLocaleString()}`);
ci.allServiceMajors = new Set();
// 记录allMajors
ci.scale?.forEach(sci => {
if (allMajors[sci.major]) {
@ -657,19 +668,16 @@ async function generateTemplate(data) {
allMajors[sci.major] = { [index]: sci };
}
});
ci.method1 = [];
ci.method2 = [];
ci.method3 = [];
ci.method4 = [];
// 按计价方式汇总服务数据对象
ci.services.forEach(si => {
if (si.method1) {
ci.method1.push(si.id);
}
if (si.method2) {
ci.method2.push(si.id);
}
if (prefixIDs.includes(si.id)) ci.hasPreTexts = true;
if (suffixIDs.includes(si.id)) ci.hasSufTexts = true;
if (si.method1) ci.method1.push(si.id);
if (si.method2) ci.method2.push(si.id);
if (si.method3) ci.method3.push(si.id);
if (si.method4) ci.method4.push(si.id);
});
@ -705,22 +713,26 @@ async function generateTemplate(data) {
sheet_2 = copyWorksheet(workbook, '预i-2表', `${index + 1}-2表`);
sheet_2.headerFooter.oddHeader = sheet_2.headerFooter.oddHeader.replace(/×××/g, ci.name).replace(/预 i-2 表/g, `${index + 1}-2 表`).replace(/第i合同/g, ci.name);
if (ci.method1.length) {
allMethods.add(1);
ml_sourceRows.push(ml_sheet.getRow(8));
sheet_2_1 = copyWorksheet(workbook, '预i-2-1表', `${index + 1}-2-1表`);
sheet_2_1.headerFooter.oddHeader = sheet_2_1.headerFooter.oddHeader.replace(/×××/g, ci.name).replace(/预 i-2-1 表/g, `${index + 1}-2-1 表`).replace(/第i合同/g, ci.name);
}
if (ci.method2.length) {
allMethods.add(2);
ml_sourceRows.push(ml_sheet.getRow(9));
sheet_2_2 = copyWorksheet(workbook, '预i-2-2表', `${index + 1}-2-2表`);
sheet_2_2.headerFooter.oddHeader = sheet_2_2.headerFooter.oddHeader.replace(/×××/g, ci.name).replace(/预 i-2-2 表/g, `${index + 1}-2-2 表`).replace(/第i合同/g, ci.name);
}
}
if (ci.method3.length) {
allMethods.add(3);
ml_sourceRows.push(ml_sheet.getRow(10));
sheet_3 = copyWorksheet(workbook, '预i-3表', `${index + 1}-3表`);
sheet_3.headerFooter.oddHeader = sheet_3.headerFooter.oddHeader.replace(/×××/g, ci.name).replace(/预 i-3 表/g, `${index + 1}-3 表`).replace(/第i合同/g, ci.name);
}
if (ci.method4.length || addtionalM4.length || reserveM4) {
allMethods.add(4);
ml_sourceRows.push(ml_sheet.getRow(11));
ml_sourceRows.push(ml_sheet.getRow(12));
sheet_4 = copyWorksheet(workbook, '预i-4表', `${index + 1}-4表`);
@ -748,6 +760,7 @@ async function generateTemplate(data) {
sheet_4_1.getRow(3).getCell(9).value = numberFormatter(sumObj.fee, 2);
}
if (ci.method5) {
allMethods.add(5);
ml_sourceRows.push(ml_sheet.getRow(13));
sheet_5 = copyWorksheet(workbook, '预i-5表', `${index + 1}-5表`);
sheet_5.headerFooter.oddHeader = sheet_5.headerFooter.oddHeader.replace(/×××/g, ci.name).replace(/预 i-5 表/g, `${index + 1}-5 表`).replace(/第i合同/g, ci.name);
@ -787,7 +800,8 @@ async function generateTemplate(data) {
let m2Sum = 0;
let m3Sum = 0;
let m4Sum = 0;
let serviceSum = 0;
let serviceSum1 = 0;
let serviceSum2 = 0;
ci.services.forEach((sobj, sindex) => {
let allServicesX = allServices.find(s => s.id == sobj.id);
if (allServicesX) {
@ -822,7 +836,9 @@ async function generateTemplate(data) {
m4Sum = addNumbers(m4Sum, toFiniteNumber(sobj.method4.fee));
}
targetRow.getCell(8).value = numberFormatter(sobj.fee, 2);
serviceSum = addNumbers(serviceSum, toFiniteNumber(sobj.fee));
targetRow.getCell(9).value = numberFormatter(sobj.finalFee, 2);
serviceSum1 = addNumbers(serviceSum1, toFiniteNumber(sobj.fee));
serviceSum2 = addNumbers(serviceSum2, toFiniteNumber(sobj.finalFee));
});
if (sobj.method1 || sobj.method2) {
cusInsertRowFunc(4 + num_2, [sheet_2.getRow(4)], sheet_2, (targetRow) => {
@ -1001,6 +1017,7 @@ async function generateTemplate(data) {
});
allDet.forEach((m, mindex) => {
allServiceMajors.add(m.major);
ci.allServiceMajors.add(m.major);
let majorX = majorList[m.major];
cusInsertRowFunc(4 + num_2, [sheet_2.getRow(4)], sheet_2, (targetRow) => {
targetRow.getCell(1).value = num_2++;
@ -1125,7 +1142,8 @@ async function generateTemplate(data) {
targetRow.getCell(5).value = numberFormatter(m2Sum, 2);
targetRow.getCell(6).value = numberFormatter(m3Sum, 2);
targetRow.getCell(7).value = numberFormatter(m4Sum, 2);
targetRow.getCell(8).value = numberFormatter(serviceSum, 2);
targetRow.getCell(8).value = numberFormatter(serviceSum1, 2);
targetRow.getCell(9).value = numberFormatter(serviceSum2, 2);
});
}
if (ci.addtional) {
@ -1139,6 +1157,7 @@ async function generateTemplate(data) {
targetRow.getCell(6).value = '';
targetRow.getCell(7).value = '';
targetRow.getCell(8).value = '';
targetRow.getCell(9).value = '';
});
ci.addtional.det.forEach((addobj, addindex) => {
endRows++;
@ -1147,11 +1166,14 @@ async function generateTemplate(data) {
targetRow.getCell(2).value = addobj.code;
targetRow.getCell(3).value = addobj.name;
let tmpArr = [];
if (addobj.m0) tmpArr.push(`按基本、可选工作小计的${addobj.m0.coe}计得${addobj.m0.fee}`);
if (addobj.m0) {
tmpArr.push(`按基本工作和可选工作确认预算之和的${addobj.m0.coe}计得${addobj.m0.fee}`);
allMethods.add(0);
}
if (addobj.m4) tmpArr.push(`按工时法计得${addobj.m4.fee}`);
if (addobj.m5) tmpArr.push(`按数量单价计得${addobj.m5.fee}`);
targetRow.getCell(4).value = tmpArr.join(';');
targetRow.getCell(8).value = numberFormatter(addobj.fee, 2);
targetRow.getCell(9).value = numberFormatter(addobj.fee, 2);
if (addobj.m4) {
cusInsertRowFunc(4 + num_4, [sheet_4.getRow(4)], sheet_4, (targetRow) => {
targetRow.getCell(1).value = num_4++;
@ -1225,7 +1247,8 @@ async function generateTemplate(data) {
targetRow.getCell(5).value = '';
targetRow.getCell(6).value = '';
targetRow.getCell(7).value = '';
targetRow.getCell(8).value = numberFormatter(ci.addtional.fee, 2);
targetRow.getCell(8).value = '';
targetRow.getCell(9).value = numberFormatter(ci.addtional.fee, 2);
});
}
if (ci.reserve) {
@ -1235,11 +1258,23 @@ async function generateTemplate(data) {
targetRow.getCell(2).value = ci.reserve.code;
targetRow.getCell(3).value = ci.reserve.name;
let tmpArr = [];
if (ci.reserve.m0) tmpArr.push(`按基本、可选工作小计与附加工作小计之和的${ci.reserve.m0.coe}计得${ci.reserve.m0.fee}`);
if (ci.reserve.m4) tmpArr.push(`按工时法计得${ci.reserve.m4.fee}`);
if (ci.reserve.m5) tmpArr.push(`按数量单价计得${ci.reserve.m5.fee}`);
if (ci.reserve.m0) {
tmpArr.push(`按基本工作、可选工作与附加工作确认预算之和的${ci.reserve.m0.coe}%计得${ci.reserve.m0.fee}`);
allMethods.add(0);
allReserveMethods[0].cid.push(index);
allReserveMethods[0].coe.push(ci.reserve.m0.coe);
allReserveMethods[0].coeSet.add(ci.reserve.m0.coe);
}
if (ci.reserve.m4) {
tmpArr.push(`按工时法计得${ci.reserve.m4.fee}`);
allReserveMethods[4].push(index);
}
if (ci.reserve.m5) {
tmpArr.push(`按数量单价计得${ci.reserve.m5.fee}`);
allReserveMethods[5].push(index);
}
targetRow.getCell(4).value = tmpArr.join(';');
targetRow.getCell(8).value = numberFormatter(ci.reserve.fee, 2);
targetRow.getCell(9).value = numberFormatter(ci.reserve.fee, 2);
});
if (ci.reserve.m4) {
cusInsertRowFunc(4 + num_4, [sheet_4.getRow(4)], sheet_4, (targetRow) => {
@ -1307,8 +1342,8 @@ async function generateTemplate(data) {
sheet_1.spliceRows(3, 1);
sheet_1.getRow(ci.services.length + endRows + 3).getCell(1).value = ci.services.length + endRows + 1;
sheet_1.getRow(ci.services.length + endRows + 3).getCell(8).value = numberFormatter(ci.fee, 2);
sheet_1.mergeCells(2 + ci.services.length + endRows + 2, 2, 2 + ci.services.length + endRows + 2, 8);
sheet_1.getRow(ci.services.length + endRows + 3).getCell(9).value = numberFormatter(ci.fee, 2);
sheet_1.mergeCells(2 + ci.services.length + endRows + 2, 2, 2 + ci.services.length + endRows + 2, 9);
sheet_1.getRow(2 + ci.services.length + endRows + 2).height = 100;
sheet_1.getRow(2 + ci.services.length + endRows + 2).getCell(2).border.right = { style: 'thin' };
@ -1353,7 +1388,7 @@ async function generateTemplate(data) {
}
for (let i = 1; i <= endRows; i++) {
sheet_1.mergeCells(ci.services.length + 3 + i, 4, ci.services.length + 3 + i, 7);
sheet_1.mergeCells(ci.services.length + 3 + i, 4, ci.services.length + 3 + i, 8);
if (sheet_1.getRow(ci.services.length + 3 + i).getCell(4).style.alignment) {
sheet_1.getRow(ci.services.length + 3 + i).getCell(4).style.alignment.horizontal = 'center';
sheet_1.getRow(ci.services.length + 3 + i).getCell(4).style.alignment.wrapText = true;
@ -1759,8 +1794,6 @@ async function generateTemplate(data) {
}
});
window.workbook = workbook;
// 更新编制说明
const canvas = document.createElement("canvas");
const ctx = canvas.getContext("2d");
@ -1782,7 +1815,22 @@ async function generateTemplate(data) {
});
}
}
descRowNum += 3;
descRowNum += 2;
if (data.overview?.length) {
let overviewArr = paragraphLineBreakFor1112(' (一)' + data.overview + (/。$/.test(data.overview) ? '' : '。'), ctx);
descSheet.getRow(descRowNum).getCell(1).value = overviewArr[0];
descRowNum++;
if (overviewArr.length > 1) {
for (let i = 1; i < overviewArr.length; i++) {
cusInsertRowFunc(descRowNum, [descSheet.getRow(descRowNum - 1)], descSheet, (targetRow) => {
descRowNum++;
targetRow.getCell(1).value = overviewArr[i];
});
}
}
} else {
descRowNum++;
}
if (data.scale?.length) {
let engCosts = data.scale.filter(f => f.major > 6 && majorList[f.major].hasCost);
if (engCosts.length) {
@ -1864,7 +1912,7 @@ async function generateTemplate(data) {
} else {
let majorTexts = [];
let hasOther = false;
allServiceMajors.forEach(mid => {
[...allServiceMajors].sort((a, b) => majorList[a].order - majorList[b].order).forEach(mid => {
if (mid > 6) {
majorTexts.push(majorList[mid].name);
} else {
@ -1886,8 +1934,227 @@ async function generateTemplate(data) {
}
} else {
descSheet.getRow(descRowNum).getCell(1).value = descSheet.getRow(descRowNum).getCell(1).value + '×××××。';
descRowNum++;
}
if (data.contracts.length == 1) {
// 合同段划分
descSheet.spliceRows(descRowNum, 1);
// 咨询服务类型
let serviceText = ' (二)咨询服务类型:' + data.contracts[0].services.slice(0, -1).map(si => serviceList[si.id].name).join('、') + (data.contracts[0].services.length > 1 ? '和' : '') + serviceList[data.contracts[0].services.slice(-1)[0].id].name + '。';
let serviceTextArr = paragraphLineBreakFor1112(serviceText, ctx);
serviceTextArr.forEach(ti => {
cusInsertRowFunc(descRowNum, [descSheet.getRow(descRowNum - 1)], descSheet, (targetRow) => {
descRowNum++;
targetRow.getCell(1).value = ti;
});
});
// 工作内容及要求
descRowNum++;
} else {
descSheet.getRow(descRowNum).getCell(1).value = descSheet.getRow(descRowNum).getCell(1).value.replace(/×××/g, data.contracts.length);
let descRowNum1 = descRowNum + 1;
let descRowNum2 = descRowNum + 2;
let descRowNum3 = descRowNum + 2;
data.contracts.forEach((ci, cindex) => {
descRowNum3 = descRowNum3 - descRowNum2;
descRowNum2 = descRowNum2 - descRowNum1 - 1;
// 合同段划分
let ciMajorText = ` ${cindex + 1}.${ci.name}`;
if (ci.allServiceMajors.size > 0) {
if (ci.allServiceMajors.has(7) || ci.allServiceMajors.has(18) || ci.allServiceMajors.has(28)) {
ciMajorText = ciMajorText + '全部工程及费用。';
} else {
let ciMajorTexts = [];
let hasOther = false;
[...ci.allServiceMajors].sort((a, b) => majorList[a].order - majorList[b].order).forEach(mid => {
if (mid > 6) {
ciMajorTexts.push(majorList[mid].name);
} else {
hasOther = true;
}
});
ciMajorText = ciMajorText + ciMajorTexts.join('、') + (hasOther ? '及其他专项工程。' : '。');
}
} else {
ciMajorText = ciMajorText + '×××××。';
}
let majorTextArr = paragraphLineBreakFor1112(ciMajorText, ctx);
majorTextArr.forEach(ti => {
cusInsertRowFunc(descRowNum1, [descSheet.getRow(descRowNum1 - 1)], descSheet, (targetRow) => {
descRowNum1++;
targetRow.getCell(1).value = ti;
});
});
// 咨询服务类型
descRowNum2 = descRowNum1 + descRowNum2 + 1;
let ciServiceText = ` ${cindex + 1}.${ci.name}` + ci.services.slice(0, -1).map(si => serviceList[si.id].name).join('、') + (ci.services.length > 1 ? '和' : '') + serviceList[ci.services.slice(-1)[0].id].name + '。';
let ciServiceTextArr = paragraphLineBreakFor1112(ciServiceText, ctx);
ciServiceTextArr.forEach(ti => {
cusInsertRowFunc(descRowNum2, [descSheet.getRow(descRowNum2 - 1)], descSheet, (targetRow) => {
descRowNum2++;
targetRow.getCell(1).value = ti;
});
});
// 工作内容及要求
descRowNum3 = descRowNum2 + descRowNum3;
let ciTastNum = 1;
let ciTaskTitle = ` ${ArabicToChinese(cindex + 4)}${ci.name}工作内容及要求`;
let ciTaskTitleArr = paragraphLineBreakFor1112(ciTaskTitle, ctx);
ciTaskTitleArr.forEach(ti => {
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
descRowNum3++;
targetRow.getCell(1).value = ti;
});
});
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
descRowNum3++;
targetRow.getCell(1).value = ` 1.工作内容包括:`;
});
if (ci.hasPreTexts) {
prefixTexts.forEach(ti => {
let texts = paragraphLineBreakFor1112(` ${ciTastNum}${ti}`, ctx);
texts.forEach(ti => {
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
descRowNum3++;
targetRow.getCell(1).value = ti;
ciTastNum++;
});
});
});
}
ci.services.forEach((si, sindex) => {
let siTextArr = paragraphLineBreakFor1112(` ${ciTastNum}${si.process == 1 ? '审核' : '编制'}${serviceList[si.id].name},具体工作内容包括:`, ctx);
siTextArr.forEach(ti => {
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
descRowNum3++;
targetRow.getCell(1).value = ti;
ciTastNum++;
});
});
si.tasks?.forEach((sti, stindex) => {
let stiTextArr = paragraphLineBreakFor1112(` ${stindex + 1}${sti}`, ctx);
stiTextArr.forEach(ti => {
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
descRowNum3++;
targetRow.getCell(1).value = ti;
});
});
});
});
if (ci.addtional && ci.addtional.det.length) {
ci.addtional.det.forEach(ai => {
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
descRowNum3++;
targetRow.getCell(1).value = ` ${ciTastNum}${ai.id == 1 ? '负责协调工作,具体工作内容包括:' : '其他附加工作,具体工作内容包括:'}`;
ciTastNum++;
});
ai.tasks?.forEach((ati, atindex) => {
let atiTextArr = paragraphLineBreakFor1112(` ${atindex + 1}${ati}`, ctx);
atiTextArr.forEach(ti => {
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
descRowNum3++;
targetRow.getCell(1).value = ti;
});
});
});
});
}
if (ci.hasSufTexts) {
suffixTexts.forEach(ti => {
let texts = paragraphLineBreakFor1112(` ${ciTastNum}${ti}`, ctx);
texts.forEach(ti => {
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
descRowNum3++;
targetRow.getCell(1).value = ti;
ciTastNum++;
});
});
});
}
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
descRowNum3++;
targetRow.getCell(1).value = ` 2.质量标准:${ci.quality || '×××'}${/$/.test(ci.quality) ? '' : '。'}`;
});
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
descRowNum3++;
targetRow.getCell(1).value = ` 3.服务工期:${ci.duration || '×××'}${/$/.test(ci.duration) ? '' : '。'}`;
});
});
descRowNum = descRowNum3;
}
descSheet.spliceRows(descRowNum, 1);
descRowNum += 3;
const methodNames = ['费率计取', '投资规模法', '用地规模法', '工作量法', '工时法', '数量单价'];
let allMethodsArr = [...allMethods].map(mid => methodNames[mid]);
let allMethodsTextArr = paragraphLineBreakFor1112(' 3.预算编制采用方法:' + allMethodsArr.slice(0, -1).join('、') + (allMethodsArr.length > 1 ? '和' : '') + allMethodsArr.slice(-1) + '。', ctx);
allMethodsTextArr.forEach(ti => {
cusInsertRowFunc(descRowNum, [descSheet.getRow(descRowNum - 1)], descSheet, (targetRow) => {
descRowNum++;
targetRow.getCell(1).value = ti;
});
});
if (allReserveMethods[0].cid.length || allReserveMethods[4].length || allReserveMethods[5].length) {
if (allReserveMethods[0].coeSet.size == 1 && allReserveMethods[4].length == 0 && allReserveMethods[5].length == 0) {
cusInsertRowFunc(descRowNum, [descSheet.getRow(descRowNum - 1)], descSheet, (targetRow) => {
descRowNum++;
targetRow.getCell(1).value = ` 4.预备费:本预算按${allReserveMethods[0].coe[0]}%费率计列预备费。`;
});
} else {
let rmta = [];
data.contracts.forEach((ci, cindex) => {
let ciTextArr = [];
if (allReserveMethods[0].cid.includes(cindex)) ciTextArr.push(`${ci.reserve.m0.coe}%费率`);
if (allReserveMethods[4].includes(cindex)) ciTextArr.push('工时法');
if (allReserveMethods[5].includes(cindex)) ciTextArr.push('数量单价');
if (ciTextArr.length) {
rmta.push(`${ci.name}${ciTextArr.join('、')}计列`)
} else {
rmta.push(`${ci.name}不计列`);
}
});
let rmtaa = paragraphLineBreakFor1112(` 4.预备费:${rmta.join('')}`, ctx);
rmtaa.forEach(ti => {
cusInsertRowFunc(descRowNum, [descSheet.getRow(descRowNum - 1)], descSheet, (targetRow) => {
descRowNum++;
targetRow.getCell(1).value = ti;
});
});
}
} else {
cusInsertRowFunc(descRowNum, [descSheet.getRow(descRowNum - 1)], descSheet, (targetRow) => {
descRowNum++;
targetRow.getCell(1).value = ' 4.预备费:本预算不计列预备费。';
});
}
descRowNum++;
let contractFeeSummaryArr = paragraphLineBreakFor1112(` 本项目造价咨询服务总预算为${Number(data.fee).toLocaleString()}元。其中,${contractFeeSummary.join('')}。计算过程详见相关计算表格。`, ctx);
descSheet.getRow(descRowNum).getCell(1).value = contractFeeSummaryArr[0];
descRowNum++;
if (contractFeeSummaryArr.length > 1) {
for (let i = 1; i < contractFeeSummaryArr.length; i++) {
cusInsertRowFunc(descRowNum, [descSheet.getRow(descRowNum - 1)], descSheet, (targetRow) => {
descRowNum++;
targetRow.getCell(1).value = contractFeeSummaryArr[i];
});
}
}
if (data.desc) {
descRowNum++;
let otherDesc = paragraphLineBreakFor1112(` ${data.desc}${/$/.test(ci.duration) ? '' : '。'}`, ctx);
descSheet.getRow(descRowNum).getCell(1).value = otherDesc[0];
descRowNum++;
if (otherDesc.length > 1) {
for (let i = 1; i < otherDesc.length; i++) {
cusInsertRowFunc(descRowNum, [descSheet.getRow(descRowNum - 1)], descSheet, (targetRow) => {
descRowNum++;
targetRow.getCell(1).value = otherDesc[i];
});
}
}
} else {
descSheet.spliceRows(descRowNum, 2);
}
window.workbook = workbook;
return workbook;
} catch (error) {
console.log(error)
@ -2096,4 +2363,31 @@ function cloneCellValue(value) {
return JSON.parse(JSON.stringify(value));
}
return value;
}
function ArabicToChinese(Arabic_numerals) {
let strI = String(Arabic_numerals);
let mixNumerals = "";
let positionArr = ["", "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千", "万", "十", "百", "千", "亿"];
for (let j = 1; j <= strI.length; j++) {
let poistion = (strI.slice(-j)[0] == 0 && positionArr[j - 1] !== "万" && positionArr[j - 1] !== "亿") ? "" : positionArr[j - 1];
let strIJ = (strI.slice(-j)[0] == 0 && (positionArr[j - 1] == "万" || positionArr[j - 1] == "亿")) ? "" : strI.slice(-j)[0];
mixNumerals = strIJ + poistion + mixNumerals;
}
for (let j = Math.floor((strI.length - 1) / 4); j >= 1; j--) {
if (j % 2 !== 0) {
let regExp1 = new RegExp(`000+${positionArr[j * 4]}`, "g");
mixNumerals = mixNumerals.replaceAll(regExp1, "");
}
let regExp2 = new RegExp(`0+${positionArr[j * 4]}`, "g");
mixNumerals = mixNumerals.replaceAll(regExp2, `${positionArr[j * 4]}0`);
}
mixNumerals = mixNumerals.replaceAll(/00+/g, "0");
mixNumerals = mixNumerals.replace(/^1十/, "十");
mixNumerals = mixNumerals.replace(/0+$/, "");
mixNumerals = mixNumerals.replace(/[0-9]/g, match => {
const chineseNumerals = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"];
return chineseNumerals[parseInt(match)];
});
return mixNumerals;
}