записать данные в файл excel после извлечения абзацев/строк из HWPFDocument (файлы .doc)

Здесь мой код помогает мне извлекать данные из файлов .doc в абзацы, а также искать конкретные строки. Я могу вывести его вручную, используя конфигурацию запуска eclipse. но 1) я хотел, чтобы он направлял вывод в файл excel, где это файл .doc. 2) вывод должен быть указан только в ячейках.

public static void readParagraphs(HWPFDocument docx) throws Exception{
    we = new WordExtractor(docx);
    String[] paragraphs = we.getParagraphText();     
    // To fetch for mode
    for(String p: paragraphs){
    if(p.startsWith("MODE"))
    System.out.println("       "+p);
    }
    for(String type: paragraphs ){
    if(type.startsWith("TYPE"))
    System.out.format("       "+type);
    }
    }

Ожидаемый результат:

S.no  | Doc name  | Title    | mode            | type
=====================================================================
1     | laptop    | A12345   | abcd 123456     | efghij A12345/123456
2     | laptop    | A12346   | abcd 123457     | efghij A12345/123457
3     | laptop    | A12347   | abcd 123458     | efghij A12345/123458

здесь вы можете увидеть часть моего кода HSSFWorkbook.

HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("firstsheet");
Row row1 = sheet.createRow((short) 0);
row1.createCell(0).setCellValue("S.NO");
row1.createCell(1).setCellValue("DOC NAME");
row1.createCell(2).setCellValue("TITLE");
row1.createCell(3).setCellValue("MODE");
row1.createCell(4).setCellValue("TYPE");
Row row2 = sheet.createRow(rowNum++);
row2.createCell(3).setCellValue(" "+mode);
row2.createCell(4).setCellValue(" "+type);
Row row3 = sheet.createRow(rowNum++);
row3.createCell(3).setCellValue(" "+mode);
row3.createCell(4).setCellValue(" "+type);

ниже таблица доступна на листе 1, заголовочный файл. нужно извлечь только "A12345"

 =====================================
 |  xx |       A12345         |xx    |     
 =====================================

ниже таблицы доступны либо лист 2 или 3-6. зависит от каждого документа.

 --------------------------------------------.--------------------
|MODE :  Abcde 123456 efghit 234567  sddsldjf 232132             |
|----------------------------------------------------------------|  
|INFO   |TYPE : efghij A12345/123456 dsflsdjflsd B22323/&123456  |
|       |xxxxxxxxxxxxxxxxxalphanumericxxxxxxxxxxxxxxxxxxxxxxxxxx |
 -----------------------------------------------------------------

if(p.startsWith("MODE"))// этот метод помогает напечатать " MODE : Abcde 123456 efghit 234567 sddsldjf 232132 " if(type.startsWith("TYPE")) // этот метод помогает напечатать "TYPE : efghij A12345/123456 dsflsdjflsd B22323/&123456 ", но в некоторых документах нет "ТИПА", поэтому я бы выбрал два варианта: либо найти следующие строки до "ОБОСНОВАНИЕ" из "РЕЖИМ", либо распознавание образов для получения строк "ТИП". искать предложения.

таблица ниже доступна после таблицы выше

 -----------------------------------------------------------
|JUSTIFICATION                                              |   
|-----------------------------------------------------------
|   |   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    |
|   |   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx alphanumericxxx    |
 -----------------------------------------------------------


import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.poifs.filesystem.*;
import org.apache.poi.sl.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.hwpf.usermodel.HeaderStories;
import java.util.ArrayList;
import java.util.List;
import java.io.*;
public class ReadDocFileFromJava {

    public static int test = 0;

    private static WordExtractor ex;

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

            List<String> fileName=new ArrayList<String>();  


        fileName.add("C:\\1200.doc");
        fileName.add("C:\\1210.doc");
        fileName.add("C:\\1211.doc");
        fileName.add("C:\\1212.doc");
        fileName.add("C:\\1213.doc");
                // document 2 
        fileName.add("C:\\1214.doc");
        fileName.add("C:\\1215.doc");
        fileName.add("C:\\1216.doc");
        fileName.add("C:\\1217.doc");


