Java чтение word файла

Эта статья является продолжением знакомства с возможностями библиотеки Apache POI. В прошлой статье мы научились создавать новые Word документы на Java, а сегодня рассмотрим простой пример считывания данных с файлов в формате docx.

Считывание Word документа с помощью Apache POI

Давайте рассмотрим краткие теоретические сведения по работе с библиотекой, колонтитулами и параграфами. Считанный в память docx документ представляет собой экземпляр класса XWPFDocument, который мы будем разбирать на составляющие. Для этого нам понадобятся специальные классы:

  • Отдельные классы XWPFHeader и XWPFFooter — для работы (считывания/создания) верхнего и нижнего колонтитулов.  Доступ к ним можно получить через специальный класс-поставщик XWPFHeaderFooterPolicy.
  • Класс XWPFParagraph — для работы с параграфами.
  • Класс XWPFWordExtractor — для парсинга содержимого всей страницы docx документа

Apache POI содержит множество других полезных классов для работы с таблицами и медиа объектами внутри Word документа, но в этой ознакомительной статье мы ограничимся лишь с разбором колонтитулов и парсингом текстовой информации.

Пример чтения документа Word в формате docx с помощью Apache POI

Теперь добавим в проект библиотеку Apache POI для работы с Word именно в docx формате. Я использую maven, поэтому просто добавлю в проект еще одну зависимость

<dependency>

     <groupId>org.apache.poi</groupId>

     <artifactId>poiooxml</artifactId>

     <version>3.11</version>

</dependency>

Если вы используете gradle или хотите вручную добавить библиотеку в проект, то найти ее можно здесь.

Парсить/считывать я буду docx документ, полученный в предыдущей статье — Создание Word файла. Вы можете использовать свой файл. Содержимое моего документа следующее:

apache_poi_word_create

Теперь напишем простой класс для считывания данных из колонтитулов и параграфов документа:

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

package ua.com.prologistic.excel;

import org.apache.poi.openxml4j.opc.OPCPackage;

import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;

import org.apache.poi.xwpf.usermodel.XWPFDocument;

import org.apache.poi.xwpf.usermodel.XWPFFooter;

import org.apache.poi.xwpf.usermodel.XWPFHeader;

import org.apache.poi.xwpf.usermodel.XWPFParagraph;

import java.io.FileInputStream;

import java.util.List;

public class WordReader {

    public static void main(String[] args) {

        try (FileInputStream fileInputStream = new FileInputStream(«F:/Apache POI Word Test.docx»)) {

            // открываем файл и считываем его содержимое в объект XWPFDocument

            XWPFDocument docxFile = new XWPFDocument(OPCPackage.open(fileInputStream));

            XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(docxFile);

            // считываем верхний колонтитул (херед документа)

            XWPFHeader docHeader = headerFooterPolicy.getDefaultHeader();

            System.out.println(docHeader.getText());

            // печатаем содержимое всех параграфов документа в консоль

            List<XWPFParagraph> paragraphs = docxFile.getParagraphs();

            for (XWPFParagraph p : paragraphs) {

                System.out.println(p.getText());

            }

            // считываем нижний колонтитул (футер документа)

            XWPFFooter docFooter = headerFooterPolicy.getDefaultFooter();

            System.out.println(docFooter.getText());

            /*System.out.println(«_____________________________________»);

            // печатаем все содержимое Word файла

            XWPFWordExtractor extractor = new XWPFWordExtractor(docxFile);

            System.out.println(extractor.getText());*/

        } catch (Exception ex) {

            ex.printStackTrace();

        }

    }

}

Запустим и смотрим в консоль:

Верхний колонтитул создано с помощью Apache POI на Java :)

Prologistic.com.ua новые статьи по Java и Android каждую неделю. Подписывайтесь!

Просто нижний колонтитул

Начинающие Java программисты, обратите внимание, что мы использовали конструкцию try-with-resources — особенность Java 7. Подробнее читайте в специальном разделе Особенности Java 7.

Другой способ считать содержимое Word файла

Приведенный выше пример сначала парсит отдельные части документа, а потом печатает в консоль их содержимое. А как быть, если мы просто хотим посмотреть все содержимое файла сразу? Для этого в Apache POI есть специальный класс XWPFWordExtractor, с помощью которого мы в 2 строчки сделаем то, что нам нужно.

Просто раскомментируйте код в листинге выше и еще раз запустите проект. В консоле просто продублируется вывод на экран.

Подробнее о библиотеке Apache POI читайте здесь, а также посмотрите пример чтения Excel файла, а также создания Excel (xls) документа все помощью Apache POI.

Подписывайтесь на новые статьи по Java и Android.

I want to read a word file in java

import org.apache.poi.poifs.filesystem.*;
import org.apache.poi.hpsf.DocumentSummaryInformation;
import org.apache.poi.hwpf.*;
import org.apache.poi.hwpf.extractor.*;
import org.apache.poi.hwpf.usermodel.HeaderStories;

import java.io.*;

public class ReadDocFileFromJava {

    public static void main(String[] args) {
        /**This is the document that you want to read using Java.**/
        String fileName = "C:\Path to file\Test.doc";

        /**Method call to read the document (demonstrate some useage of POI)**/
        readMyDocument(fileName);

    }
    public static void readMyDocument(String fileName){
        POIFSFileSystem fs = null;
        try {
            fs = new POIFSFileSystem(new FileInputStream(fileName));
            HWPFDocument doc = new HWPFDocument(fs);

            /** Read the content **/
            readParagraphs(doc);

            int pageNumber=1;

            /** We will try reading the header for page 1**/
            readHeader(doc, pageNumber);

            /** Let's try reading the footer for page 1**/
            readFooter(doc, pageNumber);

            /** Read the document summary**/
            readDocumentSummary(doc);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }  

    public static void readParagraphs(HWPFDocument doc) throws Exception{
        WordExtractor we = new WordExtractor(doc);

        /**Get the total number of paragraphs**/
        String[] paragraphs = we.getParagraphText();
        System.out.println("Total Paragraphs: "+paragraphs.length);

        for (int i = 0; i &lt; paragraphs.length; i++) {

            System.out.println("Length of paragraph "+(i +1)+": "+ paragraphs[i].length());
            System.out.println(paragraphs[i].toString());

        }

    }

    public static void readHeader(HWPFDocument doc, int pageNumber){
        HeaderStories headerStore = new HeaderStories( doc);
        String header = headerStore.getHeader(pageNumber);
        System.out.println("Header Is: "+header);

    }

    public static void readFooter(HWPFDocument doc, int pageNumber){
        HeaderStories headerStore = new HeaderStories( doc);
        String footer = headerStore.getFooter(pageNumber);
        System.out.println("Footer Is: "+footer);

    }

    public static void readDocumentSummary(HWPFDocument doc) {
        DocumentSummaryInformation summaryInfo=doc.getDocumentSummaryInformation();
        String category = summaryInfo.getCategory();
        String company = summaryInfo.getCompany();
        int lineCount=summaryInfo.getLineCount();
        int sectionCount=summaryInfo.getSectionCount();
        int slideCount=summaryInfo.getSlideCount();


    enter code here
        System.out.println("---------------------------");
        System.out.println("Category: "+category);
        System.out.println("Company: "+company);
        System.out.println("Line Count: "+lineCount);
        System.out.println("Section Count: "+sectionCount);
        System.out.println("Slide Count: "+slideCount);

    }

}

http://sanjaal.com/java/tag/java-and-docx-format/

I want to read a doc or docx file in Java

In this article we will be discussing about ways and techniques to read word documents in Java using Apache POI library. The word document may contain images, tables or plain text. Apart from this a standard word file has header and footers too. Here in the following examples we will be parsing a word document by reading its different paragraph, runs, images, tables along with headers and footers. We will also take a look into identifying different styles associated with the paragraphs such as font-size, font-family, font-color etc.

Maven Dependencies

Following is the poi maven depedency required to read word documents. For latest artifacts visit here

pom.xml

	<dependencies>
		<dependency>
                     <groupId>org.apache.poi</groupId>
                     <artifactId>poi-ooxml</artifactId>
		     <version>3.16</version>
                 </dependency>
	</dependencies>

Reading Complete Text from Word Document

The class XWPFDocument has many methods defined to read and extract .docx file contents. getText() can be used to read all the texts in a .docx word document. Following is an example.

TextReader.java

public class TextReader {
	
	public static void main(String[] args) {
	 try {
		   FileInputStream fis = new FileInputStream("test.docx");
		   XWPFDocument xdoc = new XWPFDocument(OPCPackage.open(fis));
		   XWPFWordExtractor extractor = new XWPFWordExtractor(xdoc);
		   System.out.println(extractor.getText());
		} catch(Exception ex) {
		    ex.printStackTrace();
		}
 }

}

Reading Headers and Foooters of Word Document

Apache POI provides inbuilt methods to read headers and footers of a word document. Following is an example that reads and prints header and footer of a word document. The example .docx file is available in the source which can be downloaded at the end of thos article.

HeaderFooter.java

public class HeaderFooterReader {

	public static void main(String[] args) {
		
		try {
			FileInputStream fis = new FileInputStream("test.docx");
			XWPFDocument xdoc = new XWPFDocument(OPCPackage.open(fis));
			XWPFHeaderFooterPolicy policy = new XWPFHeaderFooterPolicy(xdoc);

			XWPFHeader header = policy.getDefaultHeader();
			if (header != null) {
				System.out.println(header.getText());
			}

			XWPFFooter footer = policy.getDefaultFooter();
			if (footer != null) {
				System.out.println(footer.getText());
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}

	}

}

Output

This is Header

This is footer

 Other Interesting Posts
Java 8 Lambda Expression
Java 8 Stream Operations
Java 8 Datetime Conversions
Random Password Generator in Java

Read Each Paragraph of a Word Document

Among the many methods defined in XWPFDocument class, we can use getParagraphs() to read a .docx word document paragraph wise.This method returns a list of all the paragraphs(XWPFParagraph) of a word document. Again the XWPFParagraph has many utils method defined to extract information related to any paragraph such as text alignment, style associated with the paragrpahs.

To have more control over the text reading of a word document,each paragraph is again divided into multiple runs. Run defines a region of text with a common set of properties.Following is an example to read paragraphs from a .docx word document.

ParagraphReader.java

public class ParagraphReader {

