» »

[OpenOffice.Org - Writer] Označitev vrstice tabele in Copy / Paste

[OpenOffice.Org - Writer] Označitev vrstice tabele in Copy / Paste

WarpedGone ::

Obstaja brainfuck in obstaja OpenOffice API. Prvo je hec, drugo je pa žalosten primerek takega heca v praksi. Že četrti dan se zaj***m s stvarjo za katero bi pričakoval da mi bo vzela par ur, največ kak dan, dela. :'( Sej vem, nesposobn sm js, OOo je pa višek tehnološkega napredka, kar ne spremeni dejstva da mi kljub googlanju in ugibanju in buljenju v reference to še vedno ni ratalo naredit.

Preko OLE moram namrečt avtomatizirat OOo Writer. V dokumentu imam tabelo v kateri moram programsko skopirat zadnjo vrstico in zamenjati vrednosti v njenih poljih. Nekako mi je uspelo pogruntat, kako dobit posamezno tabelo v dokumentu, kako dobit zadnjo vrstico, kako dodajat novo vrstico. Uspelo mi je tut stuhtat mehanizem kopiranja celotne vsebine na clipboard in ponovnega pastanja.

Problem pa ostaja:
- kako programsko izbrat celo vrstico tabele da jo bo dispatch uno:copy res skopiral na clipboard
- kako dosečt da se bo vsebina clipboarda spastala kot zadnja vrstica obstoječe tabele

Trenutno mam tole:
objTables = i_ole_doc.getTextTables()
OLEObject objTables
Any l_Separators[]
LONG ll_count
objTables = i_ole_doc.getTextTables()
FOR ll_i = 0 TO objTables.GetCount() - 1
	// dobimo tabelo
	objTable = objTables.getByIndex(ll_i)
	// dobimo vse vrstice v tej tabeli
	objRows= objTable.getRows()
	// dobimo zadnjo vrstico
	objRow = objRows.getByIndex(objRows.getCount() - 1)
	// dobimo separatorje v tej vrstici
	l_Separators = objRow.TableColumnSeparators	
	// ugotovimo število polj v vrstici
	ll_count = Upperbound(l_Separators) + 1
	// v prvi celici zadnje vrstice ustvarimo kurzor
	objCellCursor = objTable.createCursorByCellName("A" + String(objRows.getCount() - 1))
	// izberemo vse celice v tej vrstici
	objCellCursor.goRight(ll_count, True)
//	objCellCursor.mergeRange()
	// označene celice skopiramo na clipboard
	oDispatcher.executeDispatch(oFrame, ".uno:Copy",  "", 0, l_objPropertyValues)
	// paste
	oDispatcher.executeDispatch(oFrame, ".uno:Paste",  "", 0, l_objPropertyValues)	
	oDispatcher.executeDispatch(oFrame, ".uno:Paste",  "", 0, l_objPropertyValues)
NEXT


Klic mergeRange združi dve polji v zadnji in predzadnji vrstici (sicer bi glede na en forum moral združit vsa polja v zadnji vrstici ampak pustmo to) torej je nekaj celic izbranih. Klic uno:Copy teh izbranih celic NE skopira, ker naslednja dva uno:Paste ukaza v dokument skopirata predhodnjo vsebino clipboarda.

Tole morm sicer speljat v PowerBuilderju, ampak kak primer v javi, vbs, c++ itd bi bil povsem uporaben.

Anyone?
Zbogom in hvala za vse ribe

WarpedGone ::

OK, mi je ratalo stuhtat. Trik je ViewCursor. Treba je vizualno označit stvari, da jih Copy zagrabi. Tule je koda, če bo kdo kdaj iskal.
OLEObject oVC, objTable, oDispatcher
Any l_objPropertyValues[]
Any l_Separators[]

l_objPropertyValues[1] = i_objServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
oDispatcher = i_objServiceManager.createInstance("com.sun.star.frame.DispatchHelper")

// we need ViewCursor to visualy select content
oVC = i_ole_doc.getCurrentController.getViewCursor()

// get first table in a document
objTable = i_ole_doc.getTextTables().getByIndex(1)

// get cell separators from last row
l_Separators = objTable.getRows().getByIndex(objTable.getRows().getCount() - 1).TableColumnSeparators	

// figure out the cell count
ll_count = Upperbound(l_Separators) + 1

// step into first cell in last row - via VIEW CURSOR
oVC.gotoRange(objTable.getCellByName("A" + String(objTable.getRows().getCount())).createTextCursor(),FALSE)	
i_ole_doc.CurrentController.Frame.getContainerWindow().Setfocus()

// select all cells in this last row
oVC.goRight(ll_count, true)

// copy to clipboard
oDispatcher.executeDispatch(i_ole_doc.CurrentController.Frame, ".uno:Copy",  "", 0, l_objPropertyValues)

// add one row to the table
objTable.getRows().insertByIndex(objTable.getRows().getCount(), 1)

// step into first cell in this new last row
oVC.gotoRange(objTable.getCellByName("A" + String(objTable.getRows().getCount())).createTextCursor(),FALSE)
i_ole_doc.CurrentController.Frame.getContainerWindow().Setfocus()

// select all cells in last row
oVC.goRight(ll_count, true)

// paste from clipboard
oDispatcher.executeDispatch(i_ole_doc.CurrentController.Frame, ".uno:Paste",  "", 0, l_objPropertyValues)
Zbogom in hvala za vse ribe


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Java]Client/Server preko socketa

Oddelek: Programiranje
91795 (1631) KernelPanic
»

[Java] Urejanje baze z JTable

Oddelek: Programiranje
81020 (804) vonNeumann
»

[Visual C#] TableAdapter

Oddelek: Programiranje
61149 (1025) detroit
»

Javascript - izračun razlike v datumih

Oddelek: Programiranje
81928 (1783) kogledom
»

upload datotek in shranjevanje v mdb

Oddelek: Izdelava spletišč
101265 (1033) Looooooka

Več podobnih tem