При обработке файлов они некорректно сохраняются. При попытке открыть документ на компьютере через excel у меня возникает ошибка:
Ошибка в части содержимого в книге...Выполнить попытку восстановления?
Возможно документ как то некорректно сохраняется. Дополни мою функцию по обработке документов:
import ExcelJS from "exceljs";
import XLSX from "xlsx";
import fs from "fs";
import path from "path";
import config from "./config.js"; 
import renameMappings from "./renameMappings.js";

/**
 * Функция для безопасного создания уникального имени листа.
 * Ограничивает длину до 31 символа и добавляет суффикс, если необходимо.
 */
const generateSafeSheetName = (desiredName, existingNames) => {
    const maxLength = 31;
    let safeName = desiredName.length > maxLength ? desiredName.substring(0, maxLength) : desiredName;
    let uniqueName = safeName;
    let counter = 1;

    while (existingNames.has(uniqueName)) {
        const suffix = `_${counter}`;
        // Убедимся, что итоговая длина не превышает 31 символ
        const truncatedLength = maxLength - suffix.length;
        uniqueName = (desiredName.length > truncatedLength ? desiredName.substring(0, truncatedLength) : desiredName) + suffix;
        counter++;
    }

    existingNames.add(uniqueName);
    return uniqueName;
};

/**
 * Функция для конвертации .xls в ExcelJS workbook с динамическим названием листа
 */
const convertXlsToExcelJSWorkbook = async (inputPath, sheetName, existingNames) => {
    const workbookXLS = XLSX.readFile(inputPath);
    const sheetNamesXLS = workbookXLS.SheetNames;

    if (sheetNamesXLS.length === 0) {
        throw new Error(`Файл ${inputPath} не содержит листов.`);
    }

    const firstSheetName = sheetNamesXLS[0];
    const worksheetXLS = workbookXLS.Sheets[firstSheetName];
    const worksheetData = XLSX.utils.sheet_to_json(worksheetXLS, { header: 1 });

    const exceljsWorkbook = new ExcelJS.Workbook();
    const safeSheetName = generateSafeSheetName(sheetName, existingNames);
    const worksheet = exceljsWorkbook.addWorksheet(safeSheetName); // Название листа безопасно

    worksheetData.forEach((row, rowIndex) => {
        const newRow = worksheet.addRow(row);
        if (rowIndex === 0) {
            newRow.font = { bold: true };
        }
    });

    return exceljsWorkbook;
};

/**
 * Функция для удаления указанных столбцов
 */
const removeColumns = (worksheet, columnsToRemove) => {
    const headerRow = worksheet.getRow(1);
    const columnsToDeleteIndices = [];

    headerRow.eachCell((cell, colNumber) => {
        if (columnsToRemove.includes(cell.value)) {
            columnsToDeleteIndices.push(colNumber);
        }
    });

    columnsToDeleteIndices.sort((a, b) => b - a).forEach(colNumber => {
        worksheet.spliceColumns(colNumber, 1);
    });
};

/**
 * Функция для заливки первой строки голубым цветом
 */
const fillHeaderRow = (worksheet) => {
    const headerRow = worksheet.getRow(1);
    headerRow.eachCell((cell) => {
        cell.fill = {
            type: "pattern",
            pattern: "solid",
            fgColor: { argb: "ADD8E6" },
        };
        cell.font = { bold: true };
    });
};

/**
 * Основная функция для обработки файла
 */
