JavaScriptマクロでのCalc操作について †
ページ | OpenOffice.org FAQの登録ページ |
---|---|
投稿者 | new_OOo3 |
分類 | |
優先順位 | |
状態 | |
カテゴリー | |
投稿日 | 2010-06-18 20:42:58 (金) |
OS | WindowsXP |
依存するページ | |
バージョン |
メッセージ †
回答ページでは行末に「~」を付加する必要はありません |
お世話になります。
マクロ処理速度向上を目的としまして、以前にOpenOffice.org Basicにて作成しました「株価取得 for OpenOffice.org3」をJavaScriptマクロに置き換えたいと考えております。 しかしながら、webからのデータ受信処理速度が向上する事は分かったのですが、JavaScriptにて下記項目のCalc操作方法が分からず、Net検索にてJavaからのCalc操作方法を参考にして色々と試みましたが上手くいきません。 つきましては、以下に記しますCalc操作をJavaScriptにて行う方法をご教示頂けます様お願いします。
[ 質問 ]
1)Active CellのAddress(列番号、行番号)の取得
2)任意の列のdata最終行番号の取得
3)Web SiteへのHyperKink設定
本件につきましては、Pythonにて実現可能ならばPythonのCodeをご教示頂けます様お願いします。
宜しくご回答頂けます様お願いします。
1 †
はにゃ? (2010-06-18 23:37:18 (金))
その 1。アクティブセルってどこでしたかねぇ・・・。
JavaScriptimportClass(Packages.com.sun.star.uno.UnoRuntime); importClass(Packages.com.sun.star.frame.XModel); importClass(Packages.com.sun.star.lang.XServiceInfo); importClass(Packages.com.sun.star.sheet.XCellRangeAddressable); importClass(Packages.com.sun.star.awt.XWindowPeer); importClass(Packages.com.sun.star.awt.XWindow); importClass(Packages.com.sun.star.awt.XMessageBoxFactory); importClass(Packages.com.sun.star.awt.Rectangle); // shows message in the message box function showMessage(xDesktop, message) { xFrame = xDesktop.getCurrentFrame(); xWindow = xFrame.getContainerWindow(); xWindowPeer = UnoRuntime.queryInterface(XWindowPeer, xWindow); xToolkit = xWindowPeer.getToolkit(); xMessageboxFactory = UnoRuntime.queryInterface(XMessageBoxFactory, xToolkit); xMessageBox = xMessageboxFactory.createMessageBox(xWindowPeer, new Rectangle(), 'messbox', 1, "", message); return xMessageBox.execute(); } oDoc = UnoRuntime.queryInterface(XModel,XSCRIPTCONTEXT.getInvocationContext()); if ( !oDoc ) oDoc = XSCRIPTCONTEXT.getDocument(); xModel = UnoRuntime.queryInterface(XModel, oDoc); obj = xModel.getCurrentSelection(); xServiceInfo = UnoRuntime.queryInterface(XServiceInfo, obj); if (xServiceInfo != null) { xCellRange = null; if (xServiceInfo.supportsService("com.sun.star.sheet.SheetCellRange")) { xCellRangeAddressable = UnoRuntime.queryInterface(XCellRangeAddressable, obj); aRangeAddress = xCellRangeAddressable.getRangeAddress(); result = "Column: " + aRangeAddress.EndColumn + "\n" + "Row: " + aRangeAddress.EndRow; showMessage(XSCRIPTCONTEXT.getDesktop(), result); } }
Pythonfrom com.sun.star.awt import Rectangle def show_message(desktop, message): """shows message.""" frame = desktop.getCurrentFrame() window = frame.getContainerWindow() toolkit = window.getToolkit() msgbox = toolkit.createMessageBox( window, Rectangle(), 'messbox', 1, '', message) return msgbox.execute() def get_active_cell(): doc = XSCRIPTCONTEXT.getDocument() selected = doc.getCurrentSelection() try: if selected.supportsService('com.sun.star.sheet.SheetCellRange'): addr = selected.getRangeAddress() txt = 'Column: %s\nRow: %s' % (addr.EndColumn, addr.EndRow) show_message(XSCRIPTCONTEXT.getDesktop(), txt) except: pass
2 †
はにゃ? (2010-06-18 23:41:42 (金))
その 2。任意の列のdata最終行番号の取得
JavaScriptimportClass(Packages.com.sun.star.uno.UnoRuntime); importClass(Packages.com.sun.star.frame.XModel); importClass(Packages.com.sun.star.lang.XServiceInfo); importClass(Packages.com.sun.star.sheet.XCellRangeAddressable); importClass(Packages.com.sun.star.awt.XWindowPeer); importClass(Packages.com.sun.star.awt.XWindow); importClass(Packages.com.sun.star.awt.XMessageBoxFactory); importClass(Packages.com.sun.star.awt.Rectangle); importClass(Packages.com.sun.star.table.XCellRange); importClass(Packages.com.sun.star.table.XColumnRowRange); importClass(Packages.com.sun.star.table.XTableColumns); importClass(Packages.com.sun.star.sheet.XSpreadsheet); importClass(Packages.com.sun.star.sheet.XSpreadsheetDocument); importClass(Packages.com.sun.star.sheet.XSpreadsheets); importClass(Packages.com.sun.star.container.XIndexAccess); importClass(Packages.com.sun.star.sheet.XSheetCellRanges); importClass(Packages.com.sun.star.sheet.CellFlags); importClass(Packages.com.sun.star.sheet.XCellRangesQuery); // shows message in the message box function showMessage(xDesktop, message) { xFrame = xDesktop.getCurrentFrame(); xWindow = xFrame.getContainerWindow(); xWindowPeer = UnoRuntime.queryInterface(XWindowPeer, xWindow); xToolkit = xWindowPeer.getToolkit(); xMessageboxFactory = UnoRuntime.queryInterface(XMessageBoxFactory, xToolkit); xMessageBox = xMessageboxFactory.createMessageBox(xWindowPeer, new Rectangle(), 'messbox', 1, "", message); return xMessageBox.execute(); } // column index to find its last row index nColumn = 3; nSheet = 0; // content flags nFlags = CellFlags.VALUE + CellFlags.DATETIME + CellFlags.STRING + CellFlags.ANNOTATION + CellFlags.FORMULA + CellFlags.HARDATTR + CellFlags.STYLES + CellFlags.OBJECTS + CellFlags.EDITATTR + CellFlags.FORMATTED; oDoc = UnoRuntime.queryInterface(XModel,XSCRIPTCONTEXT.getInvocationContext()); if ( !oDoc ) oDoc = XSCRIPTCONTEXT.getDocument(); // get sheets xSpreadsheetDocument = UnoRuntime.queryInterface(XSpreadsheetDocument, oDoc); xSpreadsheets = xSpreadsheetDocument.getSheets(); xIndexAccess = UnoRuntime.queryInterface(XIndexAccess, xSpreadsheets); xSpreadsheet = UnoRuntime.queryInterface(XSpreadsheet, xIndexAccess.getByIndex(nSheet)); // get cellrange including entire column specified by the column index xColumnRowRange = UnoRuntime.queryInterface(XColumnRowRange, xSpreadsheet); xTableColumns = xColumnRowRange.getColumns(); xIndexAccess_2 = UnoRuntime.queryInterface(XIndexAccess, xTableColumns); xCellRange = UnoRuntime.queryInterface(XCellRange, xIndexAccess_2.getByIndex(nColumn)); // get list of used cell xCellRangesQuery = UnoRuntime.queryInterface(XCellRangesQuery, xCellRange); xSheetCellRanges = xCellRangesQuery.queryContentCells(nFlags); n = 0 addresses = xSheetCellRanges.getRangeAddresses(); // find biggest row index for (i = 0; i < xSheetCellRanges.getCount(); i++) { address = addresses[i]; if (n < address.EndRow) { n = address.EndRow; } } showMessage(XSCRIPTCONTEXT.getDesktop(), "index of used last row: " + n);
Pythonfrom com.sun.star.sheet.CellFlags import (VALUE, DATETIME, STRING, ANNOTATION, FORMULA, HARDATTR, OBJECTS, EDITATTR, FORMATTED) def get_used_last_row_index(): """shows last used row index of specified column""" column_index = 3 sheet_index = 0 flags = VALUE + DATETIME + STRING + \ ANNOTATION + FORMULA + HARDATTR + OBJECTS + EDITATTR + FORMATTED doc = XSCRIPTCONTEXT.getDocument() sheet = doc.getSheets().getByIndex(sheet_index) column = sheet.getColumns().getByIndex(column_index) ranges = column.queryContentCells(flags).getRangeAddresses() n = 0 for r in ranges: if n < r.EndRow: n = r.EndRow show_message(XSCRIPTCONTEXT.getDesktop(), 'last row: %s' % n)
3 †
はにゃ? (2010-06-18 23:43:30 (金))
その 3。URL フィールドの挿入?
JavaScriptimportClass(Packages.com.sun.star.uno.UnoRuntime); importClass(Packages.com.sun.star.frame.XModel); importClass(Packages.com.sun.star.sheet.XSpreadsheetDocument); importClass(Packages.com.sun.star.sheet.XSpreadsheets); importClass(Packages.com.sun.star.sheet.XSheetCellRanges); importClass(Packages.com.sun.star.sheet.XCellRangesAccess); importClass(Packages.com.sun.star.lang.XMultiServiceFactory); importClass(Packages.com.sun.star.beans.XPropertySet); importClass(Packages.com.sun.star.text.XText); importClass(Packages.com.sun.star.text.XTextContent); importClass(Packages.com.sun.star.text.XSimpleText); importClass(Packages.com.sun.star.text.XTextCursor); oDoc = UnoRuntime.queryInterface(XModel,XSCRIPTCONTEXT.getInvocationContext()); if ( !oDoc ) oDoc = XSCRIPTCONTEXT.getDocument(); xMultiServiceFactory = UnoRuntime.queryInterface(XMultiServiceFactory, oDoc); // get cell xSpreadsheetDocument = UnoRuntime.queryInterface(XSpreadsheetDocument, oDoc); xSpreadsheets = xSpreadsheetDocument.getSheets(); xCellRangesAccess = UnoRuntime.queryInterface(XCellRangesAccess, xSpreadsheets); xCell = xCellRangesAccess.getCellByPosition(0, 0, 0); // create new link field field = xMultiServiceFactory.createInstance("com.sun.star.text.textfield.URL"); xPropSet = UnoRuntime.queryInterface(XPropertySet, field); xPropSet.setPropertyValue("URL", "http://oooug.jp/faq/index.php?faq/5/422"); xPropSet.setPropertyValue("Representation", "Link..."); xText = UnoRuntime.queryInterface(XText, xCell); xSimpleText = UnoRuntime.queryInterface(XSimpleText, xCell); xTextCursor = xSimpleText.createTextCursor(); // insert field into the cell xText.insertTextContent(xTextCursor, UnoRuntime.queryInterface(XTextContent, field), true);
Pythondef create_url_field(): """make url field.""" url = 'http://oooug.jp/faq/index.php?faq/5/422' text = 'Link!' doc = XSCRIPTCONTEXT.getDocument() # new URL field field = doc.createInstance('com.sun.star.text.textfield.URL') field.URL = url field.Representation = text # insert it cell = doc.getSheets().getCellByPosition(0, 0, 0) cell.insertTextContent(cell.createTextCursor(), field, False)
Perfectな回答を頂きましてありがとうございます。 †
new_OOo3 (2010-06-19 15:40:26 (土))
はにゃ? 様
毎回お世話になっております。
まさにPerfectな回答を頂きまして本当にありがとうございます。
PythonコードからJavaScriptコードを推測するつもりでPythonコードもお願いさせて頂いたのですが、JavaScript、Python共にご教示頂けるとは思ってもおりませんでした。
当方が約1カ月近くnet検索しても全く糸口も掴めなかった事を数時間でご回答を頂き、改めて「はにゃ?」様の知識に感服すると共に己の未熟さを痛感しました。
また、このようにJavaScriptコードとPythonコードを並べるとPythonの方がsimpleで処理速度も速いように思いました。
Pythonについても少しずつではありますが勉強しておりますので、また質問させて頂く事もあると思いますが宜しくお願いします。
本当にありがとうございました。