        for(int i=0;i<fileName.size();i++){

               readMyDocument(fileName.get(i));
        }}

    public static void readMyDocument(String i){
        POIFSFileSystem fs = null;
        try {
            fs = new POIFSFileSystem(new FileInputStream(i));

            HWPFDocument docx = new HWPFDocument(fs);
            ex = new WordExtractor(docx);
           readParagraphs(docx);
           fs.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
public static void readParagraphs(HWPFDocument docx) throws Exception{

        int a =0,b=0,c=0,d=0,celIte=0, celIte2=0,link=0;
        ex = new WordExtractor(docx);
        String[] paragraphs = ex.getParagraphText();

        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet("firstsheet");
        Row row0 = sheet.createRow(0);
        row0.createCell(0).setCellValue("S.NO");
        row0.createCell(1).setCellValue("DOC NAME");
        row0.createCell(2).setCellValue("TITLE");
        row0.createCell(3).setCellValue("MODE");
        row0.createCell(4).setCellValue("TYPE");
          for(int i=1;i<=10;i++){
                        Row row1 = sheet.createRow(i);
                for(int j=0;j<=0;j++){
                    Cell cell_10 =row1.createCell(j);
                    do{
                        cell_10.setCellValue(celIte);
                        celIte++;
                    }while(celIte<1);

                    for(int k=3;k<=3;k++){

                    Cell cell_12 = row1.createCell(k);
                    for(String p: paragraphs){


                          if(p.startsWith("MODE"))  
                         cell_12.setCellValue(""+p);
        }   }
      workbook.write(new FileOutputStream("C:\\output.xls"));

        workbook.close();

}
                }
        }}

S.NO  | DOC NAME | TITLE | MODE | TYPE
==========================================
1                          XXXX
2                          XXXX 
3                          XXXX
4                          XXXX
5                          XXXX
6                          XXXX
7                          XXXX
8                          XXXX
9                          XXXX

person shravan    schedule 26.04.2017    source источник
comment
вы должны прояснить, чего вы пытаетесь достичь. 1.)i wanted it to direct output into excel file where it is .doc file что ты имеешь в виду? 2.) output must be specified cells only как мы должны узнать, какой выход и какие ячейки?   -  person XtremeBaumer    schedule 26.04.2017
comment
1) когда мы запускаем код, он должен создать файл excel, используя FileOutputStreams, а не вывод консоли. 2) пожалуйста, игнорируйте это сейчас. мне не очень понятно.   -  person shravan    schedule 26.04.2017
comment
да. хочу в экселе. Я знал, что csv не поддерживается Apache POI.   -  person shravan    schedule 26.04.2017
comment
извините, этот комментарий был неправильным вопросом. если вы хотите создать файл Excel, используйте что-то вроде этогоtry (OutputStream out = Files.newOutputStream(new Path(), StandardOpenOption.CREATE_NEW)) { this.workBook.write(out); this.workBook.close(); return path.toFile(); } посмотрите здесь   -  person XtremeBaumer    schedule 26.04.2017
comment
if(type.startsWith(TYPE)) результат этого строкового метода, сгенерированного HWPFDocument на выходе консоли. как я могу вызвать ссылочную переменную/создать объект из этого строкового метода в выходные потоки. Я посмотрел ссылку, она подходит для XSSF и HSSF.   -  person shravan    schedule 27.04.2017
comment
вы создаете книгу, затем лист. затем вы создаете строку, и в этой строке вы создаете ячейку, а затем вызываете cell.setValue();, и в этом вызове метода вы должны ввести параметр, и этот параметр должен быть " "+type   -  person XtremeBaumer    schedule 27.04.2017
comment
да нормально работает. также не могли бы вы рассказать, как повторить цикл для строковых методов, потому что он печатает одно и то же значение в другую ячейку. где он правильно печатается при выводе на консоль.   -  person shravan    schedule 27.04.2017
comment
можете ли вы показать, как это должно выглядеть при печати на листе Excel?   -  person XtremeBaumer    schedule 28.04.2017
comment
заголовок 1 заголовок 2 заголовок 3 тип режима   -  person shravan    schedule 28.04.2017
comment
пожалуйста, добавьте его к своему вопросу и отформатируйте его, а также все некоторые примеры в столбцы/строки   -  person XtremeBaumer    schedule 28.04.2017
comment
как получить S.no | Doc name | Title ? значения?   -  person XtremeBaumer    schedule 28.04.2017
comment
Метод if(p.startsWith(MODE)) я получу заголовок, режим, тип и «имя документа», я ищу предложения по извлечению имен и «s.no»   -  person shravan    schedule 28.04.2017
comment
тогда, пожалуйста, предоставьте пример файла, который вы читаете, и как в настоящее время (в syso) выглядит строка   -  person XtremeBaumer    schedule 28.04.2017
comment
пожалуйста, не размещайте ссылки на файлы или изображения. пока вы можете опубликовать это здесь, сделайте это   -  person XtremeBaumer    schedule 02.05.2017
comment
я отредактировал вопрос, пожалуйста, проверьте.   -  person shravan    schedule 02.05.2017
comment
то, что вы можете попробовать, если вы можете прочитать файлы на 100% правильно, - это сохранить значения, которые вы вместо этого печатаете в POJO с несколькими списками массивов для всех возможных заголовков (S.no, имя документа, название, режим, тип). после прочтения всех файлов вы просто записываете pojo в файл excel, перебирая каждый список и правильно устанавливая значения ячеек.   -  person XtremeBaumer    schedule 03.05.2017
comment
кроме имени документа остальные 3 поля доступны для чтения и записи. но имя документа может быть напечатано на консоли. не могли бы вы проверить код.   -  person shravan    schedule 05.05.2017
comment
думаю, я знаю, почему. вы создаете новую книгу для каждого документа, который вы читаете, и, возможно, удаляете предыдущий. вы получаете всю информацию S.NO | DOC NAME | TITLE | MODE | TYPE из файлов или какие-то самодельные?   -  person XtremeBaumer    schedule 05.05.2017


Ответы (1)


немного изменил ваш код, но он, конечно, еще не работает, так как мне не хватает информации. может быть, вы можете попробовать закодировать остальные

public class ReadDocFileFromJava {

    public static int test = 0;

    private static WordExtractor ex;

    private static List<String[]> allParagraphs;

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

        List<String> fileName = new ArrayList<String>();

        fileName.add("C:\\1200.doc");
        fileName.add("C:\\1210.doc");
        fileName.add("C:\\1211.doc");
        fileName.add("C:\\1212.doc");
        fileName.add("C:\\1213.doc");
        // document 2
        fileName.add("C:\\1214.doc");
        fileName.add("C:\\1215.doc");
        fileName.add("C:\\1216.doc");
        fileName.add("C:\\1217.doc");

        for (int i = 0; i < fileName.size(); i++) {
            allParagraphs.add(readMyDocument(fileName.get(i)));
        }

    }

    public static String[] readMyDocument(String i) {
        POIFSFileSystem fs = null;
        String[] paragraph;
        try {
            fs = new POIFSFileSystem(new FileInputStream(i));
            HWPFDocument docx = new HWPFDocument(fs);
            ex = new WordExtractor(docx);
            paragraph = ex.getParagraphText();
            fs.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return paragraph;

    }

    public static void readParagraphs(List<String[]> paragraphs) throws Exception {

        int a = 0, b = 0, c = 0, d = 0, celIte = 0, celIte2 = 0, link = 0;
        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet("firstsheet");
        Row row = sheet.createRow(0);
        row.createCell(0).setCellValue("S.NO");
        row.createCell(1).setCellValue("DOC NAME");
        row.createCell(2).setCellValue("TITLE");
        row.createCell(3).setCellValue("MODE");
        row.createCell(4).setCellValue("TYPE");
        for (int i = 1; i <= 10; i++) {
            row = sheet.createRow(i);
            for (int j = 0; j <= 0; j++) {
                Cell cell_10 = row.createCell(j);
                do {
                    cell_10.setCellValue(celIte);
                    celIte++;
                } while (celIte < 1);

                for (int k = 3; k <= 3; k++) {

                    Cell cell_12 = row.createCell(k);
                    for (String p : paragraphs) {

                        if (p.startsWith("MODE"))
                            cell_12.setCellValue("" + p);
                    }
                }
                workbook.write(new FileOutputStream("C:\\output.xls"));

                workbook.close();

            }
        }
    }
}
person XtremeBaumer    schedule 05.05.2017