:: Visual Foxpro, Foxpro for DOS
Как через фокс взять в ОО Калк форматы ячеек в выделенной области?
Gladik
Автор

Сообщений: 41
Дата регистрации: 25.09.2007
Скажи пожалуйста - а можно из Калка взять формат строки?
Как в екселе например:

выделяем область:
oXls.Range(oRformat.Cells(1,1),oRformat.Cells(2,2)).Select()
oXls.Selection.Copy()



А потом все ФОРМАТЫ строки просто скопировать в нужное место:
oXls.Range(oRdata.Cells(7,7),oRdata.Cells(8,8)).Select()
oXls.Selection.PasteSpecial(4)

Наверняка есть простая команда форматирования...


В каждой ячейке может быть свой тип шрифта, размер, жиронсть, цвет и т.д. Вот как в калке взять ВСЕ форматы конкретной области и вставить в определённое место?

нашол тока как определить тип данных в каждой конкретной ячейке.
Ratings: 0 negative/0 positive
Re: Как через фокс взять в ОО Калк форматы ячеек в выделенной области?
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
Смотри у меня в решениях
FUNCTION GetPaint
LPARAMETERS loSheet,lnLine1,lnRow1,lnLine2,lnRow2
LOCAL loOldSheet
loOldSheet=THIS.ActiveSheet()
loSheet=THIS.SelectSheet(loSheet)
THIS.SelectRange(loSheet,lnLine1,lnRow1,lnLine2,lnRow2)
LOCAL laArgs(1)
laArgs(1) =THIS.SetProp()
THIS.loDispatcher.executeDispatch(THIS.loDocument.CurrentController.Frame, ".uno:Copy","" , 0, @laArgs)
THIS.SelectSheet(loOldSheet)
RETU



Исправлено 1 раз(а). Последнее : Ydin, 14.01.08 13:52
Ratings: 0 negative/0 positive
Re: Как через фокс взять в ОО Калк форматы ячеек в выделенной области?
Gladik
Автор

Сообщений: 41
Дата регистрации: 25.09.2007
долго ломаю голову над кодом.
А можно чуток коментарий к нему добавить? Слишком много неизвестных. : )
У вас это займёт секунд 30, а мне спасёт дня три. : )
Спасибо.
Ratings: 0 negative/0 positive
Re: Как через фокс взять в ОО Калк форматы ячеек в выделенной области?
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
Я попытался, но трудно все расписать. Писал я это давно и все сидит в классе.
Смотри по www.foxclub.ru
2 класса для работы с Excel или Open Office Calc.
Модуль OOClasss.prg.
Там все есть. Привести пример работы сложно. У меня это в FrameWork'е.
Я не имею времени, чтоб оформить все в виде решения.


FUNCTION GetPaint
LPARAMETERS loSheet,lnLine1,lnRow1,lnLine2,lnRow2
LOCAL loOldSheet
PUBLIC gaProps(6)
* Запомним текущий лист, чтоб вернуть его текущим
loOldSheet=THIS.ActiveSheet() && В классе запоминается текущий лист
* Заданный лист делаем текущим
loSheet=SelectSheet(loSheet)
* Выделяем ранг
SelectRange(loSheet,lnLine1,lnRow1,lnLine2,lnRow2)
LOCAL laArgs(1)
laArgs(1) = SetProp() && Это проще можно написать. Прямо массиву присвоение и все
* Запоминаем форматы (кисть)
THIS.loDispatcher.executeDispatch(THIS.loDocument.CurrentController.Frame, ".uno:Copy","" , 0, @laArgs)
* Восстанавливаем "текущий" лист
THIS.SelectSheet(loOldSheet)
RETURN

FUNCTION SelectRange
* Call: SelectRange(loSheet,lnLine1,lnCol1,lnLine2,lnCol2)
LPARAMETERS loSheet,lnLine1,lnCol1,lnLine2,lnCol2
IF TYPE('lnLine1')='C'
IF ISDIGIT(lnLine1)
lcRange='A'+STRTRAN(lnLine1,':',':IV')
ELSE
lcRange=lnLine1
ENDIF
ELSE
lnLine1=EVL(lnLine1,1)
lnCol1=EVL(lnCol1,1)
lnLine2=EVL(lnLine2,lnLine1)
lnCol2=EVL(lnCol2,lnCol1)
TEXT TO lcRange
<<Num2Lat(lnCol1)>><<int(lnLine1)>>:<<Num2Lat(lnCol2)>><<int(lnLine2)>>
ENDTEXT
ENDIF
LOCAL laArgs(1)
laArgs(1) =SetProp("ToPoint",lcRange)
RETURN THIS.loDispatcher.executeDispatch(THIS.loDocument.CurrentController.Frame, ".uno:GoToCell", "", 0, @laArgs)

