O Apache POI vendo colunas na folha de cálculo vazia?
-
23-12-2019 - |
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());
}
}
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)....