Java 使用Apache POI HSSF从Excel工作表中删除行

Java 使用Apache POI HSSF从Excel工作表中删除行,java,apache,excel,row,apache-poi,Java,Apache,Excel,Row,Apache Poi,我正在使用ApachePOI HSSF库将信息导入到我的应用程序中。问题是这些文件有一些额外的/空的行,需要在解析之前先删除这些行 没有HSSFSheet.removeow(int rowNum)方法。仅拆卸工具(HSSFRow行)。这个问题是无法删除空行。例如: sheet.removeRow( sheet.getRow(rowNum) ); 在空行上提供NullPointerException,因为getRow()返回null。 另外,正如我在论坛上读到的,removeRow()只删除单元

我正在使用ApachePOI HSSF库将信息导入到我的应用程序中。问题是这些文件有一些额外的/空的行,需要在解析之前先删除这些行

没有
HSSFSheet.removeow(int rowNum)
方法。仅
拆卸工具(HSSFRow行)
。这个问题是无法删除空行。例如:

sheet.removeRow( sheet.getRow(rowNum) );
在空行上提供NullPointerException,因为
getRow()
返回null。 另外,正如我在论坛上读到的,
removeRow()
只删除单元格内容,但该行仍然作为空行存在


有没有一种方法可以删除行(空行或不空行),而不创建一个没有我要删除的行的全新工作表?

我正试图回到我的大脑深处,了解一两年前与POI相关的经验,但我的第一个问题是:为什么在解析之前需要删除行?为什么不从
工作表中捕获空结果。getRow(rowNum)
调用并继续?

HSSFRow
有一个名为
setRowNum(introwindex)
的方法


当您必须“删除”一行时,您可以将该索引放入
列表中。然后,当到达下一行非空时,从该列表中获取一个索引,并将其设置为调用
setRowNum()
,然后从该列表中删除该索引。(或者你可以使用队列)

沿着

