Работа с LibreOffice из C#

Потребовалось управлять libreoffice writer/calc из visual c# wpf. C Microsoft Word/Excel это уже делал через Microsoft.Office.Interop Скиньте, пожалуйста, ссылку на пошаговую инструкцию, как связать visual c# wpf и libreoffice. Описание функций и, если можно, примеры. Запустить, открыть файл (или создать новый) изменить содержимое, сохранить. Как я понимаю, все должно быть примерно так как с Microsoft.Office.Interop Помогите, кто чем может!


Ответы (1 шт):

Автор решения: Reidenschi

В статье автор через C# создает пустой документ LibreOffice Calc и заполняет ячейки А1 и В2 данными.

Проверил лично, метод работает.

Обязательно установите LibreOffice SDK и подключите ссылки к своему проекту.

    using System;
//
// UNO references needed:
// cli_basetypes, cli_cppuhelper, cli_oootypes.dll, cli_uno, cli_ure, cli_uretypes.
//
using unoidl.com.sun.star.uno;
using unoidl.com.sun.star.lang;
using unoidl.com.sun.star.frame;
using unoidl.com.sun.star.beans;
using unoidl.com.sun.star.sheet;
using unoidl.com.sun.star.container;
using unoidl.com.sun.star.table;
using unoidl.com.sun.star.text;

namespace con_03
{
  class Program
  {
    static void Main (string [] args)
    {
      Console.WriteLine ("Hello Scalc!");

      XComponentContext ctx = uno.util.Bootstrap.bootstrap ();
      XMultiServiceFactory srv_manager = (XMultiServiceFactory)ctx.getServiceManager ();
      XComponentLoader component_loader = (XComponentLoader)srv_manager.createInstance ("com.sun.star.frame.Desktop");
      string url = @"private:factory/scalc";
      XComponent component = component_loader.loadComponentFromURL (url, "_blank", 0, new PropertyValue [0]);

      XSpreadsheetDocument document = (XSpreadsheetDocument)component;
      XSpreadsheets sheets = document.getSheets ();
      XIndexAccess sheets_index = (XIndexAccess)sheets;
      XSpreadsheet sheet = (XSpreadsheet)sheets_index.getByIndex (0).Value;

      XCell c1 = sheet.getCellByPosition (0, 0);
      ((XText)c1).setString ("BlaBla");

      XCell c2 = sheet.getCellByPosition (1, 1);
      c2.setValue (123);
    }
  }
}
→ Ссылка