2015-04-28 3 views
2

Мне нужно заменить paragraph текст файла .doc, если он содержит определенный текст, используя java. Он заменяет текст. Но процесс записывает выходной текст странным образом. Пожалуйста, помогите мне исправить эту проблему. Фрагмент кода используется:Relace HWPFDocument текст абзаца с использованием результатов java странный вывод

public static HWPFDocument processChange(HWPFDocument doc) 
{ 
    try 
    { 
     Range range = doc.getRange(); 
     for (int i = 0; i < range.numParagraphs(); i++) 
     { 
      Paragraph paragraph = range.getParagraph(i); 
      if (paragraph.text().contains("Place Holder")) 
      { 
       String text = paragraph.text(); 
       paragraph.replaceText(text, "*******"); 

      } 
     } 
    } 
    catch (Exception ex) 
    { 
     ex.printStackTrace(); 
    } 
    return doc; 
} 

Вход:

Place Holder 
Textvalue1 
Textvalue2 
Textvalue3 

Выход:

*******Textvalue1 
Textvalue1 
Textvalue2 
Textvalue3 
+0

Могу ли я узнать, получил ли кто-нибудь решение? – Sherin

ответ

2

Библиотека HWPF не в идеальном состоянии для изменения/записи файлов .doc. (По крайней мере, в последний раз, когда я смотрел. Некоторое время назад я разработал пользовательский вариант HWPF для моего клиента, который, среди многих других вещей, обеспечивает правильные операции замены и сохранения, но эта библиотека не является общедоступной.)

Если вы абсолютно должны использовать .doc-файлы и Java, вы можете уйти, заменив строки одинаковой длины. Например, "12345" ->"abc__" (_ - это пространство или что-то еще для вас). Может возникнуть смысл найти абсолютное местоположение заменяемой строки в файле doc (используя HWPF), а затем напрямую изменить его в файле doc (без использования HWPF).

Формат файла Word очень сложный и «делать это правильно» не является тривиальной задачей. Если вы не готовы потратить много человеко-месяцев, также не удастся исправить часть библиотеки, чтобы просто сохранить работы. Многие структуры данных должны обрабатываться очень точно, и один «проскальзывание» позволяет слэш Word в сгенерированном выходном файле.

+0

Спасибо! для вашего ценного ответа. Записывая строку в .doc-файл напрямую без использования HWPF? Как это было бы возможно? Не могли бы вы немного рассказать об этом? – Sherin

+1

Вам нужно погрузиться в исходный код HWPF. Существует два уровня модели данных: 'usermodel' и' model' (оба в пакете 'org.apache.poi.hwpf'). Когда у вас есть текстовый пробег в «usermodel», вы можете посмотреть, как он ссылается на данные в «модели». В конце концов вы, вероятно, попадете в класс 'CHPBinTable'. Ищите вещи, имеющие 'FC' в их имени, которые уже очень близки к расположению файла. Затем спуститесь к пакету «POIFS», который представляет собой базовый формат данных OLE2. Возможно, вам придется немного настроить HWPF, чтобы сделать доступными частные классы/методы/поля. –

+0

Я пытаюсь изменить код, как вы предположили. Я ожидаю ваших ценных предложений, если я столкнулся с какими-либо трудностями. Спасибо за ваши предложения. – Sherin