В 1С любой файл Excel можно загрузить с помощью ПостроителяЗапросов. Что весьма удобно и не нужен Excel на сервере.
Функция ПрочитатьЕксель(ПутьКФайлу) Экспорт
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
ПЗ = Новый ПостроительЗапроса;
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());
ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
ПЗ.ЗаполнитьНастройки();
Попытка
ПЗ.Выполнить();
Возврат ПЗ.Результат.Выгрузить();
Исключение
Возврат Новый ТаблицаЗначений;
КонецПопытки;
КонецФункции
Но что будет, если у таблицы Excel нет шапки. Получится уже не так весело.
А если для красоты перед таблицей добавили заголовок и объединили ячейки
А если первая строка в Excel вообще не была заполнена, тогда выдает ошибку: Ошибка при получении значения атрибута контекста (Результат): {(1, 1)}: Ожидается выражение "ВЫБРАТЬ"
Еще возникала ошибка по причине: Ошибка при выполнении файловой операции . Формат файла не поддерживается.
Вывод, ПостроителемЗапросов хорошо загружать в 1с правильные файлы Excel. Но мне на почту могут прийти разные файлы и поэтому я написал программу на Python, чтобы нормализировать файлы Excel.
import openpyxl
import pyexcel
import sys
import os
import copy
def main():
if len(sys.argv) < 2:
print("Не переданы параметры. excelAddFirstRow.exe <путь к файлу обязательный> <количество колонок обязательный> <Имя листа необязательный> (excelAddFirstRow.exe d:/1.xls 20 Лист1)")
return
param1 = sys.argv[1].upper()
param2 = int(sys.argv[2])+1
param3 = ''
if len(sys.argv) == 4:
param3 = sys.argv[3]
if param1.find('.XLSX') == -1 and param1.find('.XLS')== -1:
print("Параметр должен содержать расширение .XLSX,.XLS")
return
if not os.path.isfile(param1):
print("Файл не существует")
return
if param1.find('.XLSX') == -1:
# Загрузите файл .xls
data = pyexcel.get_records(file_name=param1)
param1 += '.XLSX'
# Создайте новый файл .xlsx и сохраните данные в него
pyexcel.save_as(records=data, dest_file_name=param1)
# Открываем файл xlsx
workbook = openpyxl.load_workbook(param1)
if not param3:
# Выбираем активный лист
sheet = workbook.active
else:
try:
sheet = workbook[param3]
except:
sheet_names = workbook.sheetnames
print(param3 +" - листа нет. "+ str(sheet_names))
return
if param1.find('.XLS.XLSX') == -1:
# Создание копии множества объединенных ячеек
merged_cells_copy = copy.copy(sheet.merged_cells.ranges)
# Перебор объединенных ячеек и их разъединение
for merged_cell_range in merged_cells_copy:
sheet.unmerge_cells(str(merged_cell_range))
# Вставляем новую строку в начало таблицы
sheet.insert_rows(1)
# Заполняем ячейки в первой строке
for i in range(1,param2):
sheet.cell(row=1, column=i).value = 'column'+str(i)
# Сохраняем изменения в файле
workbook.save(param1)
if __name__ == "__main__":
main()
После компиляция у меня получился exe-файл который принимает 3 параметра
excelAddFirstRow.exe <путь к файлу обязательный> <количество колонок обязательный> <Имя листа необязательный>
Пример:
excelAddFirstRow.exe "d:/Лист Excel.xls" 20 "Лист1"
Программа принимает файлы .XLS,.XLSX. Если передан файл .XLS, то программа конвертирует его в файл .XLSX.
В файле .XLSX будут убраны все объединения ячеек и добавлена первая строка названия колонок (количество колонок определяется 2-ым параметром)
Если 3-ий параметр не указан открывается активный лист.
Программу на Python в 1с можно добавил в макет, как двоичные данные.
В 1с получаю макет, сохраняю файл exe на диск и запускаю программу.
Функция ЗаполнитьПервуюСтрокуВФайлеЕксел(ПолноеИмяФайла) Экспорт
ТекОбъект = РеквизитФормыВЗначение("Объект");
КаталогВременныхФайлов = КаталогВременныхФайлов();
Файл = Новый Файл(КаталогВременныхФайлов + "excelAddFirstRow.exe");
Если Не Файл.Существует() Тогда
МакетУтилиты = ТекОбъект.ПолучитьМакет("ExcelAddFirstRow");
Адрес = ПоместитьВоВременноеХранилище(МакетУтилиты, Новый УникальныйИдентификатор);
ФайлУтилиты1 = КаталогВременныхФайлов + "excelAddFirstRow.exe";
ДанныеХранилища = ПолучитьИзВременногоХранилища(Адрес);
УдалитьИзВременногоХранилища(Адрес);
ДанныеХранилища.Записать(ФайлУтилиты1);
КонецЕсли;
Команд = КаталогВременныхФайлов+"excelAddFirstRow.exe """ + ПолноеИмяФайла + """ 20";
ЗапуститьПриложение(Команд,,Истина);
Если СтрНайти(ВРег(ПолноеИмяФайла), ".XLSX") = 0 Тогда
ПолноеИмяФайла = ПолноеИмяФайла+".XLSX";
КонецЕсли;
Возврат ПолноеИмяФайла;
КонецФункции
Повторим опыт загрузки с использованием функции ЗаполнитьПервуюСтрокуВФайлеЕксел() перед тем как читать ПостроителемЗапросов
Excel без шапки:
Excel с объединением ячейки:
Excel с пустой первой строкой:
Для тестирования написал обработку:
Тестировал:
- 1С:Комплексная автоматизация 2 (2.4.13.209)
- Платформа 1С:Предприятие 8.3 (8.3.19.1467)