FUNCTION SelectSheet
LPARAMETERS lcSheetName
LOCAL lo, lcType
IF TYPE('lcsheetName')='O'
lcSheetName=lcSheetName.getName()
ENDIF
lcType=TYPE('lcsheetName')
DO CASE
CASE lcType = 'N'
lo=THIS.loDocument.Sheets.getbyindex(lcSheetName-1)
CASE lcType = 'C'
lo=THIS.loDocument.Sheets.getbyName(this.GetCorrectName(lcSheetName))
OTHERWISE
lo=lcSheetName
ENDCASE
THIS.loDocument.getCurrentController.setActiveSheet(lo)
RETURN lo

FUNCTION SelectRange
* Call: SelectRange(loSheet,lnLine1,lnCol1,lnLine2,lnCol2)
LPARAMETERS loSheet,lnLine1,lnCol1,lnLine2,lnCol2
IF TYPE('lnLine1')='C'
IF ISDIGIT(lnLine1)
lcRange='A'+STRTRAN(lnLine1,':',':IV')
ELSE
lcRange=lnLine1
ENDIF
ELSE
lnLine1=EVL(lnLine1,1)
lnCol1=EVL(lnCol1,1)
lnLine2=EVL(lnLine2,lnLine1)
lnCol2=EVL(lnCol2,lnCol1)
TEXT TO lcRange
<<Num2Lat(lnCol1)>><<int(lnLine1)>>:<<Num2Lat(lnCol2)>><<int(lnLine2)>>
ENDTEXT
ENDIF
LOCAL laArgs(1)
laArgs(1) =SetProp("ToPoint",lcRange)
RETURN THIS.loDispatcher.executeDispatch(THIS.loDocument.CurrentController.Frame, ".uno:GoToCell", "", 0, @laArgs)

FUNCTION SetProp( lcName, luValue, lnNum )
lnNum=EVL(lnNum,1)
WITH THIS
gaProps(lnNum).NAME = lcName
gaProps(lnNum).VALUE = luValue
RETURN .laProps(lnNum)
ENDWITH

FUNCTION Num2Lat
LPARA lnNum
LOCAL lc, ln1, ln2
lc="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
IF lnNum<27
RETU SUBS(lc,lnNum,1)
ENDIF
ln1=FLOOR(lnNum/26)
ln2=lnNum-ln1*26
IF ln2=0
ln1=ln1-1
ln2=26
ENDIF
RETU SUBS(lc,ln1,1)+SUBS(lc,ln2,1)
Ratings: 0 negative/0 positive
Re: Как через фокс взять в ОО Калк форматы ячеек в выделенной области?
Gladik
Автор

