Имя: Пароль:
1C
1С v8
1C 8 3 УПП Как прочитать формат ячейки при загрузке файла эксель?
, ,
0 Nysha1210
 
03.04.19
22:53
Добрый день. Читаю файл *.xls при помощи процедуры:

       //OpenOffice Calc//////////////////////////////////////////////////////////////////////////////////////////////
       Попытка
                ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
       Исключение
                Предупреждение(ОписаниеОшибки() + Символы.ПС + "программа OpenOffice\LibreOffice не установлена на данном компьютере!");
       Возврат Неопределено;
       КонецПопытки;
       Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
       Свойства = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
       Свойства.Name = "AsTemplate";
       Свойства.Value = Истина;
       Args = Новый COMSafeArray("VT_VARIANT", 2);
       Args.SetValue(0, Свойства);
       Свойства1 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
       Свойства1.Name = "Hidden";
       Свойства1.Value = Истина;
       Args.SetValue(1,Свойства1);
       Document = Desktop.LoadComponentFromURL(ПривестиФайлКУРЛ(ПутьКФайлу), "_blank", 0, Args);
       Sheets = Document.getSheets();
       Sheet = Sheets.getByIndex(текЛист-1);
       локТабЗнач = Новый ТаблицаЗначений;
       begCol = 0;
       begRow = 0;
       endCol = Sheet.Data.GetLength(6) - 1;
       endRow = Sheet.Data.GetLength() - 1;
       нКол = 0;
       локТабЗнач.Колонки.Очистить();

       КС = Новый КвалификаторыСтроки(50);
       Массив = Новый Массив;
       Массив.Добавить(Тип("Строка"));

       ОписаниеТиповСтрока = Новый ОписаниеТипов(Массив, , КС);

       Пока нКол <= endCol Цикл
            ИмяКол = "К"+Строка(нкол+1);
            локТабЗнач.Колонки.Добавить(ИмяКол,ОписаниеТиповСтрока);
            нКол = нКол + 1;
       КонецЦикла;
       Range = Sheet.getCellRangeByPosition(begCol, begRow, endCol, endRow);
       МассивКом = Новый COMSafeArray("VT_VARIANT", Range.Columns.Count, Range.Rows.Count);
       МассивКом = Range.getDataArray();
       тмпПростойМассив = МассивКом.Выгрузить();
       Для каждого массив из тмпПростойМассив Цикл
             ит = 0;
             НовСтрока = локТабЗНач.Добавить();
             Для каждого ЭлементМассива из массив цикл
                   НовСтрока[ит] = ЭлементМассива;
                   ит = ит + 1;
             КонецЦикла;
       КонецЦикла;
       Возврат локТабЗнач;
Всё считывает. Но есть некоторые ячейки, которые в 1 столбике имеют "100 грн." или "100 евро." Например. как изменить обработку так, что бы можно было считывать формат каждой ячейки и получать цену с "грн"/"евро" в итоге, так как чейчас считывается только 100.
Сразу скажу. Вынужденно считываю файл именно так, так как сисадмин не хочет категорически устанавливать Эксель.
Спасибо.
1 palsergeich
 
03.04.19
22:55
Еще можно попробовать упороться и прочитать Excel как xml.
В УХ есть обработка которая так делает
2 palsergeich
 
03.04.19
22:56
3 Nysha1210
 
03.04.19
22:56
Можете дать ссылку? Такая обработка считает формат ячейки?
4 Nysha1210
 
03.04.19
22:58
У меня в файле даты в формате Денежный. Эта обработка такой тип данных считает как число.
5 Nysha1210
 
03.04.19
22:58
Упс, цены в денежном формате.
6 palsergeich
 
03.04.19
22:59
Допилку ннапильником никто не отменял.
точки входа есть, идея есть, дальше - самостоятельно.
7 Nysha1210
 
03.04.19
23:04
Спасибо. На том сайте я уже была. Обработку на почту так и не прислали ((((
8 palsergeich
 
03.04.19
23:07
http://catalog.mista.ru/public/300092/ Вот еще идея.
А зачем обработка? там весь код в статье, просто копируешь в свою, добавляешь реквизит при необходимости и все
9 palsergeich
 
03.04.19
23:08
Весь код из статьи в модуль формы обработки, 1 реквизит и 1 кнопку уж сообразить как добавить - не думаю что сверх задача
10 palsergeich
 
03.04.19
23:09
А даже реквизитов не надо, надо только процедуру ПриОткрытии связать с событием формы
11 Nysha1210
 
03.04.19
23:11
Спасибо. Туплю. Просто сижу разбиаю код, но как определить денежный формат ячейки ну хоть убей не пойму((( Как строку?
12 palsergeich
 
03.04.19
23:13
Начни с малого.
Сделай 3 ячейки с разными форматами.
Там есть определение формата ячейки и номер ее.
И посмотри что в каком случае.
13 Nysha1210
 
03.04.19
23:16
Ок. Как вариант. Просто сейчас вся разработка ведётся локально на компе, а потом уже будем переносить на сервер для всех. Вот сижу - разбираю код.
Спасибо
14 palsergeich
 
03.04.19
23:17
(13) Тем и хорош метод чтения через платформенные механизмы XML или DOM - Ты не зависишь от окружения.
15 palsergeich
 
03.04.19
23:17
А вот с отлаженной дома обработкой через COM - на работе может быть сюрприз)
16 Nysha1210
 
03.04.19
23:23
НЕ заметила. Этот метод работает для файлов *.xlsx, а у меня *.xls. Поэтому перешла по ссылке на http://catalog.mista.ru/public/120961/. Тут программного кода нет, только скачать обработку можно.
17 palsergeich
 
03.04.19
23:26
(16) с xls - будут проблемы.
18 palsergeich
 
03.04.19
23:27
подключение по ADO ипортирует данные, но ничего не знает о формате...
19 Nysha1210
 
03.04.19
23:31
http://catalog.mista.ru/public/163642/ тут можно вроде словить денежный формат. Через либереофис.
20 palsergeich
 
03.04.19
23:33
Глупый вопрос, а есть гарантии, что админ захочет поставить Libre?
21 Nysha1210
 
03.04.19
23:34
У нас у всех он уже стоит))))
22 Nysha1210
 
03.04.19
23:35
Админ принципиально его всем ставит. Ну не любит от Эксель. Сказал - выкручивайся сама как хочешь ((((
23 palsergeich
 
03.04.19
23:36
Ну и конвертани libre xls в xlsx
(22) Скорее лицензий нет и денег на них тоже, а подставлятся он не хочет
24 Nysha1210
 
03.04.19
23:40
Конвертировать всё время нет возможности. Прайс делают в другом месте и тянут автоматом. Так что с файлом исх ничего сделать не получается. Он вообще линукс обожает. Всё остальное для него - кошмар(((( Майкрософт тихо ненавидит. Ладно, спасибо. Часть кода у меня уже есть. Идеи как поймать формат тоже - буду пробовать разобраться с тем что с вашей помощью нашла. Спасибо, что хоть направление указали.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн