Читать и написать файлы документов Word с помощью POI
Модуль HWPF Apache POI специально используется для чтения и записи файлов DOC Word. В HWPF мы используем hwpfdocument для представления документа Doc Word. Есть несколько концепций в HWPFDocument:
Диапазон : он представляет собой диапазон, который может быть весь документ, определенный раздел, абзац (абзац) или абзац (характер) с общими атрибутами.
Раздел : подраздел документа Word. Документ Word может быть составлен из нескольких подразделах.
Параграф : абзац документа Word, подраздел может быть составлен из нескольких абзацев.
Характер : абзац текста с одинаковыми свойствами, и абзац может быть составлен из нескольких символов.
Таблица : таблица.
Таблица : строка, соответствующая таблице.
Таблица : ячейка, соответствующая таблице.
Раздел, абзац, характер и таблица все унаследованы от диапазона.
1 Файл DOC Read Word
В ежедневных приложениях нам очень редко читать информацию из файлов Word, и мы чаще записываем контент в файлы Word. Существует два основных способа считывать данные из файлов DOC Word, используя POI: прочитать WordExtractor и прочитать HWPFDOCUMENT . При чтении информации внутри WordExtractor она все еще получается через HWPFDocument.
1.1 Читать файлы через WordExtractor
При чтении файла с использованием WordExtractor мы можем прочитать текстовое содержимое файла и некоторые свойства на основе документа. Что касается свойств содержания документа, мы не можем его прочитать. Если вы хотите прочитать свойства содержимого документа, вам необходимо использовать HWPFDOCUMENT для его прочтения. Вот пример использования WordExtractor для чтения файлов:
открытый класс hwpftest {@suppresswarnings ("tempercation") @test public void testreadbyextractor () Throws exection {inputStream IS = new FileInputStream ("d: //test.doc"); WordExtractor Extractor = новый WordExtractor (IS); // Вывод весь текст Word Document System.out.println (Extractor.getText ()); System.out.println (Extractor.getTextFrompieces ()); // Вывод содержимого системы заголовка. // Вывод содержимое системы нижнего колонтитула. // Вывод информации о метаданных текущего документа Word, включая автора, время модификации документа и т. Д. System.out.println (Extractor.getMetAdatateXtextractor (). GetText ()); // Получить текст каждого параграфа строки paratexts [] = Extractor.getParagraphtext (); for (int i = 0; i <paratexts.length; i ++) {System.out.println ("пункт" + (i + 1) + ":" + paratexts [i]); } // Вывод некоторой информации о текущем словом printInfo (Extractor.getSummaryInformation ()); // Вывод некоторой информации о текущем словом this.printinfo (Extractor.getDocsummaryInformation ()); this.closestream (is); } /** * Выходное SummaryInfomation * @param info * /private void printInfo (SummaryInformation Information) {// Автор System.out.println (info.getAuthor ()); // Статистика символов. // количество страниц System.out.println (info.getPageCount ()); // title System.out.println (info.getTitle ()); // тематическая система.out.println (info.getSubject ()); } /** * Вывод DocumentsumaryInfomation * @param info * /private void printInfo (documningumaryinformation info) {// category system.out.println (info.getCategory ()); // Компания System.out.println (info.getCompany ()); } / *** Закрыть поток ввода* @param is* / private void rowestream (inputstream is) {if (is! = Null) {try {is.close (); } catch (ioException e) {e.printstackTrace (); }}}}1.2 Читать файлы через hwpfdocument
HWPFDocument является представителем текущих документов Word, и его функции сильнее WordExtractor. Через это мы можем прочитать таблицы, списки и т. Д. В документе, а также мы можем добавить, изменять и удалять содержимое документа. Только после завершения этих новых дополнений, модификаций и удалений соответствующая информация сохраняется в HWPFDOCUMENT, что означает, что мы изменили HWPFDOCUMENT, а не файлы на диске. Если мы хотим, чтобы эти модификации вступили в силу, мы можем вызвать метод записи HWPFDOCUMENT для вывода модифицированного HWPFDOCUMENT в указанный выходной поток. Это может быть выходной поток исходного файла или выходной поток нового файла (эквивалентный для сохранения AS) или других выходных потоков. Вот пример чтения файла через hwpfdocument:
открытый класс hwpftest {@test public void testReadBydoc () Throws Exception {inputStream IS = new FileInputStream ("d: //test.doc"); Hwpfdocument doc = new hwpfdocument (is); // Вывод информации о закладках this.printinfo (doc.getbookmarks ()); // Выходная текстовая система.out.println (doc.getDocumentText ()); Диапазон диапазона = doc.getRange (); // this.insertinfo (диапазон); this.printinfo (диапазон); // Читать таблицу this.readtable (range); // Читать список this.readlist (range); // Удалить диапазон диапазона r = новый диапазон (2, 5, док); R.Delete (); // Удалить в памяти, если вам нужно сохранить его в файл, вам необходимо написать его обратно в файл // записать текущий HWPFDOCUMENT в выходной stream doc.write (new FileOutputStream ("d: //test.doc")); this.closestream (is); } / *** Закройте входной поток* @param is* / private void stoseStream (inputStream is) {if (is! = Null) {try {as.close (); } catch (ioException e) {e.printstackTrace (); }}} / *** Информация о выводе закладок* @param bookmarks* / private void printinfo (закладки закладок) {int count = bookmarks.getbookmarkscount (); System.out.println ("Количество закладок:" + count); Закладка закладка; for (int i = 0; i <count; i ++) {bookmark = bookmarks.getbookmark (i); System.out.println ("закладка" + (i + 1) + "Название:" + bookmark.getName ()); System.out.println ("Start Position:" + bookmark.getStart ()); System.out.println ("Конечная позиция:" + bookmark.getend ()); }} /*** Читать таблицу* Возвращение каждой каретки представляет параграф, поэтому для таблицы каждая ячейка содержит хотя бы один абзац, и каждая строка заканчивается абзацем. * @param range */private void readtable (диапазон диапазона) {// Передача таблицы в диапазоне диапазона. TableTerator TableIter = новый TalectiTerator (Range); Таблица таблицы; TableSerow Row; Табличная ячейка; while (tableiter.hasnext ()) {table = tableiter.next (); int rownum = table.numrows (); for (int j = 0; j <rownum; j ++) {row = table.getrow (j); int cellnum = row.numcells (); for (int k = 0; k <cellnum; k ++) {cell = row.getcell (k); // Text System Output. }}}}} / **! Параграф Пара; for (int i = 0; i <num; i ++) {para = range.getParagraph (i); if (para.isinlist ()) {System.out.println ("list:" + para.text ()); }}} /** * РАСПОЛОЖЕНИЕ ВЫХОДА * @param range * /private void printInfo (range range) {// Получить количество параграфов int paranum = range.numparagraphs (); System.out.println (Paranum); for (int i = 0; i <paranum; i ++) {// this.insertinfo (range.getParagraph (i)); System.out.println ("пункт" + (i + 1) + ":" + range.getParagraph (i) .Text ()); if (i == (paranum-1)) {this.insertinfo (range.getParagraph (i)); }} int secnum = range.numsections (); System.out.println (secnum); Раздел раздел; for (int i = 0; i <secnum; i ++) {section = range.getSection (i); System.out.println (section.getmarginleft ()); System.out.println (section.getmarginright ()); System.out.println (section.getmarginright ()); System.out.println (section.getMargintop ()); System.out.println (section.getmarginbottom ()); System.out.println (section.getPageHeight ()); System.out.println (section.text ()); }} / *** Вставить контент в диапазон, он будет записан только в память* @param range* / private void insertinfo (range range. {range.insertafter ("hello"); }}2 Файл документа записи Word
При написании файлов DOC Word с использованием POI у нас должен быть файл DOC, потому что, когда мы пишем файлы DOC, мы пишем его через HWPFDOCUMENT, и HWPFDOCUMENT должен быть прикреплен к файлу DOC. Таким образом, обычным способом является сначала подготовить файл DOC с пустым контентом на жестком диске, а затем создать HWPFDocument на основе пустого файла. После этого мы можем добавить новый контент в HWPFDocument, а затем написать его в другой файл DOC. Это эквивалентно использованию POI для генерации файла DOC Word.
В реальных приложениях, когда мы генерируем файлы Word, мы генерируем определенный тип файла. Формат этого типа файла фиксирован, но некоторые поля разные. Таким образом, в практических приложениях нам не нужно генерировать содержание всего файла Word через HWPFDOCUMENT. Вместо этого создайте новый документ Word на диске, а его содержимое - это содержимое файла Word, которое мы должны генерировать, а затем используйте метод, похожий на «$ {paramname}», чтобы заменить некоторые из содержимого, принадлежащих к переменным. Таким образом, когда мы генерируем файл Word, основанный на определенной информации, нам нужно только получить HWPFDOCUMENT на основе файла Word, а затем вызовать метод replacetext (), чтобы заменить соответствующую переменную на соответствующее значение, а затем записать текущий HWPFDOCUMUMENT в новый выходной поток. Этот метод используется чаще в практических приложениях, потому что он может не только уменьшить нашу рабочую нагрузку, но и сделать текстовый формат более четким. Давайте сделаем пример на основе этого метода.
Предположим, что теперь у нас есть изменяющаяся информация, и тогда нам нужно сгенерировать файл DOC Word в следующем формате через эту информацию:
Таким образом, в соответствии с вышеуказанным описанием, первый шаг - создать файл DOC в соответствующем формате в качестве шаблона, и его содержание следующим образом:
С таким шаблоном мы можем создать соответствующий HWPFDOCUMENT, затем заменить соответствующую переменную на соответствующее значение, а затем вывести HWPFDOCUMENT в соответствующий выходной поток. Ниже приведен соответствующий код.
открытый класс hwpftest {@test public void testwrite () throws exception {string templatepath = "d: //word//template.doc"; InputStream IS = New FileInputStream (TemplatePath); Hwpfdocument doc = new hwpfdocument (is); Диапазон диапазона = doc.getRange (); // заменить $ {reportDate} в диапазоне диапазона с текущим диапазоном даты.replacetext ("$ {reportDate}", new SimpleDateFormat ("yyyy-mm-dd"). Format (new Date ())); range.replacetext ("$ {appleamt}", "100,00"); range.replacetext ("$ {bananaamt}", "200,00"); range.replacetext ("$ {totalAmt}", "300,00"); OutputStream OS = new FileOutputStream ("d: //word//write.doc"); // Экспорт DOC в выходной поток Doc.Write (OS); this.closestream (OS); this.closestream (is); } / *** Закрыть поток ввода* @param is* / private void rowestream (inputstream is) {if (is! = Null) {try {is.close (); } catch (ioException e) {e.printstackTrace (); }}} / *** Закрыть выходной поток* @param os* / private void closestream (outputstream os) {if (os! = Null) {try {os.close (); } catch (ioException e) {e.printstackTrace (); }}}}}(Примечание: эта статья основана на POI3.9)
Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!