私は現在、POI 3.9ライブラリを使用してExcelファイルを操作しています。 Excelファイルの行数を返すgetLastRowNum()
関数を知っています。
唯一の問題は、getLastRowNum()
が0から始まるカウントで数値を返すことです。
したがって、Excelファイルが最初の3行を使用する場合、getLastRowNum()
は2を返します。Excelファイルに1行しかない場合、getLastRowNum()
は0を返します。
この問題は、Excelファイルが完全に空の場合に発生します。 getLastRowNum()
は引き続き0を返すため、Excelファイルに1行のデータがあるかどうか、または空であるかどうかを判断できません。
それでは、Excelファイルが空かどうかをどのように検出できますか?
Sheet.getPhysicalNumberOfRows()
は空の行をカウントせず、Sheet.getLastRowNum()
は行が1つでも行がない場合でも0を返すため、2つの方法を組み合わせて行の総数を正確に計算します。
int rowTotal = sheet.getLastRowNum();
if ((rowTotal > 0) || (sheet.getPhysicalNumberOfRows() > 0)) {
rowTotal++;
}
注:これは、空の行が1つあるスプレッドシートを何もないものとして扱いますが、ほとんどの目的ではおそらくこれで問題ありません。
確認したら
if
(getLastRowNum()<1){
res="Sheet Cannot be empty";
return
}
これにより、ヘッダー以外のデータを含む行が少なくとも1つあることが確認されます。以下は正常に動作する私のプログラムです。 Excelファイルには3つの列があります。 ID、NAME、LASTNAME
XSSFWorkbook workbook = new XSSFWorkbook(inputstream);
XSSFSheet sheet = workbook.getSheetAt(0);
Row header = sheet.getRow(0);
int n = header.getLastCellNum();
String header1 = header.getCell(0).getStringCellValue();
String header2 = header.getCell(1).getStringCellValue();
String header3 = header.getCell(2).getStringCellValue();
if (header1.equals("ID") && header2.equals("NAME")
&& header3.equals("LASTNAME")) {
if(sheet.getLastRowNum()<1){
System.out.println("Sheet empty");
return;
}
iterate over sheet to get cell values
}else{
SOP("invalid format");
return;
}
できることは2つあります
つかいます
int noOfColumns = sh.getRow(0).getPhysicalNumberOfCells();
または
int noOfColumns = sh.getRow(0).getLastCellNum();
それらの間には微妙な違いがあります
オプション1は、実際にコンテンツで満たされる列の数を示します(10列の2列目が満たされていなければ、9列になります)
オプション2は、最後の列のインデックスを提供します。したがって、'getLastCellNum()'
完了