Apache POI Excel-확장 할 열을 구성하는 방법은 무엇입니까?


98

일부 데이터를 출력 Apache POI API하기 위해 생성하는 excel spreadsheet데 사용 하고 있습니다.

내가 직면 한 문제는 스프레드 시트를 만들고 열 때 열이 확장되지 않아 날짜 형식 텍스트와 같은 일부 긴 텍스트가 한 눈에 표시되지 않는다는 것입니다.

Excel에서 열 테두리를 두 번 클릭하여 확장하거나 테두리를 끌어 열 너비를 조정할 수 있지만 20 개 이상의 열이있을 수 있으며 스프레드 시트를 열 때마다 수동으로 수행 할 방법이 없습니다.

나는 (잘못 방법이 될 수 있지만) 발견 groupRow()setColumnGroupCollapsed()트릭하지만 행운을 할 수 있습니다. 아마도 나는 그것을 잘못된 방식으로 사용하고있을 것입니다.

샘플 코드 스 니펫

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

이 스프레드 시트가 생성 될 때 "Loooooooo 텍스트가 먼저 표시되지 않음"문자열이 셀에 있지만 열이 확장되지 않았으므로 "Loooooooo"만 표시됩니다.

스프레드 시트를 열 때 열이 이미 확장되도록 구성하려면 어떻게해야합니까 ???



이것을 달성하기 위해 POI를 사용하는 방법을 찾고있는 것 같습니다. 그러나 Excel에서 간단히하려면 전체 시트를 선택하고 AB 열 머리글 경계를 두 번 클릭하십시오. 여러 장에이 작업을 수행해야하는 경우 코딩 된 솔루션이 더 나은 서비스를 제공 할 수 있습니다.
평균

답변:


172

모든 데이터를 시트에 추가 한 후autoSizeColumn(int column) 시트를 호출 하여 열을 적절한 크기에 자동으로 맞출 수 있습니다.

다음은 API에 대한 링크 입니다.

자세한 내용은이 게시물을 참조하십시오. apache poi를 사용할 때 엑셀 셀 크기를 콘텐츠 크기에 맞추는 문제


7
autoSizeColumn확장이 잘되지 않고 행이 많은 경우 매우 느릴 것이라는 점을 지적하고 싶었습니다 . 나는 약간의 해키를 얻어이 질문에서 제안 것과 비슷한 것을해야 했다 .
lbstr

8
autoSizeColumn대한 경고 입니다. 자바 글꼴을 사용할 수 있어야합니다. 이것은 서버에서 사용되는 헤드리스 Java jre의 일부가 아니며 NullPointerException을 발생시킵니다.
Stephen Dillon

@StephenDillon 글꼴 구성에 대한 null 포인터를 수정하는 방법에 대한 아이디어가 있습니까?
Veeshal

우리가 찾은 가장 좋은 방법은 col의 각 행을 반복하고 가장 긴 char 길이를 찾은 다음 x를 곱하고 버퍼를 추가하는 것입니다. X는 시행 착오를 통해 무엇이 맞는지 확인하지만 평균 문자 너비 여야합니다. 글꼴 없이는 실제로 올바르게 얻을 수 있다고 생각하지 않지만 꽤 가까워졌습니다. 그렇지 않으면 매크로를 추가하여 사용자가 처음 열 때마다 수정하도록 할 수 있습니다. 이것이 최상의 방법 이었지만 매크로를 활성화해야합니다
Stephen Dillon

45

팁 : 자동 크기를 작동하려면 데이터를 Excel에 채운 후를 호출 sheet.autoSizeColumn(columnNumber)해야합니다 .

데이터를 채우기 전에 메서드를 호출해도 효과가 없습니다.


stackoverflow.com/questions/37069820/... 가끔 작동하지 않는 것을
user7856586

여기에 제공된 답변은 Java와 관련이 있지만 댓글에 제공된 링크는 Android와 관련이 있습니다. 대답은 여전히 ​​모든 Java 경우에서 작동합니다 (Java 글꼴을 사용할 수없는 헤드리스 Java JRE 제외).
Unni Kris

다음과 같은 방법 덕분에, 내가 계산 FUNC 및 사용 setColumnWidth : (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이 방법을 좀 더 자세히 설명해 주시겠습니까
Mehroz Mustafa

39

통합 문서의 모든 열 크기를 자동으로 조정하려는 경우 유용한 방법은 다음과 같습니다.

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

나는 NullPointerException에서 얻고 있다 row.cellIterator(). 셀 중 하나에 가치가 없기 때문입니까?
rakeeee

10

다음과 같이 시도 할 수 있습니다.

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

여기 매개 변수는 다음과 같습니다. 시트의 열 번호와 너비 그러나 너비 단위는 매우 작습니다. 예를 들어 4000을 시도해 볼 수 있습니다.


감사합니다! 열 문자열이 동적으로 생성 될 수있는 내 목적을 위해 자동 크기 조정 방법이 경우에 적합 할 것이라고 생각합니다.
Meow


5

아래 샘플 코드

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

// 중요하다

sheet.autoSizeColumn(0);

// 인수는 셀 번호 여야합니다.

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

출력을 확인하고 미치광이 :)


2
sheet.setColumnWidth (columnIndex, width)도 살펴보고 싶은 메소드입니다
Mateen

3

열 수를 알고있는 경우 (컬렉션 목록과 동일 함). 이 하나의 라이너를 사용하여 한 시트의 모든 열을 조정할 수 있습니다 (최소 Java 8을 사용하는 경우).

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

1

나는 아래의 간단한 해결책을 사용합니다.

이것은 통합 문서와 시트입니다.

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

그런 다음 열과 행이있는 시트에 데이터를 추가합니다. 시트에 데이터를 추가하면 다음 코드를 autoSizeColumn너비에 작성하십시오.

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

여기에서 15 대신 시트에 열 수를 추가합니다.

누군가가 이것을 돕기를 바랍니다.


0

매우 간단합니다.이 한 줄 코드를 사용하십시오. dataSheet.autoSizeColumn (0)

또는 괄호 안의 열 수를 제공하십시오 .dataSheet.autoSizeColumn (cell number)


0

텍스트를 줄 바꿈 할 수도 있습니다. PFB 샘플 코드 :

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.