Сообщений: 41
Дата регистрации: 25.09.2007
излазил весь сайт.
Никак не могу найти Модуль OOClasss.prg
: (((

Где он хоть примерно находица? В готовых решениях? Или где?

КАк я понял - вы кинули часть библиотеки. Так? Пасиба за неё.
Ratings: 0 negative/0 positive
Re: Как через фокс взять в ОО Калк форматы ячеек в выделенной области?
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
Я ж ссылку дал. Файловые архивы.
Нажать мышкой на ссылку и смотреть в таблице справа Ydin.
Найти и скачать
Ratings: 0 negative/0 positive
Re: Как через фокс взять в ОО Калк форматы ячеек в выделенной области?
Gladik
Автор

Сообщений: 41
Дата регистрации: 25.09.2007
ага
нашол.
Пасиба!
Ну ты и понаписал. Походу на все случаи жизни?

В моём примере я так понял, что мне нужно использовать функцию GetPaint ?
Ratings: 0 negative/0 positive
Re: Как через фокс взять в ОО Калк форматы ячеек в выделенной области?
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
Да, желаю удачи.
Ratings: 0 negative/0 positive
Re: Как через фокс взять в ОО Калк форматы ячеек в выделенной области?
Gladik
Автор

Сообщений: 41
Дата регистрации: 25.09.2007
что то твою библиотека содержит какие то непонятные фоксу (и мне) команды...

Program ...\ooclass.prg has the following errors:
Unknown LANG - Undefined
Unknown PRESS - Undefined
Unknown NUM2LAT - Undefined
Unknown RANGE_N2C - Undefined
Unknown SAY - Undefined
Unknown RANGE_C2N - Undefined
Unknown ARRAYPASSER - Undefined

И ещё вапрос, есть в библиотеке такая строка
loOldSheet=THIS.ActiveSheet()
Часто встречается оператор THIS
Он обозначает что? Конкретно этот класс? Я добавил ooClass.prg как программу. И включил програму в проект. Вызываю командой:
SET PROCEDURE TO ooClass ADDITIVE
Поэтому возникают ошибки. : (

Как вы сами её у себя подключали?
Ratings: 0 negative/0 positive
Re: Как через фокс взять в ОО Калк форматы ячеек в выделенной области?
Gladik
Автор

Сообщений: 41
Дата регистрации: 25.09.2007
всё арвно не понимаю вот эту строку. : (

* Запоминаем форматы (кисть)
THIS.loDispatcher.executeDispatch(THIS.loDocument.CurrentController.Frame, ".uno:Copy","" , 0,
Ratings: 0 negative/0 positive
Re: Как через фокс взять в ОО Калк форматы ячеек в выделенной области?
rvc44

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
2Gladik
А ты вручную кнопкой с кистью в Word'е/Excel'е когда-нибудь пользовался для
копирования форматов? Если нет - оно и понятно! Я многих знаю, кто этим
никогда не пользовался! Сначала научись делать вручную - почитай хэлп, а потом
всё станет само-собой и в программировании этого дела понятно...



Исправлено 1 раз(а). Последнее : rvc44, 25.01.08 15:48
Ratings: 0 negative/0 positive
Re: Как через фокс взять в ОО Калк форматы ячеек в выделенной области?
Gladik
Автор

Сообщений: 41
Дата регистрации: 25.09.2007
Никгда вручную в ворде и екселе не копировал ТОЛЬКО форматы.
Всегда тока с данными. ((
Какая хоть опция то?
Ratings: 0 negative/0 positive
Re: Как через фокс взять в ОО Калк форматы ячеек в выделенной области?
rvc44

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
Стандартная кнопка на тулбаре "Кисть" (копировать формат) - очень в жизни помогает!
Можно еще пару кнопок для удобства из настроек вытащить...
Ratings: 0 negative/0 positive
Re: Как через фокс взять в ОО Калк форматы ячеек в выделенной области?
Gladik
Автор

Сообщений: 41
Дата регистрации: 25.09.2007
нашол!
Копирует только формат, но не данные. то что нада.
Я думал я всё в екселе знаю. Ошибался.

В принципе код я нашол (спасибо supervk из другого форума), но он в Стар Бейсике. Пытаюсь перевести его что бы из-под Фокса запускался.

sub Main

dim document as object
dim dispatcher as object

document = ThisComponent.CurrentController.Frame
rem dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
loMgr = CREATEOBJECT("com.sun.star.ServiceManager")
Dispatcher = loMgr.createInstance("com.sun.star.frame.DispatchHelper")

args(0) as new com.sun.star.beans.PropertyValue
args(0).Name = "ToPoint"
args(0).Value = "$A$1:$B$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

args(0).Value = "$A$2:$B$2"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())

args(0).Name = "Flags"
args(0).Value = "T"
dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args())

end sub



не знаю пока как перевести эти строки:

args(0) as new com.sun.star.beans.PropertyValue
args(0).Name = "ToPoint"
args(0).Value = "$A$1:$B$1"

Ratings: 0 negative/0 positive
Re: Как через фокс взять в ОО Калк форматы ячеек в выделенной области?
rvc44

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
Думаю, что как-то так:
LOCAL args[1]
args[1] = OOoPropertyValue( "ToPoint", "$A$1:$B$1" )
Подробнее, см. исходный код функции OOoPropertyValue в библиотеке LibOOo.prg:
* Create a com.sun.star.beans.PropertyValue struct and return it.
FUNCTION OOoPropertyValue( cName, uValue, nHandle, nState )
LOCAL oPropertyValue
oPropertyValue = OOoCreateStruct( "com.sun.star.beans.PropertyValue" )
*-- Добавлено 24.01.08 для корректного объединения 2 документов
*-- Подробнее: community.i-rs.ru
*-- и здесь: www.oooforum.org
*-- в теме "Visual Foxpro - using insertDocumentFromUrl - help"
*-- argsinsert[1] = OOoMakePropertyValue( "EMPTY" , ".f." )
*-- cInsertfilename = "c:\exam\lhwin.odt"
*-- oCursor.insertDocumentFromUrl(OOoConvertToURL(cInsertfilename), @ argsinsert)
IF cName <> "EMPTY"
oPropertyValue.Name = cName
oPropertyValue.Value = uValue
ENDIF
IF TYPE([nHandle])="N"
oPropertyValue.Handle = nHandle
ENDIF
IF TYPE([nState])="N"
oPropertyValue.State = nState
ENDIF
RETURN oPropertyValue
ENDFUNC



Исправлено 1 раз(а). Последнее : rvc44, 28.01.08 11:54
Ratings: 0 negative/0 positive
Re: Как через фокс взять в ОО Калк форматы ячеек в выделенной области?
rvc44

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
Цитата:
Я думал я всё в екселе знаю. Ошибался.
Я никогда про себя так не думал и даже сейчас не думаю!
Чтобы это понять советую почитать:
1. АА Гладкий АА Чиртик Трюки и эффекты в Excel.pdf 46,965,868 bytes
2. OReilly.Excel.Hacks.eBook-DDU.chm 3,504,733 bytes
3. Анализ данных в Excel наглядный курс создания отчетов, диаграмм и сводных таблиц.pdf 115,221,854 bytes
а потом, чтобы сбавить пыл и немного пообломать рога - попробывать бесплатно сдать
online-экзамен по Excel и/или Word на получение сертификата специалиста на сайте www.specialist.ru при МГТУ им.Баумана! Вещь!
Ratings: 0 negative/0 positive
Re: Как через фокс взять в ОО Калк форматы ячеек в выделенной области?
Gladik
Автор

Сообщений: 41
Дата регистрации: 25.09.2007
args[1] = OOoPropertyValue( "ToPoint", "$A$1:$B$1" )
ай балин!
Я тоже использовал функцию OOoPropertyValue из библиотеке LibOOo.prg
Только не догадался что нужно КВАДРАТНЫЕ скобки.
В массив я загнал.
Но чото не выполняюца строка:

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())

где document = oXls.CurrentController.Frame

пишет "ошибочный индекс"

получаеца вот так вот из-под фокса:
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, @args )

Это равнозначно?



Исправлено 2 раз(а). Последнее : Gladik, 28.01.08 15:56
Ratings: 0 negative/0 positive
Re: Как через фокс взять в ОО Калк форматы ячеек в выделенной области?
Gladik
Автор

Сообщений: 41
Дата регистрации: 25.09.2007
вроде всё заработало. Спасибо тебе, Роман.

LOCAL Dispatcher , document, loMgr
LOCAL args[1],arrays[1]
document = oXls.CurrentController.Frame
loMgr = CREATEOBJECT("com.sun.star.ServiceManager")
Dispatcher = oMgr.createInstance("com.sun.star.frame.DispatchHelper")

args[1] = OOoPropertyValue( "ToPoint", "$A$1:$A$1" )
arrays[1] = OOoPropertyValue( )

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, @args )
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, @arrays )

args[1] = OOoPropertyValue( "ToPoint", "$E$1:$E$1" )
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, @args )

args[1] = OOoPropertyValue( "Flags", "$T" )
dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, @args )



