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

Java:从Excel中删除行

郑胡媚
2023-03-14

我修改了一小段代码,但无法运行。我总是发现一个例外:

保存失败:保存包时出错:重复条目:docProps/core.xml

错误抛出在这行:

wb.write(out);

我认为出现了这个例外,因为我不允许在同一个工作簿上读写,但是如果没有现有的Excel文件,我如何初始化新工作簿?

代码:(来自这里(感谢发起者):如何使用ApachePOI删除行)

public class TestExcel{

public static void main(String[] args) {
        ExcelLineRemover elr = new ExcelLineRemover();
        elr.lineRemover("testFiles/Test_orig.xlsx", "testFiles/Test_mod.xlsx");
    }

}

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class ExcelLineRemover {

        public void lineRemover(String fileInName, String fileOutName) {

            try {

                File file = new File(fileInName);

                Workbook wb = WorkbookFactory.create(file);
                Sheet sheet = wb.getSheetAt(0);
                removeRow(sheet, 3);

                File fileOut = new File(fileOutName);
                OutputStream out = new FileOutputStream(fileOut);
                wb.write(out);
                out.flush();
                out.close();

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

        }

        public void removeRow(Sheet sheet, int rowIndex) {
            int lastRowNum = sheet.getLastRowNum();
            if (rowIndex >= 0 && rowIndex < lastRowNum) {
                sheet.shiftRows(rowIndex + 1, lastRowNum, -1);
            }
            if (rowIndex == lastRowNum) {
                Row removingRow = sheet.getRow(rowIndex);
                if (removingRow != null) {
                    sheet.removeRow(removingRow);
                }
            }
        }

    }

[编辑2016-06-21]:

我加了

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

给我的POM,现在它产生了

线程“main”java.lang.NoSuchMethodError中的“异常”:org.apache.poi.util.POILogger.log(I[Ljava/lang/Object;)V“

更改到版本3.9后,我得到了旧的错误,奇怪的行为。

[EDIT 2016-06-22]将我的代码转移到一个单独的项目中。我改成了poi版本3.14

POM:

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

这是我包含的唯一依赖项。但我还是犯了一个类似的错误:

org.apache.poi.openxml4j.exceptions.无效操作异常:名称为/docProps/core.xml的部件已经存在:包不得包含等效的部件名称,包实现者不得创建或识别具有等效部件名称的包

组织。阿帕奇。波伊。openxml4j。opc。OPCPackage。在org上添加PackagePart(OPCPackage.java:905)。阿帕奇。波伊。openxml4j。opc。拉链包装。saveImpl(ZipPackage.java:444)位于org。阿帕奇。波伊。openxml4j。opc。OPCPackage。在org上保存(OPCPackage.java:1467)。阿帕奇。波伊。这是一份完整的文件。在ExcelLineRemover上编写(POIXMLDocument.java:217)。lineRemover(ExcelLineRemover.java:28)在测试中。TestExcel。main(TestExcel.java:14)

共有2个答案

傅峰
2023-03-14

我在不同的场景中遇到了同样的问题。我已经删除了文件(输入文件),并恢复了旧版本(文件快照——在运行这段代码之前)。它对我有用。

注意:我使用了*. xlsx格式。

周阳波
2023-03-14

问题找到了。

这不是代码的问题,而是excel文档本身的问题。

经过大量的实验,我发现,如果我在MS Excel中打开excel文档,并在不编辑它的情况下再次保存它,我的代码就可以工作了。

所以我认为问题在于excel文档的生成。(由工具自动生成)

 类似资料:
  • 我无法解释,因为所有其他select和insert语句都工作得很好。

  • 我使用Apache POI libary导入、导出Excel表格到应用程序(tableView)。我有一些问题从应用程序中删除行在Excel。行的移除工作正常,但是如果我移除一行并重新启动应用程序,它会将最后一个条目导入两次。如果我删除了4或5个条目,在重新启动时,最后一个条目将显示4或5次。我认为最后一行的数字将不会保存或更新。删除excel文件中的行工作良好,只有在我的tableview中,在

  • 我一直试图创建一个宏来格式化从特定外部源复制的表,问题是,一些单元格似乎从右向左填充,剩余的空间向左填充空格:

  • 假设我有一张工作表--第一张--有5000多行(例如,每行“a”-“H”)。 在另一个工作表--第2号--中,我有一个“to-remove-list”--一个包含400个值的单列“a”,每个值包含字母数字字符串(例如:xxx1234)。 如果第'e'列包含“to-remove-list”(第2页的第'a'列)中的任何值,则必须删除第1页中的每一行。 删除整行,我的意思是删除该行并向上移动(不离开空

  • 问题内容: 我有一个具有静态对象ArrayList的ClassA 现在,我要像这样从此列表中删除一个对象 这是用Meteorit类编写的。但是,当我想使用ArrayList中的对象时,它将引发异常。 我使用Iterator从ArrayList中删除对象,但是现在我不知道如何在这种情况下使用它。 问题答案: 这是因为某个线程实际上正在for每个循环中查看此列表,也许您正在尝试在for-each主体中

  • 问题内容: 我有一个xml,如下所示: 现在,我想删除标记,但在此处保留内容“ ABCD”。或者有没有一种方法可以使用java从整个XML文件中删除。请帮忙。谢谢。 问题答案: 使用DOM4J或SAX解析器解析文档 从标签中获取价值 从值中删除所有html标签 JSoup三通 字符串替换 将新值设置为XML字体标签