Forum » Programiranje » [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:
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?
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)
NEXTKlic 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 ...
| Tema | Ogledi | Zadnje sporočilo | |
|---|---|---|---|
| Tema | Ogledi | Zadnje sporočilo | |
| » | [Java]Client/Server preko socketaOddelek: Programiranje | 2162 (1998) | KernelPanic |
| » | [Java] Urejanje baze z JTableOddelek: Programiranje | 1167 (951) | vonNeumann |
| » | [Visual C#] TableAdapterOddelek: Programiranje | 1319 (1195) | detroit |
| » | Javascript - izračun razlike v datumihOddelek: Programiranje | 2154 (2009) | kogledom |
| » | upload datotek in shranjevanje v mdbOddelek: Izdelava spletišč | 1381 (1149) | Looooooka |