Получение ошибки при попытке вставить данные обратно в файл Excel - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь прочитать текстовый файл, а затем применить к нему некоторые правила проверки данных.После добавления правил я затем записываю данные обратно в файл Excel.

Но при попытке записать их обратно в файл Excel я получаю эту ошибку:

Исключение в потоке "main"org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException: не удалось сохранить: при сохранении пакета возникла ошибка: не удается сохранить часть /docProps/app.xml в потоке с помощью marshaller org.apache.poi.openxml4j.opc.internal.marshallers.DefaultMarshaller@74ad1f1f at org.apache.poi.openxml4j.opc.ZipPackage.saveImpl (ZipPackage.java:479) в org.apache.poi.openxml4j.opc.OPCPackage.save (OPCPackage.jj (OPCPackage.jj)) в org.apache.poi.POIXMLDocument.write (POIXMLDocument.java:179) в com.gbt.POC.TxtFileReader.main (TxtFileReader.java:359) Вызывается: org.apache.poi.openxml4j.exceptions.OpenXMLJJНе удалось сохранить часть /docProps/app.xml в потоке с помощью маршаллера org.apache.poi.openxml4j.opc.internal.marshallers.DefaultMarshaller@74ad1f1f в org.apache.poi.openxml4j.opc.ZipPackage.saveImpl Z (ipPackage.java:470) ... еще 3

Вот что у меня есть:

LinkedList < String[] > llist = new LinkedList < > ();

String[] data;

XSSFWorkbook workBook = new XSSFWorkbook();
FileOutputStream outstream = new FileOutputStream("data.xls");
XSSFSheet spreadSheet = workBook.createSheet("Clean");

for (int i = 0; i < llist.size(); i++) {
 if (i == 0) {
  System.out.println("Hello World!");
 } else {
  data = llist.get(i);

  String empid1 = data[0];
  String fname = data[1];
  String ccode1 = data[2];

  if (data[2].equals("IND")) {
   replace = data[2].replaceAll("IND", "IN");
   ccode1 = replace;
  } else if (data[2].equals("USA")) {
   replace = data[2].replaceAll("USA", "US");
   ccode1 = replace;
  } else {
   ccode1 = data[2];
  }

  //String newData=empid1+","+fname+","+ccode1;

  XSSFRow row = spreadSheet.createRow(i);

  XSSFCell cell = row.createCell(0);
  cell.setCellValue(empid1);

  cell = row.createCell(1);
  cell.setCellValue(fname);

  cell = row.createCell(2);
  cell.setCellValue(ccode1);
 }
}

workBook.write(outstream);

Любая помощь приветствуется заранее.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Вы можете использовать библиотеку Xcelite , чтобы сделать вашу жизнь проще:

  1. Сначала создайте небольшой класс бобов

  2. Создайте объект Xcelite и сделайте так, чтобы он создал лист

  3. Получите Writer

  4. Напишите свои бобы

  5. Запись в OutputStream

Класс EJB

import com.ebay.xcelite.annotations.Column;

public class Entity {
    @Column
    String empid1;
    @Column
    String fname;
    @Column
    String ccode1;
}

Создайте объект Xcelite и попросите его создать Sheet and Writer

Xcelite xcelite = new Xcelite();
XceliteSheet sheet = xcelite.createSheet("Clean");
SheetWriter writer = sheet.getBeanWriter(Entity.class);

Выпишите

    writer.write(entities);
    xcelite.write(outstream);

