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

读取excel文件并更新添加新行

公良俊楚
2023-03-14

我是java的初学者,我正在尝试做一个小的java程序,读取一个excel文件,并在文件末尾添加一个新行来更新文件。然后再次读取并使用新行ecc,ecc进行更新。

这是我读取的文件(boh.xls):

点击这里查看图片

当他转到“workbook.write()”时,它会向我抛出这个错误:

> XLS FILE -----> Start reading...
0
 CELL: 0 [ Hi ]  CELL: 1 [ empty cell ]  CELL: 2 [ Roby ] 1
 CELL: 0 [ Ciao ]  CELL: 1 [ bobbi ] 2
 CELL: 0 [ empty cell ]  CELL: 1 [ Great ]  CELL: 2 [ Job ] 
3
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/collections4/bidimap/TreeBidiMap
    at org.apache.poi.hpsf.Section.<init>(Section.java:178)
    at org.apache.poi.hpsf.MutableSection.<init>(MutableSection.java:41)
    at org.apache.poi.hpsf.PropertySet.init(PropertySet.java:494)
    at org.apache.poi.hpsf.PropertySet.<init>(PropertySet.java:196)
    at org.apache.poi.hpsf.MutablePropertySet.<init>(MutablePropertySet.java:44)
    at org.apache.poi.hpsf.SpecialPropertySet.<init>(SpecialPropertySet.java:47)
    at org.apache.poi.hpsf.DocumentSummaryInformation.<init>(DocumentSummaryInformation.java:99)
    at org.apache.poi.hpsf.PropertySetFactory.create(PropertySetFactory.java:116)
    at org.apache.poi.POIDocument.getPropertySet(POIDocument.java:236)
    at org.apache.poi.POIDocument.getPropertySet(POIDocument.java:197)
    at org.apache.poi.POIDocument.readPropertySet(POIDocument.java:175)
    at org.apache.poi.POIDocument.readProperties(POIDocument.java:158)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.updateEncryptionInfo(HSSFWorkbook.java:2295)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.getBytes(HSSFWorkbook.java:1506)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.write(HSSFWorkbook.java:1428)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.write(HSSFWorkbook.java:1414)
    at excel_01.Read_03.readExcel_03(Read_03.java:91)
    at excel_01.Read_03.main(Read_03.java:108)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections4.bidimap.TreeBidiMap
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 18 more

有什么建议吗?谢谢你们!

    package excel_01;

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

public class Read_03 {

    private static final String FILE_NAME = "/EXCEL_PER_ECLIPSE/boh.xls";

    public void readExcel_03() {

        try {

            FileInputStream input = new FileInputStream(FILE_NAME);
//          Workbook workBook = WorkbookFactory.create(input);
            Workbook workBook = new HSSFWorkbook(input);
            System.out.println("XLS FILE" + " -----> " + "Start reading...");
            Sheet sheet = workBook.getSheetAt(0);
            System.out.println(sheet.getPhysicalNumberOfRows());

            Row row = null;

            for ( int j = 0; j < sheet.getPhysicalNumberOfRows(); j++) {

                row = sheet.getRow(j);
                System.out.println(row.getRowNum());

                for (int i = 0; i < row.getLastCellNum(); i++) {

                    if (row.getCell(i) != null) {

                        Cell cell = row.getCell(i/*, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK*/);

                        System.out.print(" CELL: " + i + " [ " + cell.toString() + " ] ");
                    } 

                    else {

                        System.out.print(" CELL: " + i + " [ empty cell ] ");
                    }
                }
            }

            int physicalRow = sheet.getPhysicalNumberOfRows(); 
            Row lastPhysicalRow = sheet.getRow(physicalRow);
            int lastRow = sheet.getLastRowNum();
            //Row rowprova1 = sheet.getRow(prova1);

            if (physicalRow > lastRow && lastPhysicalRow == null /*here I check if the last row is null*/) {

                System.out.println();
                System.out.println(physicalRow);

                Object[][] bookData = {

                        {"Bau"},

                };

                int rowCount = sheet.getPhysicalNumberOfRows();

                for (Object[] newElement : bookData) {

                    Row newRow = sheet.createRow(++rowCount);
                    int columnCount = 0;                     
                    Cell newCell = newRow.createCell(columnCount);
                    newCell.setCellValue(rowCount);

                    for (Object field : newElement) {

                        newCell = newRow.createCell(++columnCount);

                        if (field instanceof String) {
                            newCell.setCellValue((String) field);                        
                        }
                    }

                }

            }

            input.close();

            FileOutputStream outputStream = new FileOutputStream(FILE_NAME);
            workBook.write(outputStream);
            workBook.close();
            outputStream.close();
            System.out.println("End reading!");
        }

        catch (Exception e) {

            System.out.println("Error");
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {

        Read_03 read_03 = new Read_03();
        read_03.readExcel_03();

    }
}

共有1个答案

楚丰羽
2023-03-14

Apache Commons集合似乎不在您的类路径上。你应该把它加进去。

您可能希望考虑使用诸如Gradle或Maven这样的依赖关系管理框架来降低这种意外的可能性。

 类似资料:
  • 我需要读取大约500000条记录的Excel(xlsx)并每天添加大约2000条记录,我设法使用NPOI来完成,但内存消耗非常大(约8gb)。 我只能读取excel,使用ExcelDataReader消耗很少的内存,但是不可能添加更多的记录。 有什么工具可以写入这个不消耗大量内存的文件吗?

  • 我试图根据元素的id从超文本标记语言文件中读取文本,并将其显示在JTextPane中。但是,当我读取文本并显示它时,它不会进入新行。以下是正在读取的超文本语言标记的示例: 我从HTML页面读取的方法是: 我用来更新JTextPane中文本的方法是: 用户应该在文本框中输入命令,然后单击提交按钮,并根据输入的命令获取反馈。问题是,输入的每个命令都出现在同一行,而不是新行。 如果appendText为

  • 本文向大家介绍nodejs读取并去重excel文件,包括了nodejs读取并去重excel文件的使用技巧和注意事项,需要的朋友参考一下 如何使用,直接上代码 解析一下 node-xlsx导出的数据结构如下: 以上就是小编整理的全部内容,很多时候我们用到对EXCEL的文件操作,大家在测试的时候如还有任何疑问可以在下面的留言区讨论,感谢大家对呐喊教程的支持。

  • 在数据库表中,如下所示; 我想做的如下; 如何在不刷新的情况下更新新列(gsm列)(php artisan migrate:refresh)

  • 问题内容: 我目前正在Linux系统上以python编写程序。目的是在发现特定字符串后读取日志文件并执行bash命令。日志文件正在被另一个程序不断写入。 我的问题 :如果使用该方法打开文件,我的Python文件对象将随着其他程序写入实际文件而更新,还是我必须在一定时间间隔内重新打开文件? 更新 :感谢到目前为止的答案。我也许应该提到,该文件是由Java EE应用程序写入的,所以我无法控制何时将数据

  • 问题内容: 我正在尝试使用Apache POI更新现有的Excel文件。每次我运行代码时,都会收到如下所示的错误。我也试过FileInputStreamNewFile的东西。 请在下面找到代码。感谢你的帮助。 问题答案: 如果您更换 用 会工作的!