0

查找最后一列单元格值。如果单元格值为“无效”或“不适用”,则删除整行。

到目前为止我写的代码如下:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.usermodel.Workbook;

public class Column
{
    public static void main(String[] args) throws InvalidFormatException, FileNotFoundException, IOException
    {
        try
        {
            Workbook wb = WorkbookFactory.create(new FileInputStream("C:/Users/Excel1.xlsx"));
            Sheet sheet = wb.getSheet("Retail-All");

            Workbook wb2 = new HSSFWorkbook();
            wb2 = wb;

            Row row;
            row = sheet.getRow(0);
            int getLastCell=row.getLastCellNum()-1;
            int lastIndex = sheet.getLastRowNum();

            for (int i=0; i<=lastIndex; i++)
            {
                row=sheet.getRow(i);
                if(row.getCell(getLastCell)!=null && (row.getCell(getLastCell).toString().equalsIgnoreCase("Not valid) || row.getCell(getLastCell).toString().equalsIgnoreCase("Not Applicable")))
                {
                    sheet.removeRow(row);
                    //sheet.shiftRows(i, lastIndex, -1);
                }
            }
            FileOutputStream fileOut = new FileOutputStream("C:/Users/shiftRows.xlsx");
            wb2.write(fileOut);
            fileOut.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

使用上面的代码,使用 row.setZeroHeight(true); 方法我可以隐藏行。

使用上面的代码,使用 sheet.removeRow(row); 方法我可以清空该特定行中的所有单元格。

我在网上找到了一些代码,但没有一个是永久删除行。我的要求是永久删除行。如何编码以满足我的要求?

4

4 回答 4

0

而不是sheet.removeRow(row);您可以使用您shiftRows(int startRow, int endRow, int n)似乎已经尝试过的指令,该指令在 startRow 和 endRow n 行之间移动行。

在你的情况下,它将是

// ... code before    ...
for (int i=0; i<=lastIndex; i++)
        {
          row=sheet.getRow(i);
          if(row.getCell(getLastCell)!=null && (row.getCell(getLastCell).toString().equalsIgnoreCase("Not valid") || row.getCell(getLastCell).toString().equalsIgnoreCase("Not Applicable")))
              {
               // This should shift up by 1 row all the rows below
               sheet.shiftRows(i+1, lastIndex, -1);
               i--; // Since you move row at i+1 to i you have to recompute the i-th row
            }
        }
// ... code after ...

查看org.apache.poi.hssf.usermodel.HSSFSheet 文档以获取更多信息

于 2013-08-01T14:27:55.533 回答
0

也许在这种情况下使用 VBA 宏会更有帮助?VBA 宏可以嵌入到您的电子表格中,因此运行它们会容易得多。

这是开始使用 VBA 的好地方:

http://msdn.microsoft.com/en-us/library/office/ee814737(v=office.14).aspx

于 2013-08-01T13:49:26.373 回答
0

试试这个...

 SVTableModel model = new SVTableModel(sheet);
 int lastIndex = model.getRowCount();
 for (int i=1; i<=lastIndex; i++)
   {
  row=sheet.getRow(i);
  if((row.getCell(getLastCell)!=null) && (row.getCell(getLastCell).toString().equalsIgnoreCase("Not valid") ||  row.getCell(getLastCell).toString().equalsIgnoreCase("Not Applicable")))
  {
      row.setZeroHeight(true);
      sheet.removeRow(row);
  }
于 2013-08-01T14:01:15.003 回答
0

请尝试以下代码。我的最后一个单元格值是不匹配或匹配。按照你的excel设置。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class DeleteAllRecord {

public static void main(String[] args) {

    try{

        File src= new File("testdata\\OSBC.xlsx");
        FileInputStream fis= new FileInputStream(src);
        XSSFWorkbook workbook= new XSSFWorkbook(fis);
        XSSFSheet data= workbook.getSheet("TestData");  
        int length=data.getLastRowNum();
        XSSFSheet data1;
        Row row1;
        for(int i=1;i<=length;i++){

            String testCaseNo=data.getRow(i).getCell(4).toString();
            System.out.println("The Testcase no "+testCaseNo);
            data1= workbook.getSheet(testCaseNo);
            row1 = data1.getRow(2);
            int getLastCell=row1.getLastCellNum()-1;
            System.out.println("The last cell is "+getLastCell);
            int lastIndex = data1.getLastRowNum();
            System.out.println("The last row is "+lastIndex);
            String str1= row1.getCell(getLastCell).toString();
            System.out.println("The valu1 is "+ str1);
            for (int j=0; j<lastIndex-1; j++)
            {

                String str=data1.getRow(j+2).getCell(getLastCell).toString();
                row1=data1.getRow(j+2);
                System.out.println("print " + (j+2) +str);

                if(row1.getCell(getLastCell)!=null &&
(row1.getCell(getLastCell).toString().equalsIgnoreCase("MATCHED")||
row1.getCell(getLastCell).toString().equalsIgnoreCase("MISMATCHED")|| 
row1.getCell(getLastCell).toString().equalsIgnoreCase(""))){

data1.removeRow(row1);
                    System.out.println("print " + (j+2)+ " " +str);

                }
                else{
                    System.out.println("Null");
                }
            }
            FileOutputStream fileOut = new FileOutputStream("testdata\\delete.xlsx");
            workbook.write(fileOut);
            fileOut.close();
            System.out.println("File deleted");
        }
    }
    catch(Exception e){

        System.out.println("No Data Exists to delete");
      }
   }
}
于 2019-09-24T11:22:17.177 回答