Psyduck - 可達鴨 之 鴨力山大 v0.1
Current File : /home/irplbiz/node_application/icl_calc/routes/calculateV2.js |
const XLSX = require('xlsx');
const XlsxPopulate = require('xlsx-calc');
const path = require('path');
const fs = require('fs');
const express = require('express');
const router = express.Router();
const filePath = path.join(__dirname, '../excel/ICL_Calculator.xlsx');
const outputPath = path.join(__dirname, '../excel/ICL_Calculator_UPDATED.xlsx');
// Load workbook
const workbook = XLSX.readFile(filePath, { cellFormula: true });
// Get worksheet
const sheet = workbook.Sheets['Final Sheet'];
// Write data to specific cells
function setCell(cell, value) {
sheet[cell] = { t: typeof value === 'number' ? 'n' : 's', v: value };
}
function updateSheet({
beltDesignation,
beltWidth,
rollLengthFeet,
rollLengthMeters,
topCover,
bottomCover
}) {
let finalRollLength = rollLengthFeet || (rollLengthMeters ? rollLengthMeters / 0.3048 : 0);
// Assuming A4, B4, C4, F4, G4 as target cells for row 4
setCell('A4', parseInt(beltDesignation) || 0);
setCell('B4', parseInt(beltWidth) || 0);
setCell('C4', parseInt(finalRollLength) || 0);
setCell('F4', parseFloat(topCover) || 0);
setCell('G4', parseFloat(bottomCover) || 0);
}
// Add TRUNC support
XlsxPopulate.set_fx('TRUNC', (args) => {
const number = args[0];
const precision = args[1] ?? 0;
const factor = Math.pow(10, precision);
return Math.trunc(number * factor) / factor;
})
// Save updated workbook
XlsxPopulate.set_fx('INT', (args) => {
const number = args[0];
//if (isNaN(number)) return 0;
return Math.floor(number);
});
XlsxPopulate.set_fx('ROUNDUP', (args) => {
const number = Number(args[0]);
const digits = Number(args[1]) || 0;
if (isNaN(number)) return 0; // fallback to avoid NaN
const factor = Math.pow(10, digits);
return Math.ceil(number * factor) / factor;
});
router.post('/', async (req, res) => {
try {
const {
beltDesignation,
beltWidth,
rollLengthFeet,
rollLengthMeters,
topCover,
bottomCover
} = req.body;
console.log({
beltDesignation,
beltWidth,
rollLengthFeet,
rollLengthMeters,
topCover,
bottomCover
} );
await updateSheet({
beltDesignation ,
beltWidth ,
rollLengthFeet ,
rollLengthMeters,
topCover ,
bottomCover
})
// Calculate formulas
XlsxPopulate(workbook);
// Read calculated values from AE4 and AN4
const rollsPer20ftContainer = sheet['AE4']?.w;
const rollsPer40ftContainer = sheet['AN4']?.w;
console.log(sheet['AE4']);
XLSX.writeFile(workbook, outputPath);
return res.json({
rollsPer20ftContainer,
rollsPer40ftContainer
});
} catch (err) {
console.error(err);
res.status(500).json({ error: 'Calculation failed.' });
}
});
module.exports = router;