「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:2
昨日:0
総数:2832
現在:4


JavaScriptマクロでのCalc操作について

ページOpenOffice.org FAQの登録ページ
投稿者new_OOo3
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2010-06-18 20:42:58 (金)
OSWindowsXP
依存するページ
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

お世話になります。

マクロ処理速度向上を目的としまして、以前に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。アクティブセルってどこでしたかねぇ・・・。
JavaScript

importClass(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);
  }
}



Python

from 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最終行番号の取得

JavaScript

importClass(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);


Python

from 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 フィールドの挿入?

JavaScript

importClass(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);


Python

def 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についても少しずつではありますが勉強しておりますので、また質問させて頂く事もあると思いますが宜しくお願いします。

本当にありがとうございました。

お名前:
題名: