Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблемы при переходе с VBA на Jawin / 4 сообщений из 4, страница 1 из 1
14.02.2007, 15:49:33
    #34330849
Ъй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы при переходе с VBA на Jawin
Доброе время суток.
Предыстория вопроса такова.
Имеется некая система, написанная на Java, и к которой имеется требование поддерживать генерацию отчетов в MS Word. Генерация эта была поддержана, но достаточно сложным образом: генерировался XML, над ним производилось XSL-преобразование в HTML, далее запускался Word, в нем срабатывал макрос AutoRun, который загружал сгенерированный HTML-файл, и далее производил над ним некие действия. Кроме сложности этой системы (которая, впрочем, была скрыта от конечного пользователя) имелись недостатки в в виде нелокализуемых глюков Word'а при работе с большим количеством таблиц, например. Было принято решение формировать нужный отчет непосредственно из java, используя com-bridge Jawin. Поначалу казалось все довольно просто и понятно, но при более плотной работе возникли проблемы. Пример: создать документ с таблицей, ячейки которой содержат произвольный текст. На VBA весь код занимает 7 строк:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
    Sub createTable()
        ActiveDocument.tables.Add Selection.Range,  5 ,  2 
        Dim rw As Row, cl As Cell
         For  Each rw In ActiveDocument.tables( 1 ).Rows
             For  Each cl In rw.Cells
                cl.Range.Text = "some text"
            Next cl
        Next
    End Sub
А вот код на Java, который должен то же самое:

Код: 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.
     import  org.jawin.*;
     import  org.jawin.win32.*;
     
     import  java.util.*;
     
     public   class  WordExporter {
     
       public  WordExporter() {
      }
     
       public   void  export(Map dataSource, String templateFile, String outputFile) {
         try  {
          Ole32.CoInitialize();
          DispatchPtr app =  new  DispatchPtr("Word.Application");
          DispatchPtr documents = (DispatchPtr) app.get("Documents");
          DispatchPtr document = (DispatchPtr) documents.invoke("Open", templateFile);
          app.put("Visible", true);
          DispatchPtr tables = (DispatchPtr) document.get("tables");
          DispatchPtr sel = (DispatchPtr) app.get("Selection");
          DispatchPtr selRange = (DispatchPtr) sel.get("Range");
          tables.invoke("Add", selRange,  new  Integer( 5 ),  new  Integer( 2 ));
          DispatchPtr table = (DispatchPtr) tables.invoke("Item",  new  Integer( 1 ));
          DispatchPtr rows = (DispatchPtr) table.get("Rows");
           int  rowCount = ((Integer) rows.get("Count")).intValue();
           for  ( int  j =  1 ; j < rowCount +  1 ; j++) {
            DispatchPtr row = (DispatchPtr) rows.invoke("Item",  new  Integer(j));
            DispatchPtr cols = (DispatchPtr) row.get("Cells");
             int  colsCount = ((Integer) cols.get("Count")).intValue();
             for  ( int  k =  1 ; k < colsCount +  1 ; k++) {
              DispatchPtr cell = (DispatchPtr) cols.invoke("Item",  new  Integer(k));
              DispatchPtr cellRange = (DispatchPtr) cell.get("Range");
              cellRange.invoke("Text", "some text");
            }
          }
          document.invoke("SaveAs", outputFile);
          document.close();
          documents.close();
          app.close();
          Ole32.CoUninitialize();
        }
         catch  (Exception e) {
          e.printStackTrace();
        }
      }
    }
Вышеприведенный java-код валится на строчке cellRange.invoke("Text", "some text"); - т.е. текста в ячейки таблицы не заносится. Вот стек ошибки:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
org.jawin.COMException: 800a16e7: null
	at org.jawin.marshal.GenericStub.dispatchInvoke0(Native Method)
	at org.jawin.marshal.GenericStub.dispatchInvoke(GenericStub.java:201)
	at org.jawin.DispatchPtr.invokeN(DispatchPtr.java:587)
	at org.jawin.DispatchPtr.invokeN(DispatchPtr.java:555)
	at org.jawin.DispatchPtr.invoke(DispatchPtr.java:510)
	at WordExporter.export(WordExporter.java:32)
	at ConsoleRunner.main(ConsoleRunner.java:22)
	at Debug.main(Debug.java:3)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:324)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:86)
Кто-нибудь может мне подсказать, в чем здесь дело? Или хотя бы подсказать ресурсы, где может описываться подобное. Заранее спасибо за ответы.
...
Рейтинг: 0 / 0
14.02.2007, 16:00:40
    #34330900
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы при переходе с VBA на Jawin
а не проще воспользоваться poi?
...
Рейтинг: 0 / 0
14.02.2007, 18:05:08
    #34331314
expp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы при переходе с VBA на Jawin
или Jasper
...
Рейтинг: 0 / 0
15.02.2007, 16:05:08
    #34333997
vfabr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы при переходе с VBA на Jawin
а чему равен colsCount и на какой итерации валится цикл?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблемы при переходе с VBA на Jawin / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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