OpenOffice – свободно доступный офисный пакет, который основан на Sun StarOffice. Это - одна из причин, почему OpenOffice действительно устойчив и полон возможностей, так, что Вы не потеряете ничего, если Вы перейдете от Microsoft Office к OpenOffice. Признание OpenOffice увеличивается день за днём. Таким образом Вы должны дать ему шанс и испытать его.
Я думаю, что множество принимающих решения 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.
Требования для следующего шага такие: Вы имеете уже установленный OpenOffice версия которого, соответственно, равняется или больше 2.0, и Вы используете Microsoft Visual Studio .net 2002/2003 как среду для разработки.
Это - все. Теперь, Вы готовы написать ваше первое приложение.
В качестве первого приложения мы напишем простое приложение, которое соединяется с выполняющимся экземпляром OpenOffice, а если OpenOffice еще не запущен, то запускает его. Если приложение установило связь, мы создаем указатель обслуживания, чтобы общаться с OpenOffice и использовать его для получения доступа к рабочему столу OpenOffice. Если мы получим экземпляр рабочего стола, то мы создадим пустой текстовый документ. В этот пустой документ мы запишем некоторый простой текст, и по крайней мере документ должен быть сохранен.
Я думаю, что лучший путь, если я покажу Вам весь исходный текст этого приложения. Это действительно не длинно, и я сам помещу говорящие комментарии в коде. Так давайте посмотрим код.
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;
}
}
}
}
Просто скопируйте этот код в буфер обмена и замените ваш класс, которые содержат метод Main. Теперь, Вы можете нажать F5, чтобы запустить приложение в режиме отладки. Оно должно скомпилироваться без ошибок. После того, как приложение запущено, должен быть запущен OpenOffice и отобразится сначала чистый документ Writer, в который будет немедленно записан наш текст. По крайней мере документ будет сохранен. Все эти шаги настолько быстры, что это будет похоже на один единственный шаг, но я думаю, что не должно быть никаких проблем.
Я думаю, что это была хорошая отправная точка для вашей карьеры в качестве OpenOffice .net разработчика. Не стесняйтесь использовать этот простой прикладной код для экспериментов с другими возможностями программирования OpenOffice.
Теперь, я покажу Вам, как сделать то же самое, но сделать без использования CLI сборок. Вместо CLI сборок мы используем технологии Отражения и Interop. Это будет только быстрое представление того, как разрабатывать для версий ниже OpenOffice 2.0. Вы увидите, что это не столь удобно как вариант CLI, но если Вы должны разрабатывать приложения для версий OpenOffice 1.1.x.x, Вы не имеете другого выбора. Здесь подходит код.
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);
}
}
}
Как Вы можете видеть этот путь программирования OpenOffice также возможен, но я предполагаю, что это надежный путь. Нет никакой информационной поддержки нашим объектам. Вы должны знать каждое свойство и метод. Вы должны использовать его, только если это действительно необходимо.
Если Вы хотите разрабатывать другие приложения, используя OpenOffice, то Вам потребуется дополнительная справочная информация. Для дополнительной справочной информации Вы можете использовать страницы помощи UNO online, которые всегда являются актуальными и UNO Developers Guide. Если Вы загрузите UNO SDK для OpenOffice, Вы можете просматривать весь этот материал автономно.
Как я упоминал в начале этого документа, нет никакой потребности устанавливать SDK. Это было бы необходимым, только если Вы также планируете использовать такие языки, как Ява или C++. Единственная вещь, в которой Вы нуждаетесь из этой загрузки, – страницы справочной информации. Также Вы должны посетить разделы www.Oooforum.org – Code Snippets и Macro an Api, где Вы найдете большое количество тем о .net / C#.
Источник
Сайт: http://opendocument4all.com/content/view/68/47/
Перевод
Автор перевода: Дмитрий Чернов
Обсудить
на форуме: community.i-rs.ru