Как стать автором
Обновить

Дружим C# и OpenOffice.org

Время на прочтение4 мин
Количество просмотров15K
Не судите строго, это моя первая статья

На работе поставили задачу — написать бюджетный вариант для моей программы (ранее для отчетов использовали MS Office). Сильно озадачился, из — за нехватки материалов по данной теме, так как все материалы разбросаны по разным блогам, и они все в основном на английском. Сегодня я решил поделиться своим, пусть и небольшим опытом в данной проблеме.

Первое что нам нужно, чтобы «воссоединить» C# и OOo3 — это библиотеки “CLI_*.dll”, для работы нашей программы с OpenOffice.org. В OpenOffice.org 2 они поставляются и устанавливаются вместе офисом, в дистрибутиве 3его же, они не устанавливаются. Так что берем и вытаскиваем их (все CLI_*.dll библиотеки) ручками из архива [openofficeorg1.cab] OOo3 (при установке все архивы извлекаются в выбранное вами место), добавляем их в References своего проекта. При добавлении важно отметить для каждой библиотеки Copy Local и Specific Version значения в false!
Также на этом “мучения” с OOo3 не заканчиваются. Далее немного кода специфичного для работы с OOo3:
Список namespace'ов:

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.IO;

//OOo 3
using unoidl.com.sun.star.lang;
using UNO = unoidl.com.sun.star.uno;
using unoidl.com.sun.star.bridge;
using unoidl.com.sun.star.frame;
using OOo = unoidl.com.sun.star;

using Microsoft.Win32;
using System.Runtime.InteropServices;


* This source code was highlighted with Source Code Highlighter.


  private void InitOO3Env()
  {
  string baseKey = "";

  if (Marshal.SizeOf(typeof(IntPtr)) == 8) baseKey = @"SOFTWARE\Wow6432Node\OpenOffice.org\";
  else
  baseKey = @"SOFTWARE\OpenOffice.org\";

  // Get the URE directory
  string key = baseKey + @"Layers\URE\1";
  RegistryKey reg = Registry.CurrentUser.OpenSubKey(key);
  if (reg == null) reg = Registry.LocalMachine.OpenSubKey(key);
  string urePath = reg.GetValue("UREINSTALLLOCATION") as string;
  reg.Close();
  urePath = Path.Combine(urePath, "bin");

  // Get the UNO Path
  key = baseKey + @"UNO\InstallPath";
  reg = Registry.CurrentUser.OpenSubKey(key);
  if (reg == null) reg = Registry.LocalMachine.OpenSubKey(key);
  string unoPath = reg.GetValue(null) as string;
  reg.Close();

  string path;

  string sysPath = System.Environment.GetEnvironmentVariable("PATH");
  path = string.Format("{0};{1}", System.Environment.GetEnvironmentVariable("PATH"), urePath);
  System.Environment.SetEnvironmentVariable("PATH", path);
  System.Environment.SetEnvironmentVariable("UNO_PATH", unoPath);
  }

* This source code was highlighted with Source Code Highlighter.


Код выше производит так называемую “инициализацию” OOo3 (устанавливает переменные окружения для OOo3). “Инициализацию” следует проводить при каждом запуске программы, так как переменная PATH не сохраняется.

Теперь можно и работать с OOo (для версии 2 и выше[Версии ранее не пробывал просто]):
//Проверяем установлен ли?
private bool isOOoInstalled()
{
string baseKey;
// Для 64 битной версии
if (Marshal.SizeOf(typeof(IntPtr)) == 8) baseKey = @"SOFTWARE\Wow6432Node\OpenOffice.org\";
else
baseKey = @"SOFTWARE\OpenOffice.org\";
string key = baseKey + @"Layers\URE\1";
RegistryKey reg = Registry.CurrentUser.OpenSubKey(key);
if (reg == null) reg = Registry.LocalMachine.OpenSubKey(key);
string urePath = reg.GetValue("UREINSTALLLOCATION") as string;
reg.Close();
if (urePath != null) return true;
else
return false;
}
//Соединияемся с фабрикой (чтобы создавать \ открывать документы)
private OOo.lang.XMultiServiceFactory uno_connect(String[] args)
{
InitOO3Env();
unoidl.com.sun.star.uno.XComponentContext m_xContext m_xContext = uno.util.Bootstrap.bootstrap();
if (m_xContext != null)
return (OOo.lang.XMultiServiceFactory)m_xContext.getServiceManager();
else
return null;
}
//Создаем \ загружаем документ Calc

private unoidl.com.sun.star.sheet.XSpreadsheetDocument OOo3_initCalcDocument(string filePath, bool newDoc)
{

XComponentLoader aLoader;
XComponent xComponent = null;
string url = newDoc ? "private:factory/scalc" : @"file:///" + filePath.Replace(@"\", @"/");
try
{
aLoader = (XComponentLoader)
mxMSFactory.createInstance("com.sun.star.frame.Desktop");

xComponent = aLoader.loadComponentFromURL(
/*"private:factory/scalc"*/ url, "_blank", 0,
new unoidl.com.sun.star.beans.PropertyValue[0]);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return (OOo.sheet.XSpreadsheetDocument)xComponent;

}

//Создаем \ загружаем документ Writer

private OOo.text.XTextDocument OOo3_initWriterDocument(string filePath, bool newDoc)
{

XComponentLoader aLoader;
XComponent xComponent = null;
string url = newDoc? «private:factory/swriter»: @«file:///» + filePath.Replace(@"\", @"/");
try
{
aLoader = (XComponentLoader)
mxMSFactory.createInstance(«com.sun.star.frame.Desktop»);

xComponent = aLoader.loadComponentFromURL(
url, "_blank", 0,
new unoidl.com.sun.star.beans.PropertyValue[0]);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return (OOo.text.XTextDocument)xComponent;
}


* This source code was highlighted with Source Code Highlighter.

Вот и все!
Теги:
Хабы:
Всего голосов 64: ↑55 и ↓9+46
Комментарии16

Публикации

Работа

.NET разработчик
43 вакансии

Ближайшие события