powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# и OpenOffice
7 сообщений из 7, страница 1 из 1
C# и OpenOffice
    #36572760
milton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникла проблема с формированием отчетов в OpenOffice (ODF).
Пробовал:
1. Работать с библиотеками из OpenOffice SDK. Вроде получается, но осваивается как-то мучительно долго (очень уж там все запутано).
2. Искать другой вариант, кроме использования OpenOffice SDK. В принципе, находил подходящие компоненты, но все они распространяются на коммерческой основе, а у заказчика очень жесткие требования к лицензионности ПО.
До недавнего перехода на C# программировал на Delphi. Для вывода в OpenOffice пользовался вот этим модулем , который представляет дружелюбную обертку функций API OpenOffice.
Что-либо похожее, но реализованное уже на платформе Net я не нашел.
Прошу посоветовать выход из сложившейся ситуации, и, если можно, поделиться ссылками на бесплатные и более простые в использовании компоненты, чем библиотеки классов из OpenOffice SDK.
...
Рейтинг: 0 / 0
C# и OpenOffice
    #36573441
Фотография ponuch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
milton,

делюсь маленьким классом для работы с ОО через com. немного недописан, обёртку тоже предстоит написать. но как вариант :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
 public class OODocument
    {
        #region Memebers
        object oComponent;
        object oDesktop;
        object oSheets;
        object oRanges;
        object oRows;
        object oColumns;
        object oSheet;
        Type tServiceManager;
        object oServiceManager;

        #endregion

        #region Constructors

        private OODocument()
        {
        }

        /// <summary>
        /// Создание документа
        /// </summary>
        /// <param name="filename">полный путь к файлу</param>
        public OODocument(string filename)
        {
            CreateDocCom(filename);

            oSheets = Invoke(oComponent, "getSheets", BindingFlags.InvokeMethod, null);
            oSheet = Invoke(oSheets, "getByIndex", BindingFlags.InvokeMethod, new object[] { 0 });
            oRanges = Invoke(oComponent, "namedRanges", BindingFlags.GetProperty, null);
            oRows = Invoke(oSheet, "rows", BindingFlags.GetProperty, null);
            oColumns = Invoke(oSheet, "columns", BindingFlags.GetProperty, null);
        }

        #endregion Constructors

        private void CreateDocCom(string fileName)
        {
            
            string absFileName = PathConverter(fileName);
            //Создание нового Type объекта ServiceManager
             tServiceManager =
              Type.GetTypeFromProgID("com.sun.star.ServiceManager", true);
            //Создание нового Com объекта ServiceManager используя
            //type объект ServiceManager
            oServiceManager =
              System.Activator.CreateInstance(tServiceManager);
            //Создание Вашего Com объекта Desktop
            //object oDesktop = Invoke(oServiceManager,
            //    "createinstance",
            //    BindingFlags.InvokeMethod,
            //    "com.sun.star.frame.Desktop");
            object[] par = new object[1];
            par[0] = "com.sun.star.frame.Desktop";
            oDesktop = oServiceManager.GetType().InvokeMember("createinstance", BindingFlags.InvokeMethod, null, oServiceManager, par);


            Object[] PropertyValue = { "com.sun.star.beans.PropertyValue" };
            Object[] name = { "Hidden" };
            Object[] val = { false };

            object hidden = (Object)tServiceManager.InvokeMember("Bridge_GetStruct",
           BindingFlags.InvokeMethod, null,
           oServiceManager, PropertyValue);
            Invoke(hidden, "Name", BindingFlags.SetProperty, name);
            Invoke(hidden, "Value", BindingFlags.SetProperty, val);
            /*hidden.GetType().InvokeMember(, BindingFlags.SetProperty, null, hidden, name);
            hidden.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, hidden, val);*/

            //Создание массива для загрузки параметров
            object[] arg = new object[4];
            arg[0] = absFileName;
            arg[1] = "_blank";
            arg[2] = 0;
            arg[3] = new Object[] {hidden };
            //Создание нового чистого документа
            //object oComponent = Invoke(oDesktop,
            //    "loadComponentFromUrl",
            //    BindingFlags.InvokeMethod,
            //    arg
            //    );

            oComponent = oDesktop.GetType().InvokeMember("loadComponentFromUrl", BindingFlags.InvokeMethod, null, oDesktop, arg);

        }

       
        /// <summary>Конвертирование пути для стандарта OpenOffice.
        /// <param>
        /// file - полный путь к файлу
        /// </param>
        /// </summary>
        private static string PathConverter(string file)
        {
            try
            {
                file = file.Replace(@"\", "/");
                return "file:///" + file;
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
        }


        /// <summary>
        /// Запись значения в ячейку
        /// </summary>
        /// <param name="range">имя ячейки</param>
        /// <param name="value">значение</param>
        internal void SetCellValue(string range, string value)
        {
            object oCell = Invoke(oSheet, "getCellRangeByName", BindingFlags.InvokeMethod, new object[] { range });
            if (oCell == null)
            {
                throw new Exception("Ячейка с именем " + range + " не найдена !");
            }
            Invoke(oCell, "setFormula", BindingFlags.InvokeMethod, new object[] { value });
        }


        /// <summary>
        /// Запись в ячейку даты
        /// </summary>
        /// <param name="range">имя ячейки</param>
        /// <param name="date">дата</param>
        internal void SetCellDateTime(string range, DateTime date)
        {
            object oCell = Invoke(oSheet, "getCellRangeByName", BindingFlags.InvokeMethod, new object[] { range });
            if (oCell == null)
            {
                throw new Exception("Ячейка с именем " + range + " не найдена !");
            }
            Invoke(oCell, "setString", BindingFlags.InvokeMethod, new object[] { date.ToString() });
        }


        /// <summary>
        /// Чтение значения из ячейки
        /// </summary>
        /// <param name="range">имя ячейки</param>
        /// <returns>значение ячейки</returns>
        internal string GetCellValue(string range)
        {
            object oSelection = Invoke(oSheet, "getCellRangeByName", BindingFlags.InvokeMethod, new object[] { range });
            if (oSelection == null)
            {
                throw new Exception("Ячейки с диапазоном " + range + " не найдена !");
            }
            object oCell = Invoke(oSelection, "getCellByPosition", BindingFlags.InvokeMethod, new object[] { 0, 0 });
            if (oCell == null)
            {
                throw new Exception("Ячейка не найдена !");
            }
            return (string)Invoke(oCell, "getFormula", BindingFlags.InvokeMethod, null);
        }

        /// <summary>
        /// Чтение значения из ячейки
        /// </summary>
        /// <param name="cellName">имя ячейки</param>
        /// <returns>значение ячейки</returns>
        internal string GetCellValueByName(string cellName)
        {
            object oRange = Invoke(oSheet, "getCellRangeByName", BindingFlags.InvokeMethod, new object[] { cellName });
            if (oRange == null)
            {
                throw new Exception("Ячейка " + cellName + " не найдена !");
            }
            return (string)Invoke(oRange, "getString", BindingFlags.InvokeMethod, null);
        }


        /// <summary>
        /// Вставка определённого количества строк
        /// </summary>
        /// <param name="row">С какой строки начинает вставлять</param>
        /// <param name="count">количество вставляемых строк</param>
        internal void InsertByIndex(int row, int count)
        {
            Invoke(oRows, "insertByIndex", BindingFlags.InvokeMethod, new object[] { row, count });
        }

        /// <summary>
        /// Вставка массива в диапазон ячеек
        /// </summary>
        /// <param name="range">Диапазон ячеек</param>
        /// <param name="data">Массив значений</param>
        internal void SetDataArray(string range, object[] data)
        {
            object rangeSel = RangeSelection(range);

            Invoke(rangeSel, "setDataArray", BindingFlags.InvokeMethod, new object[] { data });

        }

        /// <summary>
        /// Возвращает диапазон ячеек по координатам
        /// </summary>
        /// <param name="x_beg">Первый столбец</param>
        /// <param name="y_beg">Первая строка</param>
        /// <param name="x_end">Последний столбец</param>
        /// <param name="y_end">Последняя строка</param>
        /// <returns></returns>
        internal object GetCellRangeByPosition(int x_beg, int y_beg, int x_end, int y_end)
        {
            return Invoke(oSheet, "getCellRangeByposition", BindingFlags.InvokeMethod, new object[] { x_beg, y_beg, x_end, y_end });
        }

        /// <summary>
        /// Чтение значения из ячейки по координатам
        /// </summary>
        /// <param name="col">Столбец</param>
        /// <param name="row">Строка</param>
        /// <returns></returns>
        internal string GetCellByPosition(int col, int row)
        {
            string value = string.Empty;
            object oCell = null;

            oCell = Invoke(oSheet, "getCellByPosition", BindingFlags.InvokeMethod, new object[] { col, row });

            int cellType = (int)Invoke(oCell, "getType", BindingFlags.InvokeMethod, null);

            switch (cellType)
            {
                case 1:
                    value = Invoke(oCell, "getValue", BindingFlags.InvokeMethod, null).ToString();
                    break;
                case 3:
                    value = Invoke(oCell, "getFormula", BindingFlags.InvokeMethod, null).ToString();
                    break;
                default:
                    value = (string)Invoke(oCell, "getString", BindingFlags.InvokeMethod, null);
                    break;
            }

            return value;
        }


        /// <summary>
        /// Возвращает набор ячеек по диапазону
        /// </summary>
        /// <param name="range">диапазон</param>
        /// <returns>ячейки</returns>
        internal object RangeSelection(string range)
        {
            return Invoke(oSheet, "getCellRangeByName", BindingFlags.InvokeMethod, new object[] { range });
        }

        /// <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);
        }
    }
...
Рейтинг: 0 / 0
C# и OpenOffice
    #36573480
Фотография ponuch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, если найдёте способ как запустить ОО невидимым, а потом сделать видимым, сообщите пожалуйста :)
...
Рейтинг: 0 / 0
C# и OpenOffice
    #36573497
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miltonу заказчика очень жесткие требования к лицензионности ПО.
Открою страшную тайну - лицензии можно купить.
...
Рейтинг: 0 / 0
C# и OpenOffice
    #36573511
