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

fma*_*ste 29 java apache excel row apache-poi

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

没有HSSFSheet.removeRow( int rowNum )方法.只有removeRow( HSSFRow row ).这个问题是无法删除空行.例如:

sheet.removeRow( sheet.getRow(rowNum) );
Run Code Online (Sandbox Code Playgroud)

在空行上给出NullPointerException,因为getRow()返回null.另外,正如我在论坛上看到的那样,removeRow()只删除单元格内容,但行仍然是空行.

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

小智 30

 /**
 * Remove a row by its index
 * @param sheet a Excel sheet
 * @param rowIndex a 0 based index of removing row
 */
public static void removeRow(HSSFSheet sheet, int rowIndex) {
    int lastRowNum=sheet.getLastRowNum();
    if(rowIndex>=0&&rowIndex<lastRowNum){
        sheet.shiftRows(rowIndex+1,lastRowNum, -1);
    }
    if(rowIndex==lastRowNum){
        HSSFRow removingRow=sheet.getRow(rowIndex);
        if(removingRow!=null){
            sheet.removeRow(removingRow);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 当前在POI中存在一个错误,当在包含公共单元格的范围内多次使用此功能时,将抛出&gt; org.apache.xmlbeans.impl.values.XmlValueDisconnectedException &lt;-https://bz.apache.org/bugzilla/show_bug .cgi?id = 59733 (2认同)

tra*_*max 9

我知道,这是一个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);
        }
    }
Run Code Online (Sandbox Code Playgroud)


del*_*ego 0

我试图深入大脑深处寻找一两年前与 POI 相关的经历,但我的第一个问题是:为什么在解析之前需要删除行?为什么不直接捕获调用的 null 结果sheet.getRow(rowNum)并继续前进呢?