Некоторые клиенты присылают свои заказы в формате OpenOffice, а т.к. мы используем MS Office, мне приходилось конвертировать файл в установленном на моём компе OpenOffice.
А не так давно переписывал обработку заказов от клиентов и использовал обработку прямого чтения файлов Excel 2007 производства достопочтенного Dushelov, покурив файл OpenOffice решил попробовать переделать обработку под формат OpenOffice. Вот предлагаю общественности результат трудов.
Принцип работы:
Так как формат близок к формату Excel 2007, что значит обычные XML’ки в ZIP-архиве, то извлекаем во временную папку этот файл, берём нужный файл и обрабатываем как обычный XML-файл. Никаких COM-объектов, никаких внешних модулей, всё обрабатывается встроенными средствами 1С 8.1. Работает и под сервером 1С! Не требуется установленный OpenOffice!
Разрешение споров и конфликтов:
Если кто-то уже такое сделал (а я не нашёл), то уступаю ему лавры и поставлю вашу ссылку.
Обработка не претендует на: уникальность, чёткость кода, отсутствие методов «индийского программирования» и пр. Критику я выслушаю и учту. Если попадутся файлы, которые обработка не может обработать, выкладывайте в комментариях.
Обработка Excel 2007 тов. Dushelov: //infostart.ru/public/19139/
Заранее спасибо!
UPDATE 1:
Переделал код вытаскивания текста из ячейки исправив тем самым баг с обрезанием строк, которые OpenOffice разбил на несколько. Ну и в целом алгоритм вытаскивания текста ячейки стал лучше. Также я добавил кучу комментариев.
Саму обработку конечно же можно улучшить, но за перенос принципа с обработки Душелова и указание исходника плюс.
(1) Буду благодарен на указание проблемных мест и методов их решения.Это вообще мой первый опыт работы с XML, так что мог сделать не особо оптимально 🙂 🙁
Так-же кому интересно, через некоторое время могу представить «комплексное» решение, чтение в зависимости от расширения файла:
xls = Немного переделанной обработкой Excel через ADO, не помню уже чей 🙁
xlsx = Прямое чтение Excel 2007 by Dushelov
ods = Прямое чтение OpenOffice
+ Хоть и не идеальное но решение поиска в какой колонке что брать для успешной обработки разнообразных вариантов заказов клиента (Неважно расположение колонок, необязательное наличие колонки Код (Но желательно), и многое прочее), которое я написал для работы т.к. нам присылают всевозможные варианты заказов (переделанные клиентами и многое другое). Скорей-всего необходимо будет её немного допилить под свои реалии. У нас обрабатывает она 99% заказов, и правильно обработанных заказов 99.9%. Но код не идеален.
Если интересно, могу выложить!
Плюсанул.
НО ИМХО название неудачное 🙁
Назови как-нибудь типа «Обработка файлов OpenOffice Calc без установленного OpenOffice»
(4) Спасибо! Переделал!
Нормально, даешь больше универсальных функция чтения данных 🙂
Скорее наоборот))) Формат MS близок к OOo.
(7) Согласен, но т.к. речь о нём шла от обработки Excel 2007, то написал так 🙂
(6) Даешь универсальную ВК для чтения данных MSExcel, OO Calc, а также SuperCalc 😉
(9) ВК не самый лучший вариант, лучше максимально встроенными средствами 1С + максимум COM объекты, чтоб не обламывался народ желающий заюзать под сервером 1С (8.х)….. а про SuperCalc я вообще не вкурсе 🙂 Если хранит данные в XML можете переделать обработку и под него 🙂
(10) SuperCalc это типа шутка 🙂
я к тому, что универсальную для всех и вся.
(11) 😀
Спасибо тебе.
(13) Да не за что! Пользуйтесь на здоровье!
Ado выкинул после первой же пробы. на файле, который эксель показывает нормально — ado возвращал 4900 строк из 10 тыс…
(15) Странно, у меня, на теперь уже на старой работе, были прайсы как раз порядка 10 тысяч строк, выбирало всё и даже больше.
(16) а я и не говорю, что у вас — плохо обрабатывает. у вас — хорошо, а у меня — плохо… Причем у меня на куче файлов — нормально, а на одном — плохо. Где гарантия того, что на остальных не будет плохо..? хз..
поставил минус из-за того что автор не совсем честно разбирает файл, и результат не всегда соответствует ожидаемому,
в описание нужно добавить что случай многострочного объединения ячейки не учитывается.
С объединением ячеек совсем плохо…
А между тем, минимальные изменения в тексте функции ОбработатьФайлOpenOffice помогают справиться с этой проблемой!
Было (стр.48):
ИначеЕсли хмл.Имя = «table:table-cell» Тогда //Выпал тэг ячейки
Стало :
ИначеЕсли хмл.Имя = «table:table-cell» ИЛИ хмл.Имя =»table:covered-table-cell» Тогда //Выпал тэг ячейки
а также после стр. 60 :
Если Не ПустаяСтрока(СокрЛП(НенужнаяЯчейка)) Тогда
добавить строки :
Колонка = Колонка + Число(НенужнаяЯчейка)-1;
Для к = ТЗ.Колонки.Количество() По Колонка-1 Цикл ТЗ.Колонки.Добавить(«F» + (ТЗ.Колонки.Количество()+1)); КонецЦикла;
Небольшая проблемка…. при загрузке происходит смещение ячеек в строке, если перед ней была пустая ячейка.
Например:
1 2 3
4 [пустая]6
Получаем:
1 2 3
4 6
Как это исправить?
В хозяйстве сгодится. Далеко не у всех стоит MS Office, да и Open Office тоже не всегда. А тут можно вывернуться
Плюс поставил. Дешево и сердито. Но есть один минус — читает только первый лист.
1 2 3
4 [пустая]6
Получаем:
1 2 3
4 6
Александр не подскажите как это исправить?