	public static void main(String[] args) {
		try {
			FileInputStream fis = new FileInputStream("test.docx");
			XWPFDocument xdoc = new XWPFDocument(OPCPackage.open(fis));

			List paragraphList = xdoc.getParagraphs();

			for (XWPFParagraph paragraph : paragraphList) {

				System.out.println(paragraph.getText());
				System.out.println(paragraph.getAlignment());
				System.out.print(paragraph.getRuns().size());
				System.out.println(paragraph.getStyle());

				// Returns numbering format for this paragraph, eg bullet or lowerLetter.
				System.out.println(paragraph.getNumFmt());
				System.out.println(paragraph.getAlignment());

				System.out.println(paragraph.isWordWrapped());

				System.out.println("********************************************************************");
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
}

Reading Tables from Word Document

Following is an example to read tables present in a word document. It will print all the text rows wise.

TableReader.java

public class TableReader {

	public static void main(String[] args) {
		try {
			FileInputStream fis = new FileInputStream("test.docx");
			XWPFDocument xdoc = new XWPFDocument(OPCPackage.open(fis));
			Iterator bodyElementIterator = xdoc.getBodyElementsIterator();
			while (bodyElementIterator.hasNext()) {
				IBodyElement element = bodyElementIterator.next();

				if ("TABLE".equalsIgnoreCase(element.getElementType().name())) {
					List tableList = element.getBody().getTables();
					for (XWPFTable table : tableList) {
						System.out.println("Total Number of Rows of Table:" + table.getNumberOfRows());
						for (int i = 0; i < table.getRows().size(); i++) {

							for (int j = 0; j < table.getRow(i).getTableCells().size(); j++) {
								System.out.println(table.getRow(i).getCell(j).getText());
							}
						}
					}
				}
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
}

Reading Styles from Word Document

Styles are associated with runs of a paragraph. There are many methods available in the XWPFRun class to identify the styles associated with the text.There are methods to identify boldness, highlighted words, capitalized words etc.

StyleReader.java

public class StyleReader {

	public static void main(String[] args) {
		try {
			FileInputStream fis = new FileInputStream("test.docx");
			XWPFDocument xdoc = new XWPFDocument(OPCPackage.open(fis));

			List paragraphList = xdoc.getParagraphs();

			for (XWPFParagraph paragraph : paragraphList) {

				for (XWPFRun rn : paragraph.getRuns()) {

					System.out.println(rn.isBold());
					System.out.println(rn.isHighlighted());
					System.out.println(rn.isCapitalized());
					System.out.println(rn.getFontSize());
				}

				System.out.println("********************************************************************");
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}

	}

}

Reading Image from Word Document

Following is an example to read image files from a word document.

public class ImageReader {

	public static void main(String[] args) {

		try {
			FileInputStream fis = new FileInputStream("test.docx");
			XWPFDocument xdoc = new XWPFDocument(OPCPackage.open(fis));
			List pic = xdoc.getAllPictures();
			if (!pic.isEmpty()) {
				System.out.print(pic.get(0).getPictureType());
				System.out.print(pic.get(0).getData());
			}

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

}

Conclusion

I hope this article served you that you were looking for. If you have anything that you want to add or share then please share it below in the comment section.

Download source

Автор оригинала: Nikita Masand.

В этой статье мы научимся читать и писать Microsoft Word с помощью библиотеки POI Apache .

Темы

  1. Apache POI – HWPF и XWPF
  2. Зависимости POI Apache
  3. Создайте документ word
  4. Работа с абзацами, шрифтами и страницей перерывы
  5. Верхний и нижний колонтитулы документа
  6. Добавить изображение
  7. Создайте таблицу
  8. Прочитайте и проанализируйте документ, абзац и таблицу
  9. Обновить документ

P.S Протестировано с Apache POI 4.1.2 и Java 8

1. Apache POI – HWPF и XWPF

Apache POI предоставляет API Java для работы с документами Microsoft. Мы рассмотрим варианты использования, включающие абзацы, шрифты, верхние и нижние колонтитулы, таблицы, изображения, запись, чтение, анализ и обновление документа. Прежде чем изучить варианты использования, давайте рассмотрим основные концепции, связанные с библиотекой POI Apache.

1.1 HWPF (ужасный формат текстового процессора) Эти API-интерфейсы предназначены для более старых форматов файлов Word 6 и Word 95, .doc документы.

1.2 XWPF (формат текстового процессора XML) Эти API предназначены для новых документов Word 2007, .docx .

Документ XWPFDocument Он предоставляет API-интерфейсы высокого уровня для создания / редактирования файлов .docx word
xwpfпараграф Он используется для работы с абзацами
XWPFRun Он определяет область текста с общим набором свойств. Он также используется для редактирования свойств шрифта
XWPFTable Он используется для описания содержимого компонента таблицы, присутствующего в файле word
XWPFTableRow Он определяет строки, присутствующие в компоненте таблицы
Xwpfвордэкстрактор Он используется для извлечения текста из файла word

P.S Эта статья будет посвящена последним XWPF API-интерфейсы, работа с .docx документы.

Нам нужен только poi-ooxml для работы с Microsoft word.

  
      org.apache.poi
      poi-ooxml
      4.1.2
  

3. Создайте документ word

В этом примере показано, как создать файл Microsoft Word .docx . Мы используем XWPFParagraph для создания абзацев и XWPFRun для создания текста.

package com.mkyong.poi.word;

import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

import java.io.FileOutputStream;
import java.io.IOException;

public class CreateDocumentSimple {

    public static void main(String[] args) throws IOException {

        String fileName = "c:\test\hello.docx";

        try (XWPFDocument doc = new XWPFDocument()) {

            // create a paragraph
            XWPFParagraph p1 = doc.createParagraph();
            p1.setAlignment(ParagraphAlignment.CENTER);

            // set font
            XWPFRun r1 = p1.createRun();
            r1.setBold(true);
            r1.setItalic(true);
            r1.setFontSize(22);
            r1.setFontFamily("New Roman");
            r1.setText("I am first paragraph.");

            // save it to .docx file
            try (FileOutputStream out = new FileOutputStream(fileName)) {
                doc.write(out);
            }

        }

    }
}

Выход

4. Работа с абзацами, шрифтами и разрывы страниц

Мы можем использовать XWPFRun для настройки свойств стиля шрифта. Он содержит методы изменения свойств шрифта, таких как цвет, размер шрифта, курсив, жирный шрифт, заглавные буквы, тиснение и многое другое.

Мы создаем четыре абзаца и устанавливаем различные свойства шрифта, разрывы строк и разрывы страниц для каждого из них.

package com.mkyong.poi.word;

import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

import java.io.FileOutputStream;
import java.io.IOException;

public class WorkingParagraphFonts {

    public static void main(String[] args) throws IOException {

        try (XWPFDocument doc = new XWPFDocument()) {

            XWPFParagraph p1 = doc.createParagraph();
            p1.setAlignment(ParagraphAlignment.CENTER);

            // Set Text to Bold and font size to 22 for first paragraph
            XWPFRun r1 = p1.createRun();
            r1.setBold(true);
            r1.setItalic(true);
            r1.setFontSize(22);
            r1.setText("I am first paragraph. My Text is bold, italic, Courier and capitalized");
            r1.setFontFamily("Courier");

            XWPFParagraph p2 = doc.createParagraph();
            //Set color for second paragraph
            XWPFRun r2 = p2.createRun();
            r2.setText("I am second paragraph. My Text is Red in color and is embossed");
            r2.setColor("ff0000");
            r2.setEmbossed(true);

            XWPFParagraph p3 = doc.createParagraph();
            //Set strike for third paragraph and capitalization
            XWPFRun r3 = p3.createRun();
            r3.setStrikeThrough(true);
            r3.setCapitalized(true);
            r3.setText("I am third paragraph. My Text is strike through and is capitalized");

            XWPFParagraph p4 = doc.createParagraph();
            p4.setWordWrapped(true);
            p4.setPageBreak(true);  // new page break
            p4.setIndentationFirstLine(600);

            XWPFRun r4 = p4.createRun();
            r4.setFontSize(40);
            r4.setItalic(true);
            //r4.setTextPosition(100);
            r4.setText("Line 1");
            r4.addBreak();
            r4.setText("Line 2");
            r4.addBreak();
            r4.setText("Line 3");

            // save the docs
            try (FileOutputStream out = new FileOutputStream("c:\test\simple.docx")) {
                doc.write(out);
            }

        }

    }

}

Рисунок: Страница 1

Рисунок: Страница 2

5. Верхний и нижний колонтитулы документа

В этом примере создается верхний и нижний колонтитулы документа для всех страниц.

Рисунок: Страница 1

Рисунок: Страница 2

6. Добавить изображение

В этом примере в документ добавляется изображение.

7. Создайте таблицу

В этом примере мы рассмотрим, как мы можем вставить таблицу в файл документа Word. Мы будем использовать компонент XWPFTable для создания и инициализации элемента таблицы.

В этом примере вставляется таблица, содержащая 3 строки и 3 столбца.

P.S Предупреждение для OpenOffice 4.1.7, API-интерфейсы таблиц неправильно отформатировали таблицу.

8. Прочитайте и проанализируйте документ, абзац и таблицу.

В этом примере будет показано, как мы можем использовать POI Apache для извлечения и считывания текста из документов.

8.1 Мы можем извлечь весь текст из документа с помощью XWPFWordExtractor . Файл simple.docx генерируется из примера 4. Работа с абзацами, шрифтами и разрывами страниц .

Вывод

8.2 В этом примере мы используем doc.getparagraphs() для списка абзацев документа. Как только мы получим список, мы сможем повторить отдельные элементы абзаца и получить текст.

8.3 Файл table.docx генерируется из примера 7. Создайте таблицу . Нам нужно получить список всех элементов в файле, а затем выполнить итерацию по нему, чтобы проверить наличие компонента ТАБЛИЦА . Как только мы найдем компонент ТАБЛИЦА , мы можем выполнить итерацию по нему, чтобы извлечь строки таблицы, и, наконец, выполнить итерацию по строкам, чтобы извлечь значения таблицы.

Вывод

9 . Обновить документ

В этом примере мы будем использовать предварительно заполненный файл шаблона template.docx . Файл шаблона содержит следующий текст Привет ${имя}, Поздравляю, вы учитесь чему-то новому! . И мы заменим строку ${имя} предопределенным вводом и создадим новый файл output.docx с обновленным содержимым.

Рисунок: c:testtemplate.docx

Вывод

Рисунок: c:testoutput.docx

Дальнейшее чтение Для получения дополнительных примеров, пожалуйста, обратитесь к этому официальному Примеры Apache POI XWPF

Скачать исходный код

$ клон git https://github.com/mkyong/apache-poi-examples/

$ cd word

Ссылки

  • Microsoft Word
  • Apache POI – Java API для обработки файлов Microsoft Word
  • Примеры XWPF Apache POI

| Идентификатор текущей записи загружено через JS |/автор комментарии

Оригинал: “https://mkyong.com/java/java-read-and-write-microsoft-word-with-apache-poi/”


This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters

Show hidden characters

import java.io.File;
import java.io.FileInputStream;
import java.util.List;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
public class DocReader {
public static void readDocFile(String fileName) {
try {
File file = new File(fileName);
FileInputStream fis = new FileInputStream(file.getAbsolutePath());
HWPFDocument doc = new HWPFDocument(fis);
WordExtractor we = new WordExtractor(doc);
String[] paragraphs = we.getParagraphText();
System.out.println(«Total no of paragraph «+paragraphs.length);
for (String para : paragraphs) {
System.out.println(para.toString());
}
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void readDocxFile(String fileName) {
try {
File file = new File(fileName);
FileInputStream fis = new FileInputStream(file.getAbsolutePath());
XWPFDocument document = new XWPFDocument(fis);
List<XWPFParagraph> paragraphs = document.getParagraphs();
System.out.println(«Total no of paragraph «+paragraphs.size());
for (XWPFParagraph para : paragraphs) {
System.out.println(para.getText());
}
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
readDocxFile(«C:\Test.docx»);
readDocFile(«C:\Test.doc»);
}
}

Like this post? Please share to your friends:
  • Java таблица как в excel
  • Java api for word
  • Java сохранение в excel
  • Java apache poi excel формула
  • Java apache poi excel примеры