const processExcelFiles = async () => {
    const pLimit = (await import("p-limit")).default; // Динамический импорт p-limit
    const limit = pLimit(config.maxConcurrentTasks); // Регулируем это число для настройки многозадачности

    const tasks = renameMappings.map(mapping =>
        limit(async () => {
            try {
                const inputFilePathXls = path.join(config.directoryPath, `${mapping.newName}.xls`);
                const inputFilePathXlsx = path.join(config.directoryPath, `${mapping.newName}.xlsx`);
                const sheetName = mapping.newName; // Желаемое название листа

                // Локальный набор для текущей рабочей книги
                const existingSheetNames = new Set();

                // Если файл в формате .xlsx существует
                if (fs.existsSync(inputFilePathXlsx)) {
                    console.log(`Работаем с файлом ${inputFilePathXlsx}`);
                    const workbook = new ExcelJS.Workbook();
                    await workbook.xlsx.readFile(inputFilePathXlsx);

                    if (workbook.worksheets.length === 0) {
                        console.error(`В файле ${inputFilePathXlsx} не найдено ни одного листа.`);
                        return;
                    }

                    // Получаем первый лист
                    const worksheet = workbook.worksheets[0];
                    const currentSheetName = worksheet.name;

                    // Логирование всех листов для отладки
                    console.log(`Найденные листы в ${inputFilePathXlsx}:`);
                    workbook.worksheets.forEach(ws => {
                        console.log(`- ${ws.name}`);
                        if (ws.name !== currentSheetName) {
                            existingSheetNames.add(ws.name);
                        }
                    });

                    // Если текущий лист не имеет желаемого имени, переименовываем его
                    if (sheetName !== currentSheetName) {
                        const safeSheetName = generateSafeSheetName(sheetName, existingSheetNames);
                        worksheet.name = safeSheetName; // Устанавливаем безопасное имя листа
                        console.log(`Переименован лист из "${currentSheetName}" в "${safeSheetName}"`);
                    } else {
                        console.log(`Лист "${currentSheetName}" уже имеет желаемое имя.`);
                    }

                    // Удаляем столбцы, если они указаны
                    if (mapping.columns && mapping.columns.length > 0) {
                        removeColumns(worksheet, mapping.columns);
                        console.log(`Удалены столбцы: ${mapping.columns.join(", ")}`);
                    }
                    
                    fillHeaderRow(worksheet);
                    console.log(`Заголовок листа "${worksheet.name}" окрашен.`);
                    await workbook.xlsx.writeFile(inputFilePathXlsx);
                    console.log(`Файл ${inputFilePathXlsx} успешно обработан.`);
                }

                // Если файл в формате .xls существует
                else if (fs.existsSync(inputFilePathXls)) {
                    console.log(`Работаем с файлом ${inputFilePathXls}`);
                    const workbook = await convertXlsToExcelJSWorkbook(inputFilePathXls, sheetName, existingSheetNames);
                    const worksheets = workbook.worksheets;

                    if (worksheets.length === 0) {
                        console.error(`В конвертированном файле из ${inputFilePathXls} не найдено ни одного листа.`);
                        return;
                    }

                    const worksheet = worksheets[0];

                    // Удаляем столбцы, если они указаны
                    if (mapping.columns && mapping.columns.length > 0) {
                        removeColumns(worksheet, mapping.columns);
                        console.log(`Удалены столбцы: ${mapping.columns.join(", ")}`);
                    }

                    fillHeaderRow(worksheet);
                    console.log(`Заголовок листа "${worksheet.name}" окрашен.`);

                    const outputFilePath = inputFilePathXls.replace(".xls", ".xlsx");
                    await workbook.xlsx.writeFile(outputFilePath);
                    console.log(`Файл сохранён как ${outputFilePath}.`);

                    // Удаляем исходный .xls файл
                    fs.unlinkSync(inputFilePathXls);
                    console.log(`Исходный файл ${inputFilePathXls} удалён.`);
                } else {
                    console.log(`Файл с именем "${mapping.newName}" не найден ни в формате .xlsx, ни в формате .xls.`);
                }
            } catch (error) {
                console.error(`Ошибка при обработке файла для "${mapping.newName}":`, error);
            }
        })
    );

    // Запуск всех задач с использованием ограниченной многозадачности
    await Promise.all(tasks);
};

// Запускаем обработку
processExcelFiles()
    .then(() => {
        console.log("Все файлы успешно обработаны.");
    })
    .catch(err => {
        console.error("Произошла ошибка во время обработки файлов:", err);
    });