Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / POI для MS WORD функция замены. / 14 сообщений из 14, страница 1 из 1
13.05.2013, 13:04:03
    #38255155
kT_________
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
POI для MS WORD функция замены.
Добрый день.

Ниже привожу код ф-ии замены текста в ворде, но есть проблемы, т.с. глубина поиска)
У меня типизированные документы, заголовок с ответственными лицами, содержание, которое автоматом подгоняется, ну как у всех.

Проблема в том, что не весь текст принимается в расчет, т.е. настроив вывод просматриваемого текста, как раз не нахожу первых страниц, ну и всяких мелочей, короче НЕ_ВСЁ или лучще всказать НЕ_ВЕЗДЕ идёт поиск.
Подскажите, что я упустил. Думаю надо парсить в глубь этот ООХМЛ.. подскажите как парсить сложные документы, с табличками, заголовками и т.п.
...
Рейтинг: 0 / 0
13.05.2013, 13:05:00
    #38255156
kT_________
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
POI для MS WORD функция замены.
Код: java
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.
 Iterator<XWPFParagraph> parasIter = this.doc.getParagraphsIterator();
        Iterator<XWPFRun> runsIter = null;
        Enumeration<String> srchTermEnum = null;
        XWPFParagraph para = null;
        XWPFRun run = null;
        List<XWPFRun> runsList = null;
        String searchTerm = null;
        String runText = null;
        String replacementText = null;
        OutputStream os = null;

        // Step through the XWPFParagraph object one at a time.
        while(parasIter.hasNext()) {
            para = parasIter.next();
            // Recover a List of XWPFRun objects from the XWPFParagraph and an
            // Iterator from this List.
            runsList = para.getRuns();
            runsIter = runsList.iterator();
            // Use the Iterator to step through the XWPFRun objects.
            while(runsIter.hasNext()) {
                // Get a run and it's text
                run = runsIter.next();
                runText = run.getText(0);

                // Recover an Enumeration object 'containing' the set of
                // search terms and then step through these terms looking
                // for match in the run's text
                srchTermEnum = this.srTerms.keys();
                while(srchTermEnum.hasMoreElements()) {
                   searchTerm = srchTermEnum.nextElement();              
                   System.out.println("searchTerm: " + searchTerm);
                   // If a match is found, use the replacement text to substitute
                   // for the search term and update the runs text.
                   
                   
//                   if(runText == null) continue;
                   System.out.println("In RUN: "+runText.toString());
//                   
                   if(runText.contains(searchTerm)) {
                       replacementText = this.srTerms.get(searchTerm);
                       // Note the use of the replaceAll() method here. It will,
                       // obviously, replace all occurrences of the search term
                       // with the replacement text. This may not be what is
                       // required but is easy to modify by changing the logic
                       // slightly and using the replaceFirst() or replace()
                       // methods.
                       runText = runText.replaceAll(searchTerm, replacementText);
                       //runText = runText.replaceAll(searchTerm, replacementText);
                       run.setText(runText, 0);
                   }
                }
            }
        }
        os = new FileOutputStream(this.sourceFile);
        this.doc.write(os);
...
Рейтинг: 0 / 0
13.05.2013, 13:35:51
    #38255197
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
POI для MS WORD функция замены.
kT_________,
а зачем так много кода, итераторы и циклы?
Word сам умеет заменять текст один на другой.

псевдокод:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
procedure WrdReplace(SearchString, ReplaceString: string);
const
  wdFindContinue = 1;
  wdReplaceOne = 1;
  wdReplaceAll = 2;
begin
    { Initialize parameters}
    WordApp.Selection.Find.ClearFormatting;
    WordApp.Selection.Find.Text := SearchString;
    WordApp.Selection.Find.Replacement.Text := ReplaceString;
    WordApp.Selection.Find.Forward := True;
    WordApp.Selection.Find.Wrap := wdFindContinue;
    WordApp.Selection.Find.Format := False;
    //WordApp.Selection.Find.MatchCase := wrfMatchCase in Flags;
    WordApp.Selection.Find.MatchCase := False;
    WordApp.Selection.Find.MatchWholeWord := False;
    //WordApp.Selection.Find.MatchWildcards := wrfMatchWildcards in Flags;
    WordApp.Selection.Find.MatchWildcards := False;
    WordApp.Selection.Find.MatchSoundsLike := False;
    WordApp.Selection.Find.MatchAllWordForms := False;
    { Perform the search}
    WordApp.Selection.Find.Execute(Replace := wdReplaceAll)