int newrownum=0;
for (int i=0; i<=sheet.getLastRowNum(); i++) {
  HSSFRow row=sheet.getRow(i);
  if (row) row.setRowNum(newrownum++);
}
int newrownum=0;
对于(int i=0;i
/**
*按其索引删除行
*@param-sheet一张Excel表格
*@param rowIndex删除行的基于0的索引
*/
公共静态空隙清除器OW(HSSF表,int rowIndex){
int lastRowNum=sheet.getLastRowNum();

如果(rowIndex>=0&&rowIndex我知道,这是一个3年前的问题,但我最近不得不解决同样的问题,我必须用C#来解决。下面是我在NPOI、.Net 4.0中使用的函数

    public static void DeleteRow(this ISheet sheet, IRow row)
    {
        sheet.RemoveRow(row);   // this only deletes all the cell values

        int rowIndex = row.RowNum;

        int lastRowNum = sheet.LastRowNum;

        if (rowIndex >= 0 && rowIndex < lastRowNum)
        {
            sheet.ShiftRows(rowIndex + 1, lastRowNum, -1);
        }
    }
public static void DeleteRow(此ISHET表,IRow行)
{
sheet.RemoveRow(行);//此操作仅删除所有单元格值
int rowIndex=row.RowNum;
int lastRowNum=sheet.lastRowNum;
如果(rowIndex>=0&&rowIndex
我的特殊情况(它对我有效):

//多次删除不带单位的所有行

对于(int j=0;j,此答案是AndreAY答案的扩展,为您提供了删除行的完整功能

public boolean deleteRow(String sheetName, String excelPath, int rowNo) throws IOException {

    XSSFWorkbook workbook = null;
    XSSFSheet sheet = null;

    try {
        FileInputStream file = new FileInputStream(new File(excelPath));
        workbook = new XSSFWorkbook(file);
        sheet = workbook.getSheet(sheetName);
        if (sheet == null) {
            return false;
        }
        int lastRowNum = sheet.getLastRowNum();
        if (rowNo >= 0 && rowNo < lastRowNum) {
            sheet.shiftRows(rowNo + 1, lastRowNum, -1);
        }
        if (rowNo == lastRowNum) {
            XSSFRow removingRow=sheet.getRow(rowNo);
            if(removingRow != null) {
                sheet.removeRow(removingRow);
            }
        }
        file.close();
        FileOutputStream outFile = new FileOutputStream(new File(excelPath));
        workbook.write(outFile);
        outFile.close();


    } catch(Exception e) {
        throw e;
    } finally {
        if(workbook != null)
            workbook.close();
    }
    return false;
}
public boolean deleteRow(String sheetName、String excelPath、int rowNo)抛出IOException{
XSSF工作簿=空;
XSSFSheet=null;
试一试{
FileInputStream文件=新FileInputStream(新文件(excelPath));
工作簿=新XSSF工作簿(文件);
sheet=工作簿.getSheet(sheetName);
如果(工作表==null){
返回false;
}
int lastRowNum=sheet.getLastRowNum();
如果(rowNo>=0&&rowNo
因为我已经为格式为简单表(第一行的列名和下面的数据)的Excel文件制作了一个解析器,并且如果有空行,我需要警告用户。此外,我现在要导入的文件来自另一个应用程序,并且有很多额外的行(空或不空)只是为了让文件看起来更好!好吧——不过,我想说的是,只要对现有解析器进行子类化,让子类忽略空行,而不是对空行进行处理,您可能会得到很好的服务;这样,来自其他应用程序的文件仍然可以看起来很好,并且您不必死在这些文件上。:)是的。我也这么想。但是文件有这样的内容:第一列(id)只有一行,以及下一行中的其他列。只是因为它看起来更好。我需要将其设置为一行并删除一行。我想我会创建一个包含工作表和行索引列表的类,并在删除行时删除索引。这太多了,但我需要删除行,我不明白为什么不能使用此库删除行!此解决方案在多行删除的情况下不起作用。@gospodin-在循环中运行内部代码,每次删除一行时不要忘记将rowIndex计数器减少1。当前POI中存在一个错误,当多次使用此函数时,将抛出>org.apache.xmlbeans.impl.values.XmlValueDisconnectedException<包含公共单元格的es-请在您的if语句中添加一些空格,没有空格很难阅读。无论如何,感谢您的回答。在某些情况下,我得到:java.lang.RuntimeException:CountryRecord not found。此处报告的注释已在Excel中重新保存。但是该记录不会被删除。是否有可靠的非基于文件的解决方案。您保存文件的方法如何适应通过url访问文件的情况,例如
InputStream file=newURL(“http://docker:[portNumber]/fileName.xlsx”).openStream();
    //Various times to delete all the rows without units
    for (int j=0;j<7;j++) {
      //Follow all the rows to delete lines without units (and look for the TOTAL row)
      for (int i=1;i<sheet.getLastRowNum();i++) {
        //Starting on the 2nd row, ignoring first one
        row = sheet.getRow(i);
        cell = row.getCell(garMACode);
        if (cell != null) 
        {
          //Ignore empty rows (they have a "." on first column)
          if (cell.getStringCellValue().compareTo(".") != 0) {  
            if (cell.getStringCellValue().compareTo("TOTAL") == 0) {
              cell = row.getCell(garMAUnits+1);
              cell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
              cell.setCellFormula("SUM(BB1" + ":BB" + (i - 1) + ")");
            } else {
              cell = row.getCell(garMAUnits);
              if (cell != null) {
                int valor = (int)(cell.getNumericCellValue());
                if (valor == 0 ) {
                  //sheet.removeRow(row);
                  removeRow(sheet,i);
                }
              }
            }
          }
        }
      }
    }
public boolean deleteRow(String sheetName, String excelPath, int rowNo) throws IOException {

    XSSFWorkbook workbook = null;
    XSSFSheet sheet = null;

    try {
        FileInputStream file = new FileInputStream(new File(excelPath));
        workbook = new XSSFWorkbook(file);
        sheet = workbook.getSheet(sheetName);
        if (sheet == null) {
            return false;
        }
        int lastRowNum = sheet.getLastRowNum();
        if (rowNo >= 0 && rowNo < lastRowNum) {
            sheet.shiftRows(rowNo + 1, lastRowNum, -1);
        }
        if (rowNo == lastRowNum) {
            XSSFRow removingRow=sheet.getRow(rowNo);
            if(removingRow != null) {
                sheet.removeRow(removingRow);
            }
        }
        file.close();
        FileOutputStream outFile = new FileOutputStream(new File(excelPath));
        workbook.write(outFile);
        outFile.close();


    } catch(Exception e) {
        throw e;
    } finally {
        if(workbook != null)
            workbook.close();
    }
    return false;
}