2

OOoForum.org 上的讨论

在 python 中,使用 pyuno,我可以这样做:

table = self.model.createInstance("com.sun.star.text.TextTable")

这似乎在 C# 中不起作用。这是我的测试代码(我意识到我可能不需要所有那些 using 语句,但我正在改编别人的代码):

using System;
using unoidl.com.sun.star.lang;
using unoidl.com.sun.star.uno;
using unoidl.com.sun.star.bridge;
using unoidl.com.sun.star.frame;
using unoidl.com.sun.star.document;
using unoidl.com.sun.star.text;
using unoidl.com.sun.star.container;
using unoidl.com.sun.star.util;
using unoidl.com.sun.star.table;
using unoidl.com.sun.star.beans;

namespace FromScratch
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            XComponentContext componentContext =
                uno.util.Bootstrap.bootstrap();
            XMultiServiceFactory multiServiceFactory = (XMultiServiceFactory)
                componentContext.getServiceManager();
            XTextDocument document;
            XComponentLoader loader = (XComponentLoader)
                multiServiceFactory.createInstance
                    ("com.sun.star.frame.Desktop");
            document = (XTextDocument) loader.loadComponentFromURL
                ("private:factory/swriter", "_blank", 0,
                 new PropertyValue[0]);

            XText text = document.getText();
            XTextCursor cursor = text.createTextCursor();

            XTextTable table = (XTextTable)
                multiServiceFactory.createInstance
                    ("com.sun.star.text.TextTable");
            table.initialize(2, 2);
            text.insertTextContent(cursor, table, false);

        }
    }
}

大部分似乎都可以正常工作,但是当它到达这一行时:

table.initialize(2, 2);

我收到运行时错误:

Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object
  at FromScratch.MainClass.Main (System.String[] args) [0x00063] in /home/matthew/Desktop/OpenOfficeSample/FromScratch/Main.cs:37

显然,这一行:

XTextTable table = (XTextTable)
    multiServiceFactory.createInstance
    ("com.sun.star.text.TextTable");

实际上并没有将 table 设置为任何东西。

这里发生了什么?

4

1 回答 1

2

解决方案(来自OOoForum.org):

您必须从文档多服务工厂获取文本表,而不是从服务管理器的多服务工厂获取。您可以通过将您的文档(模型)转换为 XMultiServiceFactory 并调用其 createInstance 方法来做到这一点。

XTextTable table = (XTextTable) 
    ((XMultiServiceFactory)document).createInstance 
    ("com.sun.star.text.TextTable");

请参阅开发指南

于 2009-10-18T18:01:43.303 回答