programing

Apache POI의 행 자동 크기 높이

powerit 2023. 5. 28. 21:04
반응형

Apache POI의 행 자동 크기 높이

Apache POI를 사용하여 스프레드시트에 값을 입력하고 있습니다.이 값들은 줄이 바뀌었고 이 코드를 성공적으로 사용할 수 있었습니다.

CellStyle style = cell.getCellStyle()
style.setWrapText(true)
cell.setCellStyle(style)

안타깝게도 텍스트가 올바르게 마무리되는 동안 행의 높이가 항상 콘텐츠를 표시할 만큼 증가하지는 않습니다.행 높이가 항상 올바른지 확인하려면 어떻게 해야 합니까?

currentRow.setHeight((short)-1)

XSSFell 및 Excel 2013에서 작동합니다.

HSSFWorkbook workbook=new HSSFWorkbook();
HSSFSheet sheet =  workbook.createSheet("FirstSheet");  
HSSFRow rowhead=   sheet.createRow((short)0);
HSSFCellStyle style = workbook.createCellStyle();
style.setWrapText(true);
row.setRowStyle(style);
row.getCell(0).setCellStyle(style);

위의 코드는 행의 동적 높이를 생성합니다.

이 작업을 수행할 수 있는 유일한 방법은 행 높이를 계산하기 위한 구현을 직접 작성하는 것이었습니다.코드는 이제 타로 프로젝트로 출시되었으니, 당신은 그것을 사용할 수 있습니다.엑셀 파일을 훨씬 적은 줄의 코드로 작성할 수 있는 다양한 편리한 방법이 있습니다.

구현을 사용자 고유의 코드로 입력하려는 경우 스프레드시트 탭 클래스에서 찾을 수 있습니다.autoSizeRow(interrowIndex) 메서드가 중간에 있습니다.기본적으로 행을 반복하고 각 셀에 대해 텍스트 줄 수를 찾은 다음 글꼴 크기를 사용하여 최적의 셀 높이를 계산합니다.그런 다음 행 높이를 가장 높은 셀의 높이로 설정합니다.

너비와 셀 내용을 기준으로 행의 정확한 높이를 수동으로 계산할 수 있는 코드를 제공하는 이 모든 링크를 참조하십시오.저는 그것을 개인적으로 테스트하지 않았습니다.편의를 위해 아래에 붙여넣기도 했습니다.

// Create Font object with Font attribute (e.g. Font family, Font size, etc) for calculation
java.awt.Font currFont = new java.awt.Font(fontName, 0, fontSize);
AttributedString attrStr = new AttributedString(cellValue);
attrStr.addAttribute(TextAttribute.FONT, currFont);

// Use LineBreakMeasurer to count number of lines needed for the text
FontRenderContext frc = new FontRenderContext(null, true, true);
LineBreakMeasurer measurer = new LineBreakMeasurer(attrStr.getIterator(), frc);
int nextPos = 0;
int lineCnt = 0;
while (measurer.getPosition() < cellValue.length())
{
    nextPos = measurer.nextOffset(mergedCellWidth); // mergedCellWidth is the max width of each line
    lineCnt++;
    measurer.setPosition(nextPos);
}

Row currRow = currSht.getRow(rowNum);
currRow.setHeight((short)(currRow.getHeight() * lineCnt));

// The above solution doesn't handle the newline character, i.e. "\n", and only
// tested under horizontal merged cells.
cell.getRow().setHeight((short) -1);

Apache Poi 3.9 이상의 HSSFCell에서 근무했습니다.

제 경우 강력한 솔루션은 선의 수를 계산하고 행 높이를 기본 행 높이의 배수로 설정하는 것이었습니다.

int numberOfLines = cell.getStringCellValue().split("\n").length;
row.setHeightInPoints(numberOfLines*sheet.getDefaultRowHeightInPoints());

Excel 2010에서 작동합니다.셀 길이 제한을 50자로 설정했습니다.

    Row row = sheet.createRow(0);
    CellStyle style = workbook.createCellStyle();
    style.setWrapText(true);
    if (data.length() > 50) {
        for (int i = 1; i <= Math.abs(data.length() / 50); i++) {
            data = data.substring(0, i * 50) + "\n" + data.substring(i * 50);
        }
        Cell cell = row.createCell(0);
        row.setRowStyle(style);
        cell.setCellStyle(style);
        cell.setCellValue(data);
        sheet.autoSizeColumn(0);
    }

셀 높이는 직접 조정할 수 없습니다.그러나 행의 높이를 변경할 수 있습니다.

final HSSFSheet fs = wb.createSheet("sheet1");
final HSSFRow row0 = fs.createRow(0);
final HSSFCell cellA1 = row0.createCell(0);
row0.setHeight((short)700);

나를 위한 Row aito size 작업:

cell.getRow().setHeight((short)0);

여기서0자동 높이 계산에 사용됩니다.

병합 판매를 위한 자동 높이가 있는 "LibreOffice Calc" 및 "WPS 스프레드시트"에 대한 해결 방법.

기본 문서의 오른쪽에 열을 추가합니다(내 경우 32열) 동일한 텍스트를 가진 모든 병합 셀로 너비를 설정합니다.스타일 WrapText를 true로 설정 스타일을 병합된 셀에 표시될 상위 복사 내용 정렬 열을 숨기도록 설정 행 높이 설정 = -1

코드 샘플:

   private void applyRowHightWorkaroundForMergedCells(HSSFCell cell0) {
       HSSFSheet sheet = cell0.getSheet();
       HSSFRow row = cell0.getRow();
    
       String value = cell0.getStringCellValue();
       HSSFCell cell = row.createCell(32);
       sheet.setColumnWidth(32, 32000);
       cell.getCellStyle().setWrapText(true);
       cell.getCellStyle().setVerticalAlignment(VerticalAlignment.TOP);
       cell.setCellValue(value);
       sheet.setColumnHidden(32, true);
       row.setHeight((short) -1);
   }

//시트에 열 너비를 사용할 수 있습니다.

Ex: sheet.setColumnWidth(0, 2000);

언급URL : https://stackoverflow.com/questions/19145628/auto-size-height-for-rows-in-apache-poi

반응형