|
1С+OpenOffice. Ускорение записи в ячейку | ☑ | ||
---|---|---|---|---|
0
IdoL2k
07.11.17
✎
15:24
|
Есть обработка, которая заполняет шаблон в виде табличного документа определенными данными. Запись данных в ячейку выполняется с помощью методов SetString() и SetValue().
Document = Desktop.LoadComponentFromURL(УРЛ, "_blank", 0, Args); Sheets = Document.getSheets(); Sheet = Sheets.getByIndex(0); Для ш=1 из ТаблицаРезультата.Колонки Цикл Cell = Sheet.getCellByPosition(ш,0); Cell.setString("Колонка "+ш); КонецЦикла; В пустом шаблоне обработка работает достаточно быстро. Но если шаблон представляет из себя книгу, в которой имеются достаточно "тяжелые" листы, то выполнение метода SetString() начинает отнимать много времени и обработка начинает адово тормозить. Такое ощущение, что при заполнении значения выполняется пересчет значений в других ячейках, несмотря на то, что они не связаны с заполняемыми. Пробовал отключить в настройках офиса автообновление данных - Сервис / Содержимое ячейки / Вычислять автоматически - ускорения нет. Попробовал добавить отключение автообновления перед заполнением шаблона: Document.lockControllers(); Document.addActionLock(); Document.enableAutomaticCalculation(False); ...заполнение шаблона... Document.enableAutomaticCalculation(True); Document.calculateAll(); Document.removeActionLock(); Document.unlockControllers(); Результат нулевой. Как еще можно оптимизировать заполнение ячеек в табличном документе? Или избежать тормозов при заполнении сложных документов можно только при использовании "пакетной" записи с помощью COMSafeArray? |
|||
1
mingw
07.11.17
✎
15:31
|
Внутри "args" есть "'Hidden', not Visible"?
|
|||
2
IdoL2k
07.11.17
✎
15:33
|
(1) Инициализация документа выгляждит следующим образом
Попытка ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager"); Исключение Предупреждение(ОписаниеОшибки() + Символы.ПС + "программа OpenOffice не установлена на данном компьютере!"); Возврат; КонецПопытки; Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop"); Свойства = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue"); Свойства.Name = "AsTemplate"; Свойства.Value = Истина; Args = Новый COMSafeArray("VT_VARIANT", 3); Args.SetValue(0, Свойства); Свойства1 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue"); Свойства1.Name = "Hidden"; Свойства1.Value = Истина; Args.SetValue(1, Свойства1); УРЛ = ПривестиФайлКУРЛ(ShablonOO); Document = Desktop.LoadComponentFromURL(УРЛ, "_blank", 0, Args); |
|||
3
IdoL2k
07.11.17
✎
15:34
|
(1) Значение свойства Hidden - Истина
|
|||
4
mingw
07.11.17
✎
15:41
|
(3) Да понял
Выкинуть ActiveX|COM (писать сразу xlsx/ods чем другим) или комп шустрее |
|||
5
IdoL2k
07.11.17
✎
15:45
|
(4) Какие есть альтернативные методы записи в ods? Где то можно пример глянуть?
|
|||
6
vvp91
07.11.17
✎
16:00
|
(5) ТабличныйДокумент.Записать("МойФайл.ods", ТипФайлаТабличногоДокумента.ODS);
|
|||
7
IdoL2k
07.11.17
✎
16:36
|
(6) просто сформировать табличный документ в 1С - не вариант. Шаблон представляет из себя достаточно сложную книгу с нарядными листами, формулами, расчетами.
Решением задачи по ускорению я вижу отключение расчетов при каждом изменении ячейки, выполнение расчетов только после заполнения всех ячеек. Хотя, возможно, я ошибаюсь и долгая запись данных в ячейку связана с чем то другим, а не с пересчетом всей книги... |
|||
8
mingw
07.11.17
✎
16:38
|
(7) Шаблон = формулы?
Загрузить/прочитать в 1С - выполнить формулы в 1С - записать готовое. Убери Ёкселя из уравнения - легче жить! |
|||
9
Сияющий в темноте
07.11.17
✎
20:34
|
если сложная книга с картинками,то учиться работать с пдф,так как опен немного странноват для этого
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |