Pergunta

Eu tenho uma planilha vazia, mas quando estou acessando-os com o Apache POI (versão 3.10), ele diz que tem 1024 colunas e 20 física colunas.
Eu realmente eliminadas todas as células, apenas alguns formatação continua, mas não o conteúdo.
E se eu excluir algumas colunas com o Broffice Calc (versão 4.1.3.2), o número de colunas apenas aumenta!O que está acontecendo?
Existe uma maneira confiável para obter o número real de colunas (ou células em uma linha)?

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());
    }
}
Foi útil?

Solução

Depois de alguma investigação mais, eu acho que eu descobri o que está acontecendo.

Primeiro, algumas terminologias de PI:existem algumas células que, na verdade, não existe na planilha - aqueles são chamados em falta, ou não definido/não definido.Em seguida, há algumas células que são definidos, mas não têm valor - aqueles são chamados em branco células.Ambos os tipos de células aparecem vazio em um programa de folha de cálculo e não podem ser distinguidos visualmente.

Minha planilha tem algumas células em branco que o LibreOffice adicionado no final da linha (possivelmente um erro).Quando eu excluir colunas, o LibreOffice parece turno subsequente células (incluindo aqueles em branco) para a esquerda, e adiciona mais células em branco no final (até 1024).

E agora a parte-chave:nem getLastCellNum() nem getPhysicalNumberOfCells() ignorar células em branco. getLastCellNum() dá a última definido célula, e getPhysicalNumberOfCells() dá o número de definido as células, inclusive as células em branco.Não parece ser qualquer método disponível que ignora células em branco.O javadoc para getPhysicalNumberOfCells() é um pouco enganador - "se apenas as colunas 0,4,5 ter valores, em seguida, haveria 3", mas é, na verdade, a contagem de células em branco, o que realmente não tem valores.

Assim, a única solução que eu encontrei é percorrer as pilhas e verifique se elas estão em branco.

Nota: getLastRowNum() e getFirstCellNum() são baseados em 0, mas getLastCellNum() é baseado em 1, wtf?

Outras dicas

Provavelmente você tem algum tipo de formatação aplicadas linha.Eu tenho um vazio de arquivo xlsx criados com o excel e método getRow produz nulo para linhas vazias.

@aditsu como por https://poi.apache.org/apidocs/dev/org/apache/poi/ss/usermodel/Row.html, getLastCellNum() obtém o índice da última célula contidas nesta linha, MAIS UM.

+1 para o libreOffice strugle!é um bug, e na minha opinião é muito aleatório.Eu estou ficando nulo aleatoriamente, e muitas vezes ajuda se eu excluir linhas em branco (abaixo) e colunas VAZIAS (no lado direito)....

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top