При интеграции 1С с внешними системами часто возникает необходимость программной обработки файлов электронных таблиц. Одной из типичных задач является конвертация старого формата Excel 97-2003 (.xls) в современный формат Office Open XML (.xlsx). В данной статье мы подробно разберем, как реализовать этот процесс, проанализируем различные подходы и выявим подводные камни, с которыми сталкиваются разработчики.
Традиционный метод решения задачи заключается в использовании механизма COM-автоматизации. Этот способ предполагает взаимодействие 1С с установленным в операционной системе приложением Microsoft Excel. Рассмотрим по шагам, как правильно реализовать сохранение файла в новом формате.
Для начала проанализируем ситуацию: автор вопроса пытался использовать метод SaveAs, но сталкивался с тем, что файл либо сохранялся некорректно, либо Excel сообщал о повреждении структуры. Основная причина здесь кроется в необходимости передачи числового кода формата файла. Для формата .xlsx этот код — 51.
Рассмотрим пример правильной реализации:
// Определяем пути к файлам
ПутьКСтаромуФайлу = "C:\Files\Document.xls";
// Формируем новый путь, заменяя расширение
ПутьКНовомуФайлу = Лев(ПутьКСтаромуФайлу, СтрДлина(ПутьКСтаромуФайлу) - 4) + ".xlsx";
ФайлИнфо = Новый Файл(ПутьКСтаромуФайлу);
Если ФайлИнфо.Существует() Тогда
Попытка
// Создаем COM-объект
Excel = Новый COMОбъект("Excel.Application");
Excel.Visible = Ложь;
Excel.DisplayAlerts = Ложь; // Отключаем предупреждения (например, о перезаписи)
// Открываем книгу
РабочаяКнига = Excel.Workbooks.Open(ПутьКСтаромуФайлу);
// Сохраняем в формате XLSX (код 51)
РабочаяКнига.SaveAs(ПутьКНовомуФайлу, 51);
// Закрываем книгу и приложение
РабочаяКнига.Close();
Excel.Quit();
// Очищаем переменные для освобождения памяти
РабочаяКнига = Неопределено;
Excel = Неопределено;
Исключение
Сообщить("Ошибка при работе с Excel: " + ОписаниеОшибки());
Если Excel <> Неопределено Тогда
Excel.Quit();
КонецЕсли;
КонецПопытки;
КонецЕсли;
Проанализируем важные детали этого кода:
SaveAs принимает в качестве второго аргумента константу xlOpenXMLWorkbook. Без её указания Excel может попытаться сохранить содержимое старого формата в файл с новым расширением, что приведет к ошибке "файл поврежден" при попытке открытия.Ложь позволяет избежать остановки выполнения кода, если Excel захочет задать вопрос (например, "Файл уже существует, заменить?").Excel.Quit() и обнулять переменные. Если этого не сделать, в системе будут копиться «зомби-процессы» EXCEL.EXE, которые со временем могут парализовать работу сервера.В зависимости от ваших задач, могут потребоваться и другие форматы. Рассмотрим наиболее полезные коды для метода SaveAs:
.xlsx (Стандартная книга Excel без макросов)..xlsm (Книга с поддержкой макросов VBA)..xlsb (Двоичная книга, работает быстрее с большими объемами данных)..csv (Текстовый формат с разделителями)..xls (Формат Excel 97-2003).Выясним причину, почему использование COM-объекта не всегда является оптимальным. Во-первых, он работает только на Windows. Во-вторых, требует лицензии на Microsoft Office. В-третьих, работает медленно и нестабильно при массовой обработке.
Начиная с версии 8.3, платформа 1С предоставляет мощный встроенный инструмент — ТабличныйДокумент, который умеет читать и записывать файлы Excel нативно. Рассмотрим, как выполнить конвертацию этим способом:
ПутьКСтаромуФайлу = "C:\Files\Document.xls";
ПутьКНовомуФайлу = "C:\Files\Document.xlsx";
// Создаем пустой табличный документ
ТабДок = Новый ТабличныйДокумент;
Попытка
// Читаем данные из файла XLS
ТабДок.Прочитать(ПутьКСтаромуФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
// Записываем в формате XLSX
ТабДок.Записать(ПутьКНовомуФайлу, ТипФайлаТабличногоДокумента.XLSX);
Сообщить("Конвертация успешно завершена!");
Исключение
Сообщить("Ошибка конвертации: " + ОписаниеОшибки());
КонецПопытки;
Разберем преимущества этого метода:
Однако стоит учитывать ограничение: при чтении файла через ТабличныйДокумент могут быть потеряны специфические элементы, такие как сложные макросы, сложные диаграммы или специфическое условное форматирование, которое поддерживается только "родным" Excel.
Проанализируем ситуацию и выберем подходящий инструмент:
51.Попытка...Исключение, чтобы гарантированно закрыть процесс Excel в случае критической ошибки.Таким образом, мы рассмотрели два основных пути решения задачи. Выбор конкретного метода зависит от технических требований вашей системы и сложности конвертируемых файлов.