Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Activate.Excel / 25 сообщений из 30, страница 1 из 2
20.11.2009, 17:21
    #36323059
Ymka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
народ кто использовал??
задача такая:
есть некий файл Excel, необходимо из него загружать информацию в базу данных

как записать в ячейку данные вроде бы разобрался

а вот как прочитать из вполне определенной ячейки данные???
...
Рейтинг: 0 / 0
22.11.2009, 22:58
    #36324859
gr_vl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
В принципе так же как и записывать,
наприер
s a=mywr.cell(3,1).Formular1c1

где mywr - текущая книга (или активная книга)
...
Рейтинг: 0 / 0
22.11.2009, 23:34
    #36324885
MX - 9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
Ymka2007народ кто использовал??
задача такая:
есть некий файл Excel, необходимо из него загружать информацию в базу данных

как записать в ячейку данные вроде бы разобрался

а вот как прочитать из вполне определенной ячейки данные???

Забрасывает весь лист EXCEL в указанную глобаль CACHE
Или сразу всю книгу - каждай лист в свой узел
Последние индексы - строка и колонка - числа - но можно и буквы для колонок
С перекодировкой в 8-bit если надо (сам EXCEL работает на unicode)
Быстро. Пустые ячейки пропускает.
После обработки в CACHE вываливает готовый отчет обратно в EXCEL

EXCEL 2007 продвинут - 16 000 колонок и миллион строк на листе.
Рекомендую.
...
Рейтинг: 0 / 0
23.11.2009, 12:51
    #36325597
Ymka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
а код какой нить можно?
...
Рейтинг: 0 / 0
23.11.2009, 13:51
    #36325800
