Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: PHP использование COM
 
 автор: SIDPR   (05.02.2013 в 17:21)   письмо автору
 
 


$this->_xlsObj = new COM("Excel.Application");


Подскажите, наверняка многие имели дело с генерацией excel средствами php.
Все получилось, все генерирую. но встала задача заблокировать книгу от копирования, выделений и изменений , мне дали скрипт:


For Each oSheet In oReport.Workbooks(1).Sheets
                oSheet.Protect Password:="", DrawingObjects:=True, Contents:=True, Scenarios:=True
                oSheet.EnableSelection = xlNoSelection
Next

Где oReport.Workbooks(1) это рабочая книга Excel.

Путем долгих манипуляций, я смог только заблокировать паролем:
$this->_xlsObj->Workbooks[1]->Protect('11');


Но как использовать EnableSelection и как я так и не смог, даже путем кучей подборов.
пример:


$this->_xlsObj->Workbooks[1]->enableSelection(-4142);
//или
$this->_xlsObj->ActiveSheet->enableSelection(-4142);
//или
$this->_xlsObj->ActiveSheet->enableSelection("xlNoSelection");
//или
$this->_xlsObj->ActiveSheet->enableSelection= "xlNoSelection";
//или
$this->_xlsObj->ActiveSheet->enableSelection= "-4142";

Все варианты были без успеха :)
Документацию по методам и вариантом значений я не нашел :(
Если кто знает как активировать: xlNoSelection , буду рад!

  Ответить  
 
 автор: sidPR   (06.02.2013 в 11:44)   письмо автору
 
   для: SIDPR   (05.02.2013 в 17:21)
 

Помогите пожалуйста, надежда только на вас :)

  Ответить  
 
 автор: Sfinks   (06.02.2013 в 12:05)   письмо автору
 
   для: sidPR   (06.02.2013 в 11:44)
 

Не проще использовать класс PHPExcel?
Я в нем не нашел только как зафиксировать шапку таблицы, чтоб она не уезжала при скроллинге. Все остальное, что когда либо было нужно, есть.

  Ответить  
 
 автор: sidPR   (06.02.2013 в 12:22)   письмо автору
 
   для: Sfinks   (06.02.2013 в 12:05)
 

ну наверняка этот PHPExcel использует Com.. мне просто нужно понять как эту долбаную строку написать и все :(, чтобы нельзя было выделить документ и скопировать..

  Ответить  
 
 автор: confirm   (06.02.2013 в 12:35)   письмо автору
 
   для: sidPR   (06.02.2013 в 12:22)
 

Ищите на MSDN.

  Ответить  
 
 автор: sidPR   (06.02.2013 в 12:40)   письмо автору
 
   для: confirm   (06.02.2013 в 12:35)
 

Там то я и нашел пример на VBA и он рабочий. но как его в php перевести я хз :)

  Ответить  
 
 автор: confirm   (06.02.2013 в 13:43)   письмо автору
 
   для: sidPR   (06.02.2013 в 12:40)
 

Что значит перевести в РНР? РНР вообще не может работать с тем, что ему не доступно (как и любой другой язык), поэтому вы и открываете СОМ-объект через который вы будете иметь доступ к требуемому, и работать будет он, а не РНР. Разница только в обращении к объекту, а опции значений задаются также (правда в JS в отличии от VB, если в нем открыть такой объект, иначе немного, но к РНР это отношения не имеет).
Читайте, скорее всего вы неверно указываете опции объекту (ячейке), ведь на странице она не одна. К примеру, VB:
objSheet = xlsObj.Sheets(2)
objSheet.Рrotect("param",.T.,.T.,.T.) //запрет на ячейки
xlsObj.ActiveSheet.EnableSelection = xlUnlockedCells //так недоступны защищенные ячейки
xlsObj.ActiveSheet.EnableSelection = xlNoRestrictions //а так доступны все ячейки при перемещении по листу, но ввести данные он может только в незащищенные ячейки.

Пример который привели вы подразумевает обход в цикле, чего нет у вас в коде, так что читайте.

  Ответить  
 
 автор: sidPR   (06.02.2013 в 15:22)   письмо автору
 
   для: confirm   (06.02.2013 в 13:43)
 

Мне нужно просто закрыть лист от копирования.

пароль на лист я поставил вот так:

 $this->_xlsObj->ActiveSheet->Protect('22');
\
и это работает.

а как поставить EnableSelection ?

я пишу перед своей строкой так:


$this->_xlsObj->ActiveSheet->EnableSelection = 'xlNoSelection';
$this->_xlsObj->ActiveSheet->Protect('22');
$this->_xlsObj->Workbooks[1]->Protect('11');


но не пашет.. :(

  Ответить  
 
 автор: confirm   (06.02.2013 в 16:32)   письмо автору
 
   для: sidPR   (06.02.2013 в 15:22)
 

Я не знаю как конкретно, так как не занимался подобным, но определенно вы делаете это не так как нужно. Поэтому и надо прочесть все, что касается этого вопроса. А уж примеры на чем, то ли на VB, то ли на .NET вы будете изучать, роли не играет.

  Ответить  
 
 автор: sidPR   (06.02.2013 в 17:52)   письмо автору
 
   для: confirm   (06.02.2013 в 16:32)
 

For Each oSheet In oReport.Workbooks(1).Sheets
                oSheet.Protect Password:="", DrawingObjects:=True, Contents:=True, Scenarios:=True
                oSheet.EnableSelection = xlNoSelection
Next 


Судя по этому рабочему варианту я должен сделать нечто вроде, цикла по

foreach ($this->_xlsObj->ActiveSheet as $sheet){
            $sheet->EnableSelection = 'xlNoSelection';
        }

  Ответить  
 
 автор: confirm   (06.02.2013 в 19:13)   письмо автору
 
   для: sidPR   (06.02.2013 в 17:52)
 

Это называется методом тыка.
Вы не поняли. Объект имеет не одно свойство, а несколько, в данном примере производится обход циклом по свойствам объекта, с установкой им параметров. Например, в JS вы можете обойти свойства объекта оператором with, в VBS это будет For Each, в РНР foreach (смотрите в руководстве РНР о СОМ объектах, там есть описания примеров). Можно и без цикла, перечисляя последовательно строками.
Говоря о цикле, я имел ввиду, что установка неких свойств объекта может требовать установки и других свойств, например, не только среди свойств некоего объекта, но возможно и среди коллекции этих объектов (например, коллекции Sheets).
Другими словами, возможно требуется указать какие ячейки будут блокированы - все или часть, и как это делается. То есть, вы не просто выдирайте куски примеров из описания, а изучайте все что касается COM-объекта, в данном случае Excel.
Я не работал с этим объектом достаточно много, по мелочам, как то вставка листов в книгу, получение определенных колонок и конвертирование их в другой формат на выходе. Я достаточно много работал с Word объектом, начиная от простейшего преобразования документов, кончая использованием его для проверки правописания, и я изучал этот СОМ-объект насколько требовалось для решения задач. Но это все под VBS, JS, WSH, а работать с excael документами на сервере, так это есть библиотеки, большой надобности в СОМ объекте нет, если только у вас не win-сервер.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования