Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 23. 9. 2021 12:09:15

ogast
Člen
Registrace: 23. 9. 2021
Příspěvků: 4
Web

setDataArray hází chybu CannotConvertException

Ahoj, níže mám skriptík psaný v Basic Scriptu (softwaru třetí strany), úplně na konci zaremované getCellByPosition(1, 1) mi funguje bezproblému. Problém nastane, když chci uložit pole pomocí setDataArray. Hlásí, že konverze není možná, už jsem zkoušel do arraye vkládat stringy, longy, hledal jsem na cizích fórech, opravdu už nemám řešení, jak to vyřešit. Díky moc za tipy.

'__error_________________________________________________________________________________________________
[automation bridge]com.sun.star.script.CannotConvertException in UnoConversionUtilities<T>::variantToAny! Message: conversion not possible!


'_skriptík ______________________________________________________________________________________
Dim oSM, oCR, oDesk, oDoc, oSh, oCell, s, sPath, sFilePath, bDone, Oblast, Pole, args(), arg()

sPath = Pm.DiscGetPath("app:Excel/")
s = Pm.StringReplace(sPath, "\", "/")
sFilePath = s & sFileName & ".ods"

'The service manager is always the starting point
'If there is no office running then an office is started up
Set oSM = Pm.AxGetObject("new", "com.sun.star.ServiceManager")

'Create the CoreReflection service that is later used to create structs
Set oCR = oSM.createInstance("com.sun.star.reflection.CoreReflection")

'Create the Desktop
Set oDesk = oSM.createInstance("com.sun.star.frame.Desktop")

'Open a new empty calc document
Set oDoc = oDesk.loadComponentFromURL("private:factory/scalc", "_blank", 0, args)

'Create a sheet object
Set oSh = oDoc.getSheets()
Set oSheet = oSh.GetByIndex(0)

Pole = Array(0,1,2,3)   
Oblast = oSheet.getCellRangeByName("A1:A4").setDataArray(Pole)

'níže zaremované mi funguje bezproblému
'oSheet.getCellByPosition(1, 1).Value = 222

'uložení
bDone = oDoc.storeAsURL("file:///" & sFilePath, arg)


LibreOffice 7.1.4.2

Offline

#2 23. 9. 2021 12:31:49

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 697

Re: setDataArray hází chybu CannotConvertException

Funguje mi to když je proměnná Pole definována jako oblast dat. Tedy stejným způsobem se definuje jako potom vkládá.
zdroj = listCSV.getCellRangeByName("A1:B99").getDataArray
sObjednavky.getCellRangeByName("A1:B99").setDataArray(zdroj)

nějak takto, obávám se, že to jinak nepobere. (je to i citlivé na velikost oblasti, musí být v obou případech zcela shodná)


Edit: Ještě koukám že tam máte Oblast = ... To zkuste umazat, nenačítáte proměnnou ale vkládáte data (provádíte příkaz)

Ed2: Zkuste toto:
Pole = Array(0,1,2,3).getDataArray   
oSheet.getCellRangeByName("A1:A4").setDataArray(Pole)

Editoval ludviktrnka (23. 9. 2021 12:55:41)


LibreOffice 5.4.

Offline

#3 23. 9. 2021 13:18:53

ogast
Člen
Registrace: 23. 9. 2021
Příspěvků: 4
Web

Re: setDataArray hází chybu CannotConvertException

Zdravím,
Pole = Array(0,1,2,3).getDataArray bohužel není funkcí mého VBScriptu, takže zde skončí chybou.
Smazáním "Oblast=" se nestala žádná změna, respektive hází stále stejnou chybu o konverzi. Budu mezitím hledat a zkoušet nějaká řešení wink
Bohužel definice zdroj = listCSV.getCellRangeByName("A1:B99").getDataArray je pro mě zbytečná, protože vkládané pole bude pokaždé jiného rozměru a vždy bude vytvořen nový soubor, zápis do stávajícího nikoliv.
Každopádně díky wink


LibreOffice 7.1.4.2

Offline

#4 23. 9. 2021 13:43:01

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 697

Re: setDataArray hází chybu CannotConvertException

pole různých rozměrů nemůžete definovat "A1:A4" :-) je potřeba použít zřejmě definici oSheet.getCellRangeByPosition(C1 , R1 , C2, R2).getDataArray

ale moc nechápu proč by se nedal použít standardní zápis třeba v cyklu
For i = 0 to 3
oSheet.getCellByPosition(0 , i).Value = i
Next i

případně nějaký variabilnější cyklus pokud má jít o nějaké proměnlivé délky.


Edit: Případně
Pole = Array("x","y","z","ž")
For i = 0 to 3
oSheet.getCellByPosition(0 , i).String = pole(i)
Next i

Editoval ludviktrnka (23. 9. 2021 13:49:45)


LibreOffice 5.4.

Offline

#5 23. 9. 2021 13:51:33

kamlan
Člen
Registrace: 15. 9. 2016
Příspěvků: 368

Re: setDataArray hází chybu CannotConvertException

Musíte mít pole polí array( array(...), array(...) ... )

Sub vlozData
	dim oDoc as object, oSheet as object, pole(), oRange as object
	oDoc=StarDesktop.LoadComponentFromUrl("private:factory/scalc", "_blank", 0, array()) 'nový sešit
	oSheet=oDoc.Sheets(0) 'první list
	oRange=oSheet.getCellRangeByName("A1:A4") 'oblast
	'setDataArray požaduje pole polí
	pole=array( array("zdar"), array("ahoj"), array("čus"), array("jde to") ) 'pole polí pro sloupec
	oRange.setDataArray(pole)
	
	pole=array( array(1, 2, 3, 4, 5) ) 'pole polí pro řádek
	oRange=oSheet.getCellRangeByName("A6:E6") 'oblast
	oRange.setDataArray(pole)
	
	pole=array( array("aaa", "bbb"), array("ccc", "ddd") ) 'pole polí pro "matici"
	oRange=oSheet.getCellRangeByName("G9:H10")
	oRange.setDataArray(pole)
End Sub

Editoval kamlan (23. 9. 2021 13:52:27)

Offline

#6 23. 9. 2021 14:13:42

ogast
Člen
Registrace: 23. 9. 2021
Příspěvků: 4
Web

Re: setDataArray hází chybu CannotConvertException

ludviktrnka - "A1:A4" byl pouze test, následně chci použít pro proměnlivou velikost pole právě jak říkáte getCellRangeByPosition. Cyklus for lze použít, ale zpozdí vlákno (thread) procesu. Budu operovat s desetitísícemi buňkami proto lepší SetDataArray.

kamlan - pole polí opravdu zafungovalo, tak vám velice děkuji wink

A přeji všem krásný den.

Editoval ogast (23. 9. 2021 14:26:27)


LibreOffice 7.1.4.2

Offline

#7 23. 9. 2021 16:07:33

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: setDataArray hází chybu CannotConvertException

ogast napsal(a)

Ahoj, níže mám skriptík psaný v Basic Scriptu (softwaru třetí strany), úplně na konci zaremované getCellByPosition(1, 1) mi funguje bezproblému. Problém nastane, když chci uložit pole pomocí setDataArray. Hlásí, že konverze není možná, už jsem zkoušel do arraye vkládat stringy, longy, hledal jsem na cizích fórech, opravdu už nemám řešení, jak to vyřešit. Díky moc za tipy.
.......

Pole = Array(0,1,2,3)   
Oblast = oSheet.getCellRangeByName("A1:A4").setDataArray(Pole)

'níže zaremované mi funguje bezproblému
'oSheet.getCellByPosition(1, 1).Value = 222

'uložení
bDone = oDoc.storeAsURL("file:///" & sFilePath, arg)

______________________________________________________________________
     Tady jde o nejméně 2 různé záležitosti.


1. Buňka
'níže zaremované mi funguje bezproblému
'oSheet.getCellByPosition(1, 1).Value = 222
     Toto je deklarace jedné buňky. To lze udělat různými zúůsoby :


Sub DeklaraceBunky_1
Dim oSheet
Sheets = ThisComponent.getSheets()
oSheet = Sheets.getByName("List1")
'n = oSheet.getCellByPosition(48,1).Value
'oSheet = thisComponent.Sheets(0)
oSheet.getCellByPosition(48,1).Value = 4
oSheet.getCellRangeByName("A1").String = "Input Data"
oSheet.getCellRangeByName("A2").Value = 4
oSheet.getCellRangeByName("A3").Value = 5
oSheet.getCellRangeByName("A4").Formula = "=A2*A3"
End Sub


Sub Deklaracebunky_2
Dim Doc As Object
Dim Sheet As Object
Dim Cell As Object
Doc = ThisComponent
Sheet = Doc. Sheets ( 0 )
Cell = Sheet. getCellByPosition ( 0 , 0 )
Cell. Value = 100
Cell = Sheet. getCellByPosition ( 0 , 1 )
Cell. String = 1000
Cell = Sheet. getCellByPosition ( 0 , 2 )
Cell. Formula = "=A1+A2"
MsgBox Cell. Value
End Sub


2. pole
Pole = Array(0,1,2,3)   
Oblast = oSheet.getCellRangeByName("A1:A4").setDataArray(Pole)
     Pole jsou celkem dost různá a celkem i exotická.


Příklad : Pole = Array(0,1,2,3)    je pole jednoho řádku (1D) které se častěji deklaruje například
Dim Pole(4), nebo Pole(0 to 4). Postup výše už přímo vkládá hodnoty do pole ve formě "stringů". A to je další věc, pole může být daklarováno podle typu. například string, integer, ale nejčastěji se doporučuje Variant - to umí vše, ale speciály na stringy, nebo čísla jsou rychlejší.
     Dobrým počinem je "split" a "Merge" když je potřeba například ubrat, nebo přidat prvek doprostřed pole. Jinak se musí vkládat pouze nakonec a data přehazovat vidlemi po jednom.


Příklad pro pole jednoho sloupce (1D) není popsán přehledně. Běžně se deklaruje pro jeden sloupec takto :
Dim Pole(0,4), nebo podobně. Jde přesně o jeden sloupec.
     Pokud se zadeklaruje Více například Pole(3,4), jde o matici 4 x 5.


Pokud se uvádí "Pole polí", tak to má ten efekt, že jednotlivá pole nemusí být stejně dlouhá příklad :
Dim Pole(0,array()) as variant
Pole(0)(0) = array(1, 2, 3)
Pole(1)(0) = array("a", "b", "c", "d", "f")
Pole(2)(0) = array(1 To 31)
Pole(2)(1) = array(7) - tohle už chápeme jako 3. dimenzi (3D), přestože "pravé" 3D by mělo vypadat takto :
Dim Pole(0,0,Array()), nebo Pole(array(),array(),array()).
    Pokud jsou uvedy rozměry, jde o fixní velikost 2D (3D) (x,y), respektive (x,y,z). Pole mohou být i vícerozměrná, ale nevím jestli s tím má problém StarBasic, nebo uživatel. Z pohledu na kód vypadá vše jako řádky, ale grafická představa je zřejmá jen u 1D a 2D, kterou umíme vlepit jako řádek a sloupec, nebo dvojrozměrnou tabulku. Trojrozměrné pole už si nikdo v sešitě nedovede představít, nebo ano, ale každý jinak.


     Já už ze zadání vidím, že někdo namíchal kód VB, nebo VBA a zřejmě kód Starbasic, nebo jiného Basicu. MS používalo kdysi ještě obecný Basic, ale nevím jaká by byla dnes podpora. Takže ten kód může být starý a z jiného, nežli StarBasicu.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#8 23. 9. 2021 18:23:32

ogast
Člen
Registrace: 23. 9. 2021
Příspěvků: 4
Web

Re: setDataArray hází chybu CannotConvertException

Neutr:
VBScript, ve kterém píši je podmnožina VBA, a nenabízí všechny vymoženosti jako u Visual Basic a VBA. Čistý VBScript nemůže přistupovat k paměti počítače ani vytvářet nebo pracovat se soubory na disku. Prakticky všechny příkazy, které byly nějakým způsobem "nebezpečné" (to znamená, že mohly být použity k vytvoření viru), byly odstraněny.

K LibreOffice jsem byl nucen přejít nedávno a ještě se v něm některé věci učím. Jinak Excel mi přijde tolerantnější a sežere mi i klidně tento zápis:

Dim nRow, nCol, aData(10,1000) 'deklarace pole, jen ukázka bez naplnění hodnot
nRow  = UBound(aData,1)
nCol  = UBound(aData,2)
oSheet.Range("A1").Resize(nRow, nCol).Value = aData 'Od buňky A1 vloží pole

Díky jinak za velice podrobné vysvětlění wink

Editoval ogast (23. 9. 2021 18:26:12)


LibreOffice 7.1.4.2

Offline

Zápatí