Найдено на: http://www.i-rs.ru/article/articleprint/144/-1/55/ |
Программирование для OpenOffice на C# / .net |
|
Я думаю, что множество принимающих решения IT специалистов компаний думают о переходе с Microsoft Office на OpenOffice, потому что они смогут сэкономить много денег и начиная с версии 2.0 OpenOffice, там действительно отсутствует потребность в обучении служащих.
Обращение с графическим интерфейсом начиная с OpenOffice 2.0 очень напоминает Microsoft Office. Итак, почему они не переходят на OpenOffice? Я предполагаю, что они влюблены в Microsoft Office, потому что они имеют слишком много домашних IT-решений, которые для работы требуют Microsoft Office. Если бы эти решения можно было изменить, чтобы они принимались и Microsoft Office и OpenOffice, я думаю много компаний, перешло бы! Хорошо, это потребует некоторых временных затрат на разработку, а так также денег, чтобы осуществить это. Начиная с версии 2.0 OpenOffice, эта стоимость может быть сведена к минимуму, потому что OpenOffice предложил начиная с этой версии программный интерфейс, основанный на .net. Он представлен CLI сборкой, которая является частью каждой установки OpenOffice. Весьма легко для .net разработчика сослаться на эти сборки и написать приложения, которые общаются и взаимодействуют с OpenOffice. Да, это - все! Нет никакой потребности устанавливать SDK, который при работе будет просто ссылаться на сборки. Это действительно преимущество перед другими языками, такими как C++ или Java.
Даже возможна разработка .net для версий OpenOffice ниже 2.0 при использовании технологии Отражения. Я надеюсь, что это короткое руководство покажет Вам, как просто разработать приложения, которые используют OpenOffice.
|
| Проект C# |
using System;
/*
* Add all needed CLI namespaces to the current class.
*/
using unoidl.com.sun.star.lang;
using unoidl.com.sun.star.uno;
using unoidl.com.sun.star.bridge;
using unoidl.com.sun.star.frame;
namespace OOTutorial
{
class OpenOfficeApp
{
// Определение имени файла. Измените это на существующий путь!
private static string FileName = @"F:\odtfiles\test.odt";
[STAThread]
static void Main(string[] args)
{
//Вызов метода bootstrap для получения нового объекта
//ComponentContext. Если OpenOffice еще не запущен то
//запустим его и затем возвратим ComponentContext.
unoidl.com.sun.star.uno.XComponentContext localContext =
uno.util.Bootstrap.bootstrap();
//Получение нового диспетчера служб типа MultiServiceFactory,
//мы нуждаемся в нем, чтобы получить объект desktop и создать
//новый объект CLI.
unoidl.com.sun.star.lang.XMultiServiceFactory multiServiceFactory =
(unoidl.com.sun.star.lang.XMultiServiceFactory)
localContext.getServiceManager();
//Создание нового экземпляра Desktop используя наш диспетчер служб
//Заметьте: мы передаем наш объект desktop загрузчику XComponent
//так, чтобы мы могли загрузить или создать новые документы.
XComponentLoader componentLoader =
(XComponentLoader) multiServiceFactory.createInstance(
"com.sun.star.frame.Desktop" );
//Создание нового пустого документа writer используя наш объект
//загрузки компонентов.
XComponent xComponent = componentLoader.loadComponentFromURL(
"private:factory/swriter", //пустой документ writer
"_blank", 0, //в пустом фрейме без searchflag
//без дополнительных аргументов.
new unoidl.com.sun.star.beans.PropertyValue[0]
);
//Передаем наш компонент интерфейсу XText
//и запишем некоторый простой текст в документ.
((unoidl.com.sun.star.text.XTextDocument)xComponent).
getText().setString("Привет! Я - первый текст.");
//После того, как мы вставили наш текст, мы передаем наш компонент
//XStorable для сохранения его на жестком диске
((XStorable)xComponent).storeToURL(
//Преобразование пути к файлу в формат OpenOffice
PathConverter(FileName),
//без дополнительных аргументов
new unoidl.com.sun.star.beans.PropertyValue[0]);
Console.WriteLine("Your first OpenOffice document is saved!");
Console.ReadLine();
}
/// <summary>
/// Преобразование в формат файла OO
/// </summary>
/// <param name="file">Файл.</param>
/// <returns>Преобразованный файл</returns>
private static string PathConverter(string file)
{
try
{
file = file.Replace(@"\", "/");
return "file:///"+file;
}
catch(System.Exception ex)
{
throw ex;
}
}
}
}
|
using System;
/*
* Use the Reflection namespace to get our Com objects
*/
using System.Reflection;
namespace OpenOfficeAppRefl
{
class OpenOfficeApp
{
//Определение имени файла. Измените это на существующий путь!
private static string FileName = @"F:\odtfiles\test.odt";
[STAThread]
static void Main(string[] args)
{
//Создание нового Type объекта ServiceManager
Type tServiceManager =
Type.GetTypeFromProgID("com.sun.star.ServiceManager", true);
//Создание нового Com объекта ServiceManager используя
//type объект ServiceManager
object oServiceManager =
System.Activator.CreateInstance(tServiceManager);
//Создание Вашего Com объекта Desktop
object oDesktop = Invoke(oServiceManager,
"createinstance",
BindingFlags.InvokeMethod,
"com.sun.star.frame.Desktop");
//Создание массива для загрузки параметров
Object[] arg = new Object[4];
arg[0] = "private:factory/swriter";
arg[1] = "_blank";
arg[2] = 0;
arg[3] = new Object[] {};
//Создание нового чистого документа
object oComponent = Invoke(oDesktop,
"loadComponentFromUrl",
BindingFlags.InvokeMethod,
arg
);
//Создание пустого массива для метода getText
arg = new Object[0];
//Получение Com объекта Text
Object oText = Invoke(oComponent,
"getText",
BindingFlags.InvokeMethod,
arg
);
//Запись текста в документ
Invoke(oComponent,
"getText",
BindingFlags.InvokeMethod,
new Object[1] {"Hello I'm the first text!"}
);
//Создание массива дляметода storeToUrl
arg = new Object[2];
arg[0] = PathConverter(FileName);
arg[1] = new Object[0] {};
//Сохранение документа
Invoke(oComponent,
"storeToUrl",
BindingFlags.InvokeMethod,
arg
);
Console.WriteLine("Our first document created via Reflection is done!");
}
/// <summary>
/// Преобразование в формат файла OO
/// </summary>
/// <param name="file">Файл.</param>
/// <returns>Преобразование файла</returns>
private static string PathConverter(string file)
{
try
{
file = file.Replace(@"\", "/");
return "file:///"+file;
}
catch(System.Exception ex)
{
throw ex;
}
}
/// <summary>
/// Создание нового Com объекта.
/// </summary>
/// <param name="obj">Объект для осуществления вызова.</param>
/// <param name="method">Имя метода для вызова</param>
/// <param name="binding">Значение из списка BiningFlags</param>
/// <param name="par">Параметр для осуществления вызова метода</param>
/// <returns></returns>
public static object Invoke(object obj,string method, BindingFlags binding,params object[] par)
{
return obj.GetType().InvokeMember(method,binding,null,obj,par);
}
}
}
|
Сайт:
http://opendocument4all.com/content/view/68/47/Автор перевода:
Дмитрий Черновна форуме:
community.i-rs.ru| _Article_01.odt | |
| _Article_01.pdf | |