Фотография ponuch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

есть очень-очень жадные заказчики, которым хочется всё быстро и нахаляву. щас сам с таким работаю. вообще опен офис редкостное дерьмо. единственное достоинство - цена.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
C# и OpenOffice
    #38431487
irokosovskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miltonВозникла проблема с формированием отчетов в OpenOffice (ODF).
Пробовал:
1. Работать с библиотеками из OpenOffice SDK. Вроде получается, но осваивается как-то мучительно долго (очень уж там все запутано).
2. Искать другой вариант, кроме использования OpenOffice SDK. В принципе, находил подходящие компоненты, но все они распространяются на коммерческой основе, а у заказчика очень жесткие требования к лицензионности ПО.
До недавнего перехода на C# программировал на Delphi. Для вывода в OpenOffice пользовался вот этим модулем , который представляет дружелюбную обертку функций API OpenOffice.
Что-либо похожее, но реализованное уже на платформе Net я не нашел.
Прошу посоветовать выход из сложившейся ситуации, и, если можно, поделиться ссылками на бесплатные и более простые в использовании компоненты, чем библиотеки классов из OpenOffice SDK.

Была та же проблема. Разобраться то можно, но время потраченное на это стоило слишком дорого. Его попросту не было, а работа должна быть сделана. Мне нужно было сделать отчёт из БД в OpenOffice Calc. Пару дней помучался. Потом решил найти какие-то компоненты готовые для работы с OpenOffice. Наткнулся на этот " http://www.oooforum.org/forum/viewtopic.phtml?t=193243%22%5D%D1%82%D0%BE%D0%BF%D0%B8%D0%BA]http://www.oooforum.org/forum/viewtopic.phtml?t=193243"]топик . Скачал демо версию либы, протестил. На моё удивление проблемы с OpenOffice на этом закончились. Думаю поможет и вам. Удачи ;)
...
Рейтинг: 0 / 0
C# и OpenOffice
    #38472635
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может это поможет тынц
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# и OpenOffice
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]