end;
...
Рейтинг: 0 / 0
13.05.2013, 14:20:39
    #38255248
kT_________
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
POI для MS WORD функция замены.
Petro123,

Java POI
...
Рейтинг: 0 / 0
13.05.2013, 14:27:54
    #38255267
kT_________
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
POI для MS WORD функция замены.
kT_________Petro123,

Java POI


т.е. на Яве и на ПОИ это как будет?
можно весь код с импортами и т.п., не узнаю язык. Это фортран?;)
...
Рейтинг: 0 / 0
13.05.2013, 14:36:24
    #38255285
Garrick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
POI для MS WORD функция замены.
kT_________можно весь код с импортами и т.п., не узнаю язык. Это фортран?;)
По-моему это VBA (Visual Basic for Applications)
...
Рейтинг: 0 / 0
13.05.2013, 14:53:25
    #38255303
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
POI для MS WORD функция замены.
Delphi,

WordApp - COM объект сервер автоматизации
Selection.Find.ClearFormatting; - функция в интрфейсе для POI

- вызови её одну для примера или поищи пример в вебе.
...
Рейтинг: 0 / 0
13.05.2013, 14:59:21
    #38255308
kT_________
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
POI для MS WORD функция замены.
Petro123,

понял, спасибо
...
Рейтинг: 0 / 0
15.05.2013, 15:53:47
    #38258634
kT_________
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
POI для MS WORD функция замены.
Действительно, POI коенчно хорошо, и Ворд не нужен на машине, но:

1. Replace_all нет на нём.
2. Оглавление отваливается
3. Остальные мелочи, до которых добраться только совсем глубоко копая структуру.(нах надо)



Использую COM как выше советовали, оч удобно. Но есть маленький вопрос...

как реализовтаь поиск и замену всех ключей а не одного, и как оглавление обновить, какая функция. Буду крайне признателен за помощь. Код ниже..
...
Рейтинг: 0 / 0
15.05.2013, 15:54:45
    #38258640
kT_________
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
POI для MS WORD функция замены.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ActiveXComponent oWord = new ActiveXComponent("Word.Application"); 
	        oWord.setProperty("Visible", new Variant(tVisible));
	        Object oDocuments = oWord.getProperty("Documents").toDispatch(); 
	        Object oDocument = Dispatch.call((Dispatch) oDocuments, "Open", sInputDoc).toDispatch(); 
	        Object oSelection = oWord.getProperty("Selection").toDispatch(); 
	        Object oFind = oWord.call((Dispatch) oSelection, "Find").toDispatch();
	        
	        Dispatch.put((Dispatch) oFind, "Text", sOldText); 
	        Dispatch.call((Dispatch) oFind, "Execute"); 
	        Dispatch.put((Dispatch) oSelection, "Text", sNewText);
...
Рейтинг: 0 / 0
15.05.2013, 16:37:58
    #38258778
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
POI для MS WORD функция замены.
kT_________,
выше код и методика для COM.
1. выше код вмё и заменяет - wdReplaceAll
2. Чтобы узнать имя функции - включи запись макросов в ворде в VB, обнови оглавление, и увидим функцию.
...
Рейтинг: 0 / 0
16.05.2013, 11:39:02
    #38259882
kT_________
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
POI для MS WORD функция замены.
Petro123,

это понятно. но как это написать??? КАК?
...
Рейтинг: 0 / 0
16.05.2013, 11:46:55
    #38259903
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
POI для MS WORD функция замены.
kT_________,
как писать?
Руками.
На такой вопрос пишут - ошибка в 13 строке.
Где трейс ошибки?
...
Рейтинг: 0 / 0
16.05.2013, 12:06:01
    #38259977
kT_________
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
POI для MS WORD функция замены.
Petro123,

Дорогой мой, я прекрасно виду как называется ф-ия, и на всякий случай даже в макросе как Вы и писали посмотрел, стопудово это она, вопрос не в том что за функцию писать, а как?

Какая сигнатура вызова??? Из примеров в сети там какая то жесть с кучей variant-ов, просветите как вызвать её из под jacob-а, спасибо.


п.с. дело в одной строчке, давно бы написали её.. (если б знали) ;)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / POI для MS WORD функция замены. / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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