Alexandr Minzer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
Как очень давно писал.
Привожу весь метод целиком, может для себя что-нибудь найдете полезного

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
ClassMethod Load(patch As %String, changefile As %Boolean =  1 )
{
	Try {
		Set rowb= 8 ,rowe= 55 
		Set fn=##class(%File).GetFilename(patch)
		Set dir=##class(%File).GetDirectory(patch)
		Set contract=$p(fn,"_", 2 ),ym=$p(fn,"_", 4 ),y=$e(ym, 1 , 4 ),m=+$e(ym, 5 , 6 ),codereg=$p(fn,"_", 3 )
		// удаляем данные перед загрузкой
		&sql(delete from vendors.f322 where contract = :contract and year = :y and month = :m)
		If SQLCODE< 0  Write $system.SQL.SQLCODE(SQLCODE),! Quit
		//
		Set xapp=##class(Activate.Excel.Application).%New()
		Set xapp.Visible=- 1 
		//
		Set workbooks=xapp.Workbooks
		Set workbook=workbooks.Open(patch)
		// So excel won't ask to save
		Set workbook.Saved = -1
		//
		Set worksheets=workbook.Worksheets
		Set worksheet=worksheets.ItemGet("F22_1")
		//
		Set worksheet=worksheet.Become("Activate.Excel.uWorksheet")
		Do worksheet.Activate()
		Set cells = worksheet.Cells
		//
		For row=rowb:1:rowe {
			Set f322=..%New()
			Set f322.Contract=contract
			Set f322.Year=y
			Set f322.Month=m
			/*
			For col=2:1:26 {
				Do cells.ItemGet(row,col).Become("Activate.Excel.Range").Activate()
				Set ^str(row,col)=xapp.ActiveCell.Text
				//Set ^str(row,col)=cells.ItemGet(row,col).Become("Activate.Excel.Range").Formula
			}
			Continue
			*/
			// Использую свойство Text т.к. при использовании свойства Value на значения 0.08 программа вылетает
			Set f322.YearHis=+$tr(cells.ItemGet(row,3).Become("Activate.Excel.Range").Text," ","")
			Set f322.MonthHis=+$tr(cells.ItemGet(row,2).Become("Activate.Excel.Range").Text," ","")
			Set f322.InS=+$fn(+$tr(cells.ItemGet(row,4).Become("Activate.Excel.Range").Text," ",""),"",2)
			Set f322.InSNDS=+$fn(+$tr(cells.ItemGet(row,5).Become("Activate.Excel.Range").Text," ",""),"",2)
			Set f322.AvC=+$fn(+$tr(cells.ItemGet(row,8).Become("Activate.Excel.Range").Text," ",""),"",2)
			Set f322.AvCNDS=+$fn(+$tr(cells.ItemGet(row,9).Become("Activate.Excel.Range").Text," ",""),"",2)
			Set f322.Av=+$fn(+$tr(cells.ItemGet(row,12).Become("Activate.Excel.Range").Text," ",""),"",2)
			Set f322.AvNDS=+$fn(+$tr(cells.ItemGet(row,13).Become("Activate.Excel.Range").Text," ",""),"",2)
			Set f322.Corr=+$fn(+$tr(cells.ItemGet(row,16).Become("Activate.Excel.Range").Text," ",""),"",2)
			Set f322.CorrNDS=+$fn(+$tr(cells.ItemGet(row,17).Become("Activate.Excel.Range").Text," ",""),"",2)
			Set f322.Sp=+$fn(+$tr(cells.ItemGet(row,20).Become("Activate.Excel.Range").Text," ",""),"",2)
			Set f322.SpNDS=+$fn(+$tr(cells.ItemGet(row,21).Become("Activate.Excel.Range").Text," ",""),"",2)
			Set f322.OutS=+$fn(+$tr(cells.ItemGet(row,24).Become("Activate.Excel.Range").Text," ",""),"",2)
			Set f322.OutSNDS=+$fn(+$tr(cells.ItemGet(row,25).Become("Activate.Excel.Range").Text," ",""),"",2)
			Set sc=f322.%Save()
			If $$$ISERR(sc) {
				Do $system.OBJ.DisplayError(sc)
			} ElseIf changefile {
				Set diff=f322.DiffInSNDS()
				If diff'= 0  {
					Set cells.ItemGet(row, 5 ).Become("Activate.Excel.Range").Formula="="_f322.InSNDS_$fn(diff,"+")
					Set cells.ItemGet(row, 13 ).Become("Activate.Excel.Range").Formula="="_f322.AvNDS_$fn(diff,"+")
				}
			}
			Set f322=$$$NULLOREF
		}
		// Лист TITUL
		Set worksheet=worksheets.ItemGet("TITUL")
		Set worksheet=worksheet.Become("Activate.Excel.uWorksheet")
		Do ##class(Utils).Titul(worksheet,codereg,contract,y,m)
		If changefile {
			Hang  2 
			Do workbook.Save()
		}
	} Catch(ex) {
		Write ex.DisplayString(),!
	}
	//
	Set (workbooks,workbook)=$$$NULLOREF
	Set (worksheets,worksheet)=$$$NULLOREF
	Set cells=$$$NULLOREF
	Set range=$$$NULLOREF
	//
	If $isobject($g(xapp)) Do xapp.Quit()
	Set xapp=$$$NULLOREF
}
...
Рейтинг: 0 / 0
23.11.2009, 14:25
    #36325921
Ymka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
Александр, опишите пожалуйста что делает код.
зачем &sql(delete ...)
для чего set cells
куда потом set f322
спасибо
...
Рейтинг: 0 / 0
23.11.2009, 14:39
    #36325962
MX - 9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
Ymka2007а код какой нить можно?

?$$ReadSheet \\bacunova\m\Pasutijumi.xlsm#* ^MEHCEHo(%USID, *ToText

записывает всю книгу EXCEL-2007 в глобаль, преобразуя ячейки в текст



?$$ReadSheet \\servermx\m\ALG_?%gm?.xls#Z35 ^MEHCEHa(?%gm?) *ToValue

