UNPKG

node-format-converter

Version:

Universal file format conversion service for Node.js

75 lines (64 loc) 2.47 kB
const fs = require('fs-extra'); const path = require('path'); const XLSX = require('xlsx'); const csv = require('csv-parser'); const { generatePaths } = require('../utils/fileHelper'); /** * Convert between Excel and CSV formats * @param {Object} file - Uploaded file object or file path * @param {String} targetFormat - Target format (xlsx, csv) * @param {Object} options - Conversion options * @returns {Promise<Object>} Result with output path and filename */ const convertExcel = async (file, targetFormat, options = {}) => { // Generate paths const { uploadPath, outputPath, outputFilename } = generatePaths(file, targetFormat, options); // Parse options const parsedOptions = typeof options === 'string' ? JSON.parse(options) : options; // Set default options const { sheetName = 'Sheet1', delimiter = ',' } = parsedOptions; const sourceExt = path.extname(file.originalname || uploadPath).toLowerCase(); const targetExt = `.${targetFormat.toLowerCase()}`; try { // Excel to CSV if ((sourceExt === '.xlsx' || sourceExt === '.xls') && targetExt === '.csv') { const workbook = XLSX.readFile(uploadPath); const sheet = workbook.Sheets[workbook.SheetNames[0]]; const csvContent = XLSX.utils.sheet_to_csv(sheet, { FS: delimiter }); await fs.writeFile(outputPath, csvContent, 'utf8'); } // CSV to Excel else if (sourceExt === '.csv' && (targetExt === '.xlsx' || targetExt === '.xls')) { const rows = []; // Read CSV file and parse rows await new Promise((resolve, reject) => { fs.createReadStream(uploadPath) .pipe(csv({ separator: delimiter })) .on('data', (row) => rows.push(row)) .on('end', resolve) .on('error', reject); }); // Create workbook and worksheet const workbook = XLSX.utils.book_new(); const worksheet = XLSX.utils.json_to_sheet(rows); XLSX.utils.book_append_sheet(workbook, worksheet, sheetName); // Write Excel file XLSX.writeFile(workbook, outputPath); } else { throw new Error('Unsupported conversion format'); } return { outputPath, outputFilename, success: true }; } catch (error) { throw new Error(`Excel/CSV conversion failed: ${error.message}`); } }; module.exports = { convertExcel };