Только нужно заменить адрес типа "$A$1:$B$1" в данной программе на адрес вида (0,0, 10,10) относительно какой то ячейки. Потмоу что с названиями ячеек работать очень неудобно. Нужно переводить из символов в цифры(кода) и наоборот.

Намекни, пожалуста, на какое нибудь решение. А уж мы переймём, переймём...
Ratings: 0 negative/0 positive
Re: Как через фокс взять в ОО Калк форматы ячеек в выделенной области?
rvc44

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
Посмотри внимательно приведенный тобой последний текст! "Это" работать явно не может!
Там так много досадных "опечаток"! Такие посты только засоряют форум, особенно если
кто-то через пол-годика решит "этим" воспользоваться!

А насчет намека, пожалуйста:
Помучай кого-нибудь на форумах по OpenOffice как этот же код переписать с использованием API и отказаться от устаревших обращений к диспетчеру, если не сможешь написАть сам!
Через API все функции адресации ячеек как раз взаимозаменимы (хочешь адрес типа "$A$1:$B$1", а хочешь адрес вида (0,0, 10,10)). Чтобы переписать через API надо просто немного поэкспериментировать! Для этого залезь по приводившейся ранее ссылке на документацию по API и посмотри там Copy и InsertContents. Думаю, сделать - несложно!
Ratings: 0 negative/0 positive
Re: Как через фокс взять в ОО Калк форматы ячеек в выделенной области?
Gladik
Автор

Сообщений: 41
Дата регистрации: 25.09.2007
"Посмотри внимательно приведенный тобой последний текст! "Это" работать явно не может!"

РАБОТАЕТ!!!
Атчиваю!
Прям делат то что нада. Правда ячейки определяюца не цифрами , буквами.

Я ещё не до конца понял чем отличается "обращений к диспетчеру" и API. Буду изучать.
Спасиб.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 22 OlegA  (Гостей: 21)

© 2000-2024 Fox Club 
Яндекс.Метрика