записывает лист Z35 из книги ALG_[год-месяц] в глобаль ^MEHCEHa
формулы превращает в значения
год-месяц находится в локальной переменной Cache "%gm"



?$$ReadSheet \\ivanov\Darbi?year?.xls#* ^MEHCEHd(%USID, *Formula

записывает всю книгу в глобаль преобразуя формулы из ячеек в текст
(но не в значения)

книги должны быть доступны по сети КЛИЕНТУ, с которого идет запрос

время выполнения - примерно секунда на каждый лист книги
...
Рейтинг: 0 / 0
23.11.2009, 14:47
    #36325979
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
Ymka2007Александр, опишите пожалуйста что делает код.
зачем &sql(delete ...)
для чего set cells
куда потом set f322
спасибо

судя по всему этот метод содержится в классе vendors.f322
и перед загрузкой он просто чистит содержимое
Set cells = worksheet.Cells
явно указывает на область с ячейками, чтобы можно было брать данные из нужной ячейки
set f322 - сохранение загруженных данных
...
Рейтинг: 0 / 0
23.11.2009, 14:56
    #36326010
Ymka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
MX - 9,
а версия cache какая?
и где бы это почитать?
...
Рейтинг: 0 / 0
23.11.2009, 14:56
    #36326011
Alexandr Minzer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
Метод загружает данные из Excel файла в БД.

В начале метода чистится таблица в которую пишутся данные xls-файла
Код: plaintext
1.
2.
// удаляем данные перед загрузкой
&sql(delete from vendors.f322 where contract = :contract and year = :y and month = :m)

Остальное вроде должно быть все понятно

Создаем экземпляр Excel на сервере
Код: plaintext
1.
Set xapp=##class(Activate.Excel.Application).%New()
делаем Excel видимым (или невидимым, не помню)
Код: plaintext
1.
Set xapp.Visible=- 1 
открываем xls-файл
Код: plaintext
1.
Set workbook=workbooks.Open(patch)
выбираем нужный лист
Код: plaintext
1.
2.
Set worksheets=workbook.Worksheets
Set worksheet=worksheets.ItemGet("F22_1")
транслируем экземпляр класса Activate.Excel.Worksheet (объектная переменная worksheet) в экземпляр класса Activate.Excel.uWorksheet
Код: plaintext
1.
Set worksheet=worksheet.Become("Activate.Excel.uWorksheet")
делаем лист активным
Код: plaintext
1.
Do worksheet.Activate()
инициализируем объектную переменную cells для работы с диапазоном ячеек
Код: plaintext
1.
Set cells = worksheet.Cells
в цикле читаем данные и записываем в БД
Код: plaintext
1.
2.
3.
For row=rowb: 1 :rowe {
...
}


читаем данные так:
Код: plaintext
1.
cells.ItemGet(row, 3 ).Become("Activate.Excel.Range").Text
...
Рейтинг: 0 / 0
23.11.2009, 14:57
    #36326014
Ymka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
DAiMor,

это я ужо понял, теперь проблема с
Код: plaintext
1.
2.
3.
4.
Set (workbooks,workbook)=$$$NULLOREF
	Set (worksheets,worksheet)=$$$NULLOREF
	Set cells=$$$NULLOREF
	Set range=$$$NULLOREF
ругается на $$$NULLOREF
какую библиотеку подключить нужно?
...
Рейтинг: 0 / 0
23.11.2009, 15:02
    #36326028
Ymka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
Alexandr Minzer,

вопрос если ячейки объединенные, то как мне обратится к такой ячейке и выбрать данные?
...
Рейтинг: 0 / 0
23.11.2009, 15:03
    #36326032
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
Ymka2007DAiMor,

это я ужо понял, теперь проблема с
Код: plaintext
1.
2.
3.
4.
Set (workbooks,workbook)=$$$NULLOREF
	Set (worksheets,worksheet)=$$$NULLOREF
	Set cells=$$$NULLOREF
	Set range=$$$NULLOREF
