当前位置: 首页 > 知识库问答 >
问题:

尝试将数据重新插入excel文件时出错

祁坚壁
2023-03-14

我正在尝试读取文本文件,然后对其应用一些数据验证规则。添加规则后,我将数据写回Excel文件。

但是当尝试将其写回excel文件时,我收到了这个错误:

线程“主”org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException:保存失败:保存包时发生错误:部分 /docProps/app.xml无法保存在流中,编组器org.apache.poi.openxml4j.opc.internal.marshallers.DefaultMarshaller@74ad1f1forg.apache.poi.openxml4j.opc.ZipPackage.saveImpl(ZipPackage.java:479)在org.apache.poi.openxml4j.opc.OPCPackage.save(OPCPackage.java:1414)在org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:179)在com.gbt.POC.TxtFileReader.main(TxtFileReader.java:359)由org.apache.poi.openxml4j.exceptions.OpenXML引起4JException:部分 /docProps/app.xml无法保存在流中,编组器org.apache.poi.openxml4j.opc.internal.marshallers.DefaultMarshaller@74ad1f1f在org.apache.poi.openxml4j.opc.ZipPackage.saveImpl(ZipPackage.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个答案

通骁
2023-03-14

您可以使用Xcelite图书馆让您的生活更加轻松:

>

  • 首先创建一个小bean类

    创建一个Xcelite对象,并让它创建一个工作表

    获取作家

    给你写豆子

    写入输出流

    import com.ebay.xcelite.annotations.Column;
    
    public class Entity {
        @Column
        String empid1;
        @Column
        String fname;
        @Column
        String ccode1;
    }
    
    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);
    }
    

  • 浦墨竹
    2023-03-14

    我复制并粘贴了你的代码,看看是什么错误。不幸的是,我看不到你的错误。但在搜索错误后,我找到了一些答案。。

    发生此异常是因为excel工作表的POI API多次写入excel工作表。每次它都需要在同一个File对象上创建一个新的FileOutputStream实例。

    要解决此问题,请先将所有行写入工作簿实例,然后使用FileOutputStream写入工作簿。

    https://tjavadeeps . WordPress . com/2015/04/14/org-Apache-poi-open XML 4j-exceptions-open XML 4 jruntimeexception-fail-to-save-an-error-occurs-while-saving-the-package/

    org . Apache . poi . open XML 4j . exceptions . open XML 4 jruntimeexception:保存失败

    希望你得到一个提示。

    接下来,我制作了我的txt文件,并像你做的那样保存到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);
        }
    }
    
     类似资料:
    • 我正在使用Maven创建一个Selenium项目,其中我试图从Excel文件(xlsx)中读取“username”和“password”。 这是密码- 我得到的错误在这一行: Driver.FindElement(By.XPath(“//input[@type='text']”)).SendKeys(Sheet.GetRow(i).GetCell(j).GetStringCellValue());

    • 我试图将一个目录中的几个csv文件读入pandas,并将它们连接到一个大数据帧中,但出现以下错误: 这是我的密码 我不知道为什么它不起作用。我试图用chmod解决这个问题,但一切都变了

    • 我正试图将数据从Excel导入到SQL Server表中,但遇到了这个错误。你能建议如何避免这些吗?

    • 我忙于一项学校作业,我有一个由三个表组成的基本access数据库。Book、Reader和BookRated,其中as BookRated是交集表,主键userName来自Reader和ISBN来自Book组成BookRated的复合主键(作为外键)。 我正试图将信息插入书签表中,但出现以下错误

    • 新数组列表 我用多头填充这个数组列表。 当我试图将其插入postgresql时,我使用以下方法: 使用JDBC模板。但是当我试图运行这段代码时,它在“ARRAY[?]”上给出了一个错误。但如果temp2是一个单一的数字,比如:1253214,它就可以工作。有人有主意吗? 我的错误是: PreparedStatementCallback;错误的SQL语法[UPDATE pb1plnitm SET p

    • 我正在阅读一个用一些分隔符分隔的文本文件。 我的文本文件内容示例 Avc def efg JKSJD 1 2 3 5 3 4 6 0 每次调用createRow和createCell时是否都会创建新对象? 如果是,有什么替代方案?。如何以更好的性能将大数据写入excel?