문제

빈 스프레드시트가 있는데 Apache POI(버전 3.10)를 사용하여 액세스하면 1024개의 열과 20개의 물리적 열이 있다고 표시됩니다.
정말 모든 셀을 삭제했는데 일부 서식만 남고 내용은 없습니다.
그리고 LibreOffice Calc(버전 4.1.3.2)를 사용하여 일부 열을 삭제하면 열 수만 증가하다!무슨 일이야?
실제 열(또는 행의 셀) 수를 얻는 안정적인 방법이 있습니까?

import java.net.URL;
import org.apache.poi.ss.usermodel.*;

public class Test {
    public static void main(final String... args) throws Exception {
        final URL url = new URL("http://aditsu.net/empty.xlsx");
        final Workbook w = WorkbookFactory.create(url.openStream());
        final Row r = w.getSheetAt(0).getRow(0);
        System.out.println(r.getLastCellNum());
        System.out.println(r.getPhysicalNumberOfCells());
    }
}
도움이 되었습니까?

해결책

좀 더 조사한 결과 무슨 일이 일어나고 있는지 알아낸 것 같습니다.

먼저 POI의 일부 용어는 다음과 같습니다.스프레드시트에 실제로 전혀 존재하지 않는 일부 셀이 있습니다. 없어진, 또는 한정되지 않은/정의되지 않았습니다.그런 다음 정의되었지만 값이 없는 일부 셀이 있습니다. 이를 호출합니다. 공백 세포.두 유형의 셀 모두 스프레드시트 프로그램에서 비어 있는 것으로 나타나며 시각적으로 구별할 수 없습니다.

내 스프레드시트에는 LibreOffice가 행 끝에 추가한 빈 셀이 있습니다(버그일 수 있음).열을 삭제하면 LibreOffice는 후속 셀(빈 셀 포함)을 왼쪽으로 이동하고 끝에 빈 셀을 더 추가합니다(최대 1024개).

이제 핵심 부분은 다음과 같습니다.어느 것도 아니다 getLastCellNum() ...도 아니다 getPhysicalNumberOfCells() 빈 셀을 무시합니다. getLastCellNum() 마지막을 준다 한정된 세포, 그리고 getPhysicalNumberOfCells() 수를 준다 한정된 둘 다 빈 셀을 포함하는 셀입니다.빈 셀을 건너뛰는 방법은 없는 것 같습니다.에 대한 javadoc getPhysicalNumberOfCells() 다소 오해의 소지가 있습니다. "열 0,4,5에만 값이 있으면 3이 됩니다." 그러나 실제로는 값이 없는 빈 셀도 계산합니다.

그래서 제가 찾은 유일한 해결책은 셀을 반복하여 비어 있는지 확인하는 것입니다.

참고 사항: getLastRowNum() 그리고 getFirstCellNum() 0 기반이지만 getLastCellNum() 1 기반인가요?

다른 팁

일종의 형식이 적용될 가능성이 높습니다.Excel로 작성된 빈 XLSX 파일이 있으며 메소드 getRow는 빈 행에 대해 NULL을 생성합니다.

https : //poi.apache.org/apidocs/dev/org/apache/poi/ss/usermodel/row.html , getLastCellNum ()이 행에 포함 된 마지막 셀의 인덱스를 가져옵니다.

+1 libreoffice strugle!그것은 버그이며, 제 의견은 매우 무작위입니다.나는 무작위로 null을 얻고 빈 행 (벨로우즈)과 빈 열을 삭제하면 종종 도움이됩니다 (오른쪽). ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top