ругается на $$$NULLOREF
какую библиотеку подключить нужно?
$$$NULLOREF прописан в %occConstant.INC
#include "%occConstant"
можешь просто заменить на ""
...
Рейтинг: 0 / 0
23.11.2009, 15:17
    #36326079
Alexandr Minzer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
Ymka2007Alexandr Minzer,

вопрос если ячейки объединенные, то как мне обратится к такой ячейке и выбрать данные?

запустите Excel,
объедините ячейки,
запишите макрос,
затем посмотрите в редакторе Visual Basic сгенерированный код
повторите его в cache
...
Рейтинг: 0 / 0
23.11.2009, 15:28
    #36326119
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
Ymka2007Alexandr Minzer,

вопрос если ячейки объединенные, то как мне обратится к такой ячейке и выбрать данные?
либо к ячейке с наименьшими координатами,
либо к любой ячейке
...
Рейтинг: 0 / 0
23.11.2009, 15:29
    #36326121
Ymka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
ок
заработало
спасибо всем
...
Рейтинг: 0 / 0
09.12.2009, 17:19
    #36357267
Ymka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
есть такая запись открытия объекта:
Set xapp=##class(Activate.Excel.Application).%New()
q:'$IsObject(xapp) $$$ERROR($$$GeneralError,"Не удалось активировать ""Activate.Excel.Application""!")
на что компилятор выдает ошибку:
Код: plaintext
1.
RTT.ImportXLSNew. 1 .INT( 34 ) ERROR # 1043 : QUIT argument not allowed : '$$Error^%apiOBJ(5001,"Не удалось астивировать ""Activate.Excel.Application""!")' : Offset: 100  [zLoad+ 5 ^RTT.ImportXLSNew. 1 ]
 TEXT: 		q:'$IsObject(xapp) $$Error^%apiOBJ( 5001 ,"Не удалось астивировать ""Activate.Excel.Application""!")
так как правильно организовать проверку на открытие объекта?
...
Рейтинг: 0 / 0
09.12.2009, 17:36
    #36357323
Ymka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
уточняю, все находится в конструкции try-catch
Код: plaintext
1.
2.
3.
4.
5.
Try {
Set xapp=##class(Activate.Excel.Application).%New()
q:'$IsObject(xapp) $$$ERROR($$$GeneralError,"Не удалось активировать ""Activate.Excel.Application""!")
Catch(ex) {
 s sc=ex.AsStatus()
}
...
Рейтинг: 0 / 0
09.12.2009, 18:44
    #36357554
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
Если ошибка возникает на %New(), то возможно Excel остался в памяти с предыдущего раза или у Вас не настроен Excel в DCOM (cmd> dcomcnfg.exe).
Здесь лежит рабочий пример работы с Excel через Activate.

PS: я в свое время отказался от такого способа работы с Excel, так как на сервере требуется наличие MS Excel. К тому же он не предназначен для работы на стороне сервера и работает медленно через ActiveX.
Используя "нативные" компоненты, отчёты можно экспортировать в pdf, html, image; добавлять в них электронную цифровую подпись; формировать отчёт на основе шаблонов с тегами или вручную и многое другое.
...
Рейтинг: 0 / 0
09.12.2009, 18:58
    #36357581
Ymka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
спасибо
этим я уже воспользовался
возникла ошибка в следующем:
у меня жестко прописано, что имя листа должно быть таким
Set worksheet=worksheets.ItemGet("ЗаявкаЛичногоТурнираФ1")
некотрые умельцы присылают совсем другое, т.е. переименовывают
соответственно возникает ошибка при открытии несуществующего листа
вся загрузка в try-catch скобках
так вот именно эту ошибку try-catch не "переваривает"
и вылетает сообщение ZEN об ошибке с выводом всего стека

как это преодолеть? есть ли метод проверки на наличие такого листа?
...
Рейтинг: 0 / 0
10.12.2009, 12:47
    #36358822
Ymka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
если нет такого листа
выдает ошибку в классе Class Activate.Excel.Sheets Extends %Activate.Interface
в методе:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Method ItemGet(Index As %Activate.Variant) As %Activate.IDispatch [ Final, Language = cache ]
{
 ;#define ComException  6101 
 New %result,%parms
 Set %parms=$ListBuild(i%%IDispatchPtr,$$$INVOKEPROPERTYGET, 170 )
 Set %parms=%parms_..%FormatKnownParam(.Index, 1 , 12 )
 k ^Aa
 s ^Aa("%parms")=$LB($$$ORDINAL,$$$HANDLE,$$$ActXInvoke,%parms)
 Set %result=$ZF($$$ORDINAL,$$$HANDLE,$$$ActXInvoke,%parms)
 

 If $List(%result, 1 )'= 0  {
	 ;$$$ActXRaise(%result)
	 ;s ^Aa("%result")=%result
	 ;Set sc=$$$ERROR($$$ComException,$LG(%result, 1 )_" "_$LG(%result, 2 )_" "_$LG(%result, 3 ))
	 ;$$$ActXError(%p) 
	 ;ZT "ACTX"
 }
 
 New %retval If $List(%result, 3 )= 0  Set %retval=$$$NULLOREF
 Else  Do
 . Set %retval=##Class(%Activate.IDispatch).%New($List(%result, 3 ))
 . If %retval=$$$NULLOREF $$$ActXRaise($ListBuild("Cannot Create Dispatch Object"))
 s ^Aa("%retval")=%retval
 Quit %retval
}
при выполнении команды: ZT "ACTX"
что бы это могло значить? и как исправить?
...
Рейтинг: 0 / 0
10.12.2009, 17:13
    #36359615
