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 ???



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


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.



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);
            }
        }
    }
}

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.


É 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


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 :)


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));

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.


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)


0

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

CellStyle wrapCellStyle = new_workbook.createCellStyle();
                    wrapCellStyle.setWrapText(true);

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.