Подводя итог, вот ваш модифицированный код:

    LinkedList<String[]> llist = new LinkedList <> ();
    String in0[] = new String[3];
    llist.add(in0);
    String in1[] = new String[3];
    in1[0] = "1";
    in1[1] = "testtest";
    in1[2] = "IND";
    llist.add(in1);

    String[] data;
    FileOutputStream outstream = new FileOutputStream( "C:\\Users\\Desktop\\data.xls");
    Xcelite xcelite = new Xcelite();
    XceliteSheet sheet = xcelite.createSheet("Clean");
    SheetWriter writer = sheet.getBeanWriter(Entity.class);
    List<Entity> entities = new ArrayList<>();

    for (int i = 0; i < llist.size(); i++) {
        if (i == 0) {
            System.out.println("Hello World!");
        } else {
            data = llist.get(i);
            String ccode1 = data[2];

            String replace;
            if (data[2].equals("IND")) {
                replace = data[2].replaceAll("IND", "IN");
                ccode1 = replace;
            } else if (data[2].equals("USA")) {
                replace = data[2].replaceAll("USA", "US");
                ccode1 = replace;
            } else {
                ccode1 = data[2];
            }
            Entity entity = new Entity();
            entities.add(entity);
            entity.empid1 = data[0];
            entity.fname = data[1];
            entity.ccode1 = ccode1;
        }
    }
    writer.write(entities);
    xcelite.write(outstream);
}
0 голосов
/ 23 сентября 2018

Я скопировал и вставил ваш код, чтобы увидеть, что это за ошибка.К сожалению, я не мог видеть вашу ошибку.Но после поиска ошибки я нашел несколько ответов ..

Это исключение произошло, потому что API POI для таблицы Excel записывает в таблицу Excel несколько раз.И каждый раз требуется новый экземпляр FileOutputStream поверх того же объекта File.

Чтобы решить эту проблему, сначала записали все строки в экземпляр рабочей книги, а затем записали в рабочую книгу, используя FileOutputStream.

https://tjavadeeps.wordpress.com/2015/04/14/org-apache-poi-openxml4j-exceptions-openxml4jruntimeexception-fail-to-save-an-error-occurs-while-saving-the-package/

org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException: не удалось сохранить

Надеюсь, вы получите подсказку.

Далее я сделал свой текстовый файл и сохранил в Excel, как то, что ты сделал, и это работает,

package excelTest;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.LinkedList;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class readExcel {

    public static void main(String[] args) throws IOException {
        LinkedList<String> llist = new LinkedList<>();
        String[] data = null;
        String replace = "";
        XSSFWorkbook workBook = new XSSFWorkbook();
        FileOutputStream outstream = new FileOutputStream( "C:\\Users\\Desktop\\data.xls");
        XSSFSheet spreadSheet = workBook.createSheet("Clean");

        /*
         * MyFile.txt
           ----------------------
            0
            IND 
            USA
            LOVE
           ----------------------
         */



        try (BufferedReader br = new BufferedReader(new FileReader( "C:\\Users\\Desktop\\myFile.txt"))) {
            String sCurrentLine;

            while ((sCurrentLine = br.readLine()) != null) {
                llist.add(sCurrentLine);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }


        String empid1 = "";
        String fname = "";
        String ccode1 = "";


        System.out.println("llist.get(i)"+llist.get(0)+"   "+llist.get(1));
        for (int i = 0; i < llist.size(); i++){
            System.out.println(llist.get(i));
        }
        empid1 = llist.get(1);  //IND
        fname = llist.get(2);   //USA
        ccode1 =llist.get(3);   //LOVE


        if (fname.equals("IND")) {
            replace = fname.replaceAll("IND", "IN");
            ccode1 = replace;
        } else if (fname.equals("USA")) {
            replace = fname.replaceAll("USA", "US");
            ccode1 = replace; //'LOVE' CHANGE TO US. (IF YOU WANT TO CHANGE TO US IN HERE-> fname=fname.replaceAll("USA","US");
        } else {
            ccode1 = fname; //'LOVE' CHANGE TO USA AGAIN.
        }


        XSSFRow row = spreadSheet.createRow(0);

        XSSFCell cell = row.createCell(0);
        cell.setCellValue(empid1);

        cell = row.createCell(1);
        cell.setCellValue(fname);

        cell = row.createCell(2);
        cell.setCellValue(ccode1);
        workBook.write(outstream);
    }
}
...