Ymka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
вот что нарыл:
для того чтобы промсотреть все имена листов нужно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Set xapp=##class(Activate.Excel.Application).%New()
Set xapp.Visible= 0 
Set workbooks=xapp.Workbooks
Set workbook=workbooks.Open(path)
Set workbook.Saved = - 1 
Set worksheets=workbook.Worksheets
s sc=$$$OK
f i= 1 : 1 :worksheets.CountGet() {
 if (worksheets.ItemGet(i).GetProperty("Name")'["Лист1") {
  s sc=$$$ERROR($$$GeneralError,"Не найден лист") 
  q
 }
}

теперь вопрос для гуру:
приведенный выше код находится в рамках try-catch механизма
как мне правильно сделать выход из try-catch , при условии что такого имени листа не нашлось?
...
Рейтинг: 0 / 0
11.12.2009, 10:08
    #36360534
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
QUIT within a TRY-CATCH Block
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
try{
  основная работа
  ...
  если возникла ощибка, то выполняем quit или throw (удобные макросы для генерации ошибок 
  или выхода можно найти в %occStatus.inc, если подсказчика кода нет)
}catch ex{
  обработка ошибки (если надо)
}
финальная обработка (закрытие объектов, освобождение ресурсов и т.д.), если не было исключения в блоке catch
возврат вызывающей стороне результата выполнения процедуры
...
Рейтинг: 0 / 0
11.12.2009, 15:44
    #36361678
Ymka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
спасибо, quit обычный заработал, а вот с throw не разобрался
...
Рейтинг: 0 / 0
07.04.2010, 16:53
    #36566538
Ymka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Activate.Excel
Вновь поднимаю тему

конфигурация: MS2008, Cache2010, MS Office 2003 SP3
накатил DLL
получил новый пакет Activate

запускаю старый метод похожий как в 5 посте
выскакивает ошибка: zOpen...Activate.Excel.Workbooks
на строчке:
Set workbook=workbooks.Open(patch)

в чем может быть проблема? как подойти к решению?

PS - конфирурация: MS2003, Cache2007, MS Office 2003 SP3 работает как нужно.
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Activate.Excel / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]