Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:从Excel中删除行_Java_Excel_Apache Poi - Fatal编程技术网

Java:从Excel中删除行

Java:从Excel中删除行,java,excel,apache-poi,Java,Excel,Apache Poi,我修改了一小段代码,但无法运行。 我始终检索到一个异常: 保存失败:保存包时出错:重复条目:docProps/core.xml 此行中会引发错误: wb.write(out); 我认为出现了这个异常,因为我不允许在同一工作簿上读写,但是如果没有现有的Excel文件,我如何初始化新工作簿 代码:(来自此处(感谢发起人):) 及 导入java.io.File; 导入java.io.FileOutputStream; 导入java.io.OutputStream; 导入org.apache.poi.

我修改了一小段代码,但无法运行。 我始终检索到一个异常:

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

此行中会引发错误:

wb.write(out);
我认为出现了这个异常,因为我不允许在同一工作簿上读写,但是如果没有现有的Excel文件,我如何初始化新工作簿

代码:(来自此处(感谢发起人):)

导入java.io.File;
导入java.io.FileOutputStream;
导入java.io.OutputStream;
导入org.apache.poi.ss.usermodel.Row;
导入org.apache.poi.ss.usermodel.Sheet;
导入org.apache.poi.ss.usermodel.工作簿;
导入org.apache.poi.ss.usermodel.WorkbookFactory;
公共类ExcelLineRemover{
公共无效lineRemover(字符串fileInName、字符串fileOutName){
试一试{
File File=新文件(fileInName);
工作簿wb=WorkbookFactory.create(文件);
Sheet Sheet=wb.getSheetAt(0);
拆卸工具(第3页);
File fileOut=新文件(fileOutName);
OutputStream out=新文件OutputStream(fileOut);
wb.写(出);
out.flush();
out.close();
}捕获(例外e){
e、 printStackTrace();
}
}
公共空隙清除器OW(图纸、int行索引){
int lastRowNum=sheet.getLastRowNum();
如果(rowIndex>=0&&rowIndex
[编辑2016-06-21]:

我补充说

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

org.apache.poi
poi ooxml
3.14

对我的POM来说,现在它产生了

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

在转换到3.9版后,我又恢复了旧的错误,即奇怪的行为

[编辑2016-06-22] 将我的代码移动到一个单独的项目中。 我改为poi版本3.14

POM:


org.apache.poi
poi ooxml
3.14
这是我包含的唯一依赖项。 但我仍然得到一个类似的错误:

org.apache.poi.openxml4j.exceptions.invalidoOperationException:一部分 名为“/docProps/core.xml”的包已存在:包不应 包含等效部件名称,且包实施者不得 创建或识别具有等效零件名称的包装。[M1.12]位于

org.apache.poi.openxml4j.opc.OPCPackage.addPackagePart(OPCPackage.java:905) 在 org.apache.poi.openxml4j.opc.ZipPackage.saveImpl(ZipPackage.java:444) 位于org.apache.poi.openxml4j.opc.OPCPackage.save(OPCPackage.java:1467) 在org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:217)上 lineRemover.lineRemover(ExcelLineRemover.java:28)位于 test.TestExcel.main(TestExcel.java:14)


我在不同的场景中遇到了相同的问题。我删除了文件(输入文件),并恢复了旧版本(文件快照-在运行代码之前)。这对我来说很有效

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

发现了问题

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

经过大量实验,我发现,如果我在MS excel中打开excel文档,只需再次保存而不进行编辑,我的代码就可以工作


因此,我认为问题在于如何生成excel文档(由工具自动生成)

您的代码对我来说运行良好(使用xssf poi包)。您可以编辑您的帖子并向我们展示如何调用这些方法吗?您是否为
lineRemover
提供了正确的参数?请同时指出产生错误的行。我扩展了代码
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);
                }
            }
        }

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