物置き

LibreOfficeで開いている表計算ドキュメントのシート一覧を列挙する

最近作っている自分用ツール から、LibreOfficeで開いている表計算ドキュメントのシート名一覧を列挙して、それを選択したら、そのシートをアクティブにしたうえで、ウインドウを前面に出す、みたいなことができたいかと思って調べたので以下に自分用のメモ

Excelでは同様のことが実現できているが、自宅ではLibreOfficeを使っているので同じことできないかと思って調べたらできそうであることがわかった。

とりあえず、JScriptで書いているが、あとでC++のCOMで使う形に書き換える

var factory = new ActiveXObject("com.sun.star.ServiceManager");
var loader = factory.createInstance("com.sun.star.frame.Desktop");

var docs = loader.getComponents();
var e = docs.createEnumeration();
while(e.hasMoreElements()) {
    var doc = e.nextElement();

    // ドキュメントのパス(URL)を取得
    WScript.Echo(doc.getURL());

    // シートオブジェクトを取得
    var sheets = doc.getSheets();

    // シート数を得る
    var sheetCount = sheets.getCount();
    WScript.Echo(sheetCount);

    // シート名を列挙する
    for (var i = 0; i < sheetCount; ++i) {
        var sheet = sheets.getByIndex(i);
        WScript.Echo(sheet.name);
    }

    // アクティブなワークシートを変える
    var controller = doc.getCurrentController();
    if (sheetCount >= 4) {
        // 例えば、4番目のワークシートをアクティブにする
        controller.setActiveSheet(sheets.getByIndex(3));
    }

    var frame = controller.getFrame();

    // ウインドウを前面に出す
    // ※ ただし、今日の環境だと、タスクバー上のCalcのアイコンが点滅するだけになってしまう。
    frame.getContainerWindow().toFront();
}
  • 多分ここで列挙されるドキュメントは表計算以外のドキュメントも含まれる形になるはず
    • 種類を判別する方法はあるはずだけど調べていない。とりあえずドキュメントパスの拡張子でも判断できそうな気も
  • ウインドウを前面に出すのはtoFront()を使うのではなく、ウインドウハンドルを探して、AttachThreadInput()SetForegroundWindow()でいけるはず
    • 確実じゃないかもしれないけど、ドキュメントパスとウインドウタイトルを見れば見つけられそうな気がしている