Vinaora Nivo SliderVinaora Nivo SliderVinaora Nivo SliderVinaora Nivo SliderVinaora Nivo SliderVinaora Nivo SliderVinaora Nivo SliderVinaora Nivo SliderVinaora Nivo SliderVinaora Nivo SliderVinaora Nivo SliderVinaora Nivo SliderVinaora Nivo Slider
Автор: Administrator Категория: Разработка
Дата публикации Просмотров: 734
Печать

Есть ситуации, когда нет возможности установить Excel на стороне клиента, а нужно загружать в базу данные *.xls файлов. Спасением является бесплатный OpenOffice (либо LibreOffice, т.к. работа через COM с ними абсолютно одинакова).

Ниже привожу процедуры загрузки и выгрузки.

 

 

Функция ЗагрузитьТЗизФайла(ПутьКФайлу)

//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;
КонецЦикла;
КонецЦикла;
Возврат локТабЗнач;

КонецФункции

Как  видно из функции ЗагрузитьТЗизФайла - читается сразу вся область данных файла, поэтому с быстродействием все отлично. На выходе имеем готовую таблицу значений. В данном случае каждой колонке опреден тип Строка(50), но можна этого и не делать, просто это нужно если собираетесь, например, помещать ее во временную таблицу.

 

Процедура ВыгрузитьТЗвФайл(ТаблицаРезультата)

//OpenOffice Calc///////////////////////////////////////////////////////////////////////////
Попытка
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);
Document = Desktop.LoadComponentFromURL("private:factory/scalc", "_blank", 0, Args);
Sheets = Document.getSheets();
Sheet = Sheets.getByIndex(0);
мИтКол = 0;
Для каждого кол из ТаблицаРезультата.Колонки Цикл
Sheet.getCellByPosition(мИтКол,0).setString(кол.Имя);
мИтКол = мИтКол + 1;
КонецЦикла

ВсегоСтрок = ТаблицаРезультата.Количество();
ВсегоКолонок = ТаблицаРезультата.Колонки.Количество();
МассивКОМ = Новый COMSafeArray("VT_VARIANT", ВсегоСтрок,ВсегоКолонок);
иткол = 0;
итстр = 0;

Для каждого стр из ТаблицаРезультата Цикл
Для каждого кол из ТаблицаРезультата.Колонки Цикл
стрРез = СокрЛП(стр[кол.Имя]);
МассивКОМ.SetValue(итстр,иткол,стрРез);
иткол = иткол+1;
КонецЦикла;
иткол = 0;
итстр = ?(итстр=ВсегоСтрок,0,итстр+1);
КонецЦикла;
begCol = 0;
begRow = 1;
endCol = ВсегоКолонок-1;
endRow = ВсегоСтрок;
Range = Sheet.getCellRangeByPosition(begCol, begRow, endCol, endRow);
Range.setDataArray(МассивКОМ);
//Document.storeToURL(ПривестиФайлКУРЛ(ПутьКФайлу),Args);
Свойства2 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
Свойства2.Name = "FilterName";
Свойства2.Value = "MS Excel 97";
Args.SetValue(2,Свойства2);
Document.GetCurrentController().GetFrame().GetContainerWindow().SetVisible(Истина);
//Document.storeToURL(ПривестиФайлКУРЛ(ФайлКартотеки),Args);

КонецПроцедуры

Процедура ВыгрузитьТЗвФайл сохраняет любую таблицу значений в файл MS Excel. В текущем примере откроется OpenOffice/LibreOffice Calc cданными переданной таблицы значений. Если раскомментировать строки:

//Document.storeToURL(ПривестиФайлКУРЛ(ПутьКФайлу),Args);

...................................................

//Document.storeToURL(ПривестиФайлКУРЛ(ФайлКартотеки),Args);

и закомментировать

Document.GetCurrentController().GetFrame().GetContainerWindow().SetVisible(Истина);

при этом добавив Параметр ПутьКФайлу, то данные запишутся в файл без открытия Calc`a. Если обратить внимание на сохранение, то сразу бросается двойной вызов Document.storeToURL - это необходимо для корректного сохранения в формате MS Excel.

функция ПривестиФайлКУРЛ(ПутьКФайлу)

ПутьКФайлуСтрЗаменить(ПутьКФайлу," ","%20");
ПутьКФайлуСтрЗаменить(ПутьКФайлу,"\","/");
Возврат "file:/""/localhost/"ПутьКФайлу;

Конецфункции

Функция ПривестиФайлКУРЛ просто приводит путь к виду, необходимому OpenOffice/LibreOffice.

Вот и все. Как вы смогли убедиться -  работа с Calc`ом не сложнее таковой с Microsoft Excel.

 

(Информация с ресурса http://infostart.ru)

Add comment


Security code
Refresh

Последние новости

Written on 16/05/2012, 10:29 by admin
ob-otvetstvennosti-i-bezotvetstvennosti-ili-kak-opredelit-doljnostnye-obyazannosti-rabotnikovПоговорим о должностных обязанностях. Казалось бы, что тут может быть интересного?! Обязанности – они, как говорится, и в Африке обязанности. Нет ничего...
Written on 06/05/2012, 01:19 by admin
upravlenie-znaniyami-sozdanie-bazy-znanii-a-chto-na-praktikeПродолжая тему двух предыдущих постов (первый и второй), в которых проводилось исследование на тему управления знаниями и были рассказаны основные...
Written on 05/05/2012, 22:26 by admin
kak-pobedit-vorovstvo-sobstvennyh-sotrudnikovТы скажи нам, Карамзин,Как там Тверь, Калуга, Клин?И ответил Карамзин: «Да везде воруют, БЛИН!»Как вы полагаете, кто способен нанести бизнесу больший...
Written on 05/05/2012, 22:14 by admin
kak-naiti-chujoe-myloРуководство содержит описание поиска личных и корпоративных email различными методами с использованием специальных сервисов и поисковых систем....
Written on 05/05/2012, 22:10 by admin
prognozirovanie-prodaj-i-motivaciya-truda«…Конечно, можно платить и от продаж. Но лучше платить людям за то, что они делают на самом деле».   Территориальный менеджер крупной табачной...

Последние сообщения

  • linx 12.05.2012 13:49
    а как тоже самое сделать через политики в домене?

    Read more...

     
  • Super User 27.04.2012 09:03
    Вот пример как можно обработать перетаскивание из Excel: Отключаем стандартную обработку у табличного ...

    Read more...

     
  • Super User 27.04.2012 09:03
    1) Нужно установить свойство "РазрешитьНачал оПеретаскивания " у табличного поля из которого будем ...

    Read more...

     
  • Unknown181538 06.04.2012 14:36
    Я имею ввиду текст, который пишется для обработки в режиме пользователя. По умолчанию обработка ...

    Read more...

     
  • Administrator 06.04.2012 14:29
    Уважаемый, Unknown181538. По первому пункту согласен, спасибо. Видимо оператор "выполнить" "остался" ...

    Read more...

Login Form