Apache POI Excel - como configurar colunas a serem expandidas?

98

Estou usando Apache POI APIpara gerar excel spreadsheetalguns dados de saída.

O problema que estou enfrentando é que, quando a planilha é criada e aberta, as colunas não são expandidas de forma que algum texto longo, como texto formatado com data, não apareça à primeira vista.

Eu poderia apenas clicar duas vezes na borda da coluna no Excel para expandir ou arrastar a borda para ajustar a largura da coluna, mas pode haver mais de 20 colunas e não há como eu querer fazer isso manualmente toda vez que abrir a planilha :(

Eu descobri (embora possa ser o método errado) groupRow()esetColumnGroupCollapsed() posso fazer o truque, mas sem sorte. Talvez eu esteja usando da maneira errada.

Snippet de código de amostra

        Workbook wb = new HSSFWorkbook();
        CreationHelper createHelper = wb.getCreationHelper();
        //create sheet
        Sheet sheet = wb.createSheet("masatoSheet");

        //not really working yet.... :(
        //set group for expand/collapse
        //sheet.groupRow(0, 10); //just random fromRow toRow argument values...
        //sheet.setColumnGroupCollapsed(0, true);

        //create row
        Row row = sheet.createRow((short)0);
        //put a cell in the row and store long text data
        row.createCell(0).setCellValue("Loooooooong text not to show up first");

Quando esta planilha é criada, a string "Looooooong text to not show up first" está na célula, mas como a coluna não está expandida, apenas "Loooooooo" é exibido.

Como posso configurá-lo para que, ao abrir minha planilha, a coluna já esteja expandida ???

Miau
fonte
Parece que você está procurando uma maneira de usar o POI para fazer isso. Mas para fazer isso simplesmente no Excel, selecione a planilha inteira e clique duas vezes no limite do cabeçalho da coluna AB. Se você precisar fazer isso em várias planilhas, uma solução codificada pode ser melhor.
média de

Respostas:

173

Depois de adicionar todos os seus dados à planilha, você pode chamá autoSizeColumn(int column)-la para ajustar automaticamente as colunas para o tamanho adequado

Aqui está um link para a API .

Veja esta postagem para obter mais referências. Problema em ajustar o tamanho da célula do Excel ao tamanho do conteúdo ao usar o Apache Poi

Sean
fonte
7
Só queria salientar que autoSizeColumnnão escala bem e vai ser super- lento se você tiver lotes de linhas. Tive que pegar um pouco de hacky e fazer algo semelhante ao que foi sugerido nesta pergunta .
lbstr de
8
Aviso sobre autoSizeColumn , isso requer que uma fonte java esteja disponível. Isso não faz parte do jre sem cabeça usado em servidores e lançará uma NullPointerException.
Stephen Dillon,
@StephenDillon Alguma idéia de como consertar o ponteiro nulo para configuração de fonte?
Veeshal
A melhor maneira que encontramos foi fazer um loop em cada linha da coluna, encontrar o comprimento de caractere mais longo e multiplicar por x + adicionar um buffer. X usa tentativa e erro para ver o que se encaixa, mas deve ter uma largura média de um caractere. Sem a fonte, não acredito que você consiga acertar, mas chegamos bem perto. Caso contrário, você pode adicionar uma macro ao Excel para consertar tudo na primeira vez que o usuário o abrir, esse foi o melhor método, mas requer que as macros sejam habilitadas
Stephen Dillon
45

Dica: para fazer o tamanho automático funcionar, a chamada para sheet.autoSizeColumn(columnNumber)deve ser feita após preencher os dados no Excel.

Chamar o método antes de preencher os dados não terá efeito.

Unni Kris
fonte
stackoverflow.com/questions/37069820/… às vezes isso não funciona
user7856586
A resposta fornecida aqui está relacionada ao Java, enquanto o link fornecido no comentário está relacionado ao Android. A resposta ainda funciona em todos os casos de Java (exceto para JREs java headless, que não têm a fonte java disponível).
Unni Kris
obrigado, calculei func e usei setColumnWidth da seguinte maneira: (5 until row.lastCellNum).forEach { colNum -> val columnWidth = (row.getCell(colNum).toString().length * 0.44 + 2.24) * 768 reportSheet.setColumnWidth(colNum, columnWidth.toInt()) }
user7856586
@ user7856586 pode elaborar este método com mais detalhes para mim
Mehroz Mustafa
39

Se você deseja dimensionar automaticamente todas as colunas em uma pasta de trabalho, aqui está um método que pode ser útil:

public void autoSizeColumns(Workbook workbook) {
    int numberOfSheets = workbook.getNumberOfSheets();
    for (int i = 0; i < numberOfSheets; i++) {
        Sheet sheet = workbook.getSheetAt(i);
        if (sheet.getPhysicalNumberOfRows() > 0) {
            Row row = sheet.getRow(sheet.getFirstRowNum());
            Iterator<Cell> cellIterator = row.cellIterator();
            while (cellIterator.hasNext()) {
                Cell cell = cellIterator.next();
                int columnIndex = cell.getColumnIndex();
                sheet.autoSizeColumn(columnIndex);
            }
        }
    }
}
Ondrej Kvasnovsky
fonte
Eu estou começando NullPointerExceptiona row.cellIterator(). É porque não tenho valor em uma das células?
rakeeee
10

Você pode tentar algo assim:

HSSFSheet summarySheet = wb.createSheet();
summarySheet.setColumnWidth(short column, short width);

Aqui os parâmetros são: número da coluna na folha e sua largura Mas, as unidades de largura são muito pequenas, você pode tentar 4000, por exemplo.

UVM
fonte
É bom saber, obrigado! Acho que, para o meu propósito, onde a string da coluna pode ser gerada dinamicamente, o método de dimensionamento automático caberia no caso.
Meow
8

Para Excel POI:

sheetName.autoSizeColumn(cellnum); 
Adnan Ghaffar
fonte
5

amostra de código abaixo

HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("your sheet name");
HSSFRow row = sheet.createRow(0);

cell = row.createCell(0);
cell.setCellValue("A BIG NAME WITH AUTO SIZE FEATURE ENABLED");

// isso é crucial

sheet.autoSizeColumn(0);

// o argumento deve ser o número da célula

cell = row.createCell(1);
cell.setCellValue("a big name without auto size feature enabled");

Verifique a saída e enlouqueça :)

Mateen
fonte
2
sheet.setColumnWidth (columnIndex, width) também é um método que você quer dar uma olhada
Mateen
3

Se você souber a contagem de suas colunas (por exemplo, é igual a uma lista de coleção). Você pode simplesmente usar este forro para ajustar todas as colunas de uma folha (se você usar pelo menos java 8):

IntStream.range(0, columnCount).forEach((columnIndex) -> sheet.autoSizeColumn(columnIndex));
estalo
fonte
1

Eu uso a solução simples abaixo:

Esta é sua pasta de trabalho e planilha:

XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("YOUR Workshhet");

em seguida, adicione dados à sua planilha com colunas e linhas. Depois de adicionar dados à planilha, escreva o seguinte código para a autoSizeColumnlargura.

for (int columnIndex = 0; columnIndex < 15; columnIndex++) {
                    sheet.autoSizeColumn(columnIndex);
                }

Aqui, em vez de 15, você adiciona o número de colunas em sua planilha.

Espero que alguém ajude isso.

Rahul Mahadik
fonte
0

É muito simples, use este código de linha dataSheet.autoSizeColumn (0)

ou forneça o número da coluna entre colchetes dataSheet.autoSizeColumn (número da célula)

Muhammad Faisal Shahzad
fonte
0

Você também pode quebrar o texto. Código de amostra PFB:

CellStyle wrapCellStyle = new_workbook.createCellStyle();
                    wrapCellStyle.setWrapText(true);
Akash
fonte
-1

Você pode usar setColumnWidth()se quiser expandir mais sua célula.

Francis Gabriel Rodriguez
fonte