Development Tip

Apache POI에서 열 너비 설정

yourdevel 2021. 1. 10. 19:39
반응형

Apache POI에서 열 너비 설정


XML을 MS Excel로 변환하기 위해 Apache POI API를 사용하여 Java로 도구를 작성하고 있습니다. 내 XML 입력에서 열 너비를 포인트로받습니다. 그러나 Apache POI API에는 글꼴 크기 등에 따라 열 너비를 설정하는 약간 이상한 논리가 있습니다 ( API 문서 참조 ).

Excel에서 예상 한대로 포인트를 너비로 변환하는 공식이 있습니까? 전에이 일을 한 사람이 있습니까?

setRowHeightInPoints()그래도 방법 이 있습니다 :( 그러나 열에는 없습니다.

추신 : 입력 XML은 ExcelML 형식이므로 MS Excel로 변환해야합니다.


불행히도 함수 setColumnWidth (int columnIndex, int width) from class Sheet; 너비가 표준 글꼴 (통합 문서의 첫 번째 글꼴) 의 문자 수인 경우 글꼴이 변경되면 사용할 수 없습니다. 글꼴 크기의 함수에서 너비를 계산하는 방법이 설명되어 있습니다. 공식은 다음과 같습니다.

width = Truncate([{NumOfVisibleChar} * {MaxDigitWidth} + {5PixelPadding}] / {MaxDigitWidth}*256) / 256

autoSizeColumn(int column, boolean useMergedCells)에 데이터를 입력 한 후 언제든지 사용할 수 있습니다 Sheet.


의 사용에주의하십시오 autoSizeColumn(). 작은 파일에서도 문제없이 사용할 수 있지만 각 열에 대해 한 번만 (마지막에) 메서드가 호출되고 의미가없는 루프 내에서 호출되지 않도록주의하십시오.

autoSizeColumn()큰 Excel 파일에는 사용하지 마십시오 . 이 메서드는 성능 문제를 생성합니다.

110k 행 / 11 열 파일에서 사용했습니다. 이 방법은 모든 열의 크기를 자동 조정하는 데 약 6m가 걸렸습니다.

자세한 내용은 apache POI에서 열 자동 크기 조정 속도를 높이는 방법을 참조하십시오 .


이 블로그에 언급 된 util 메서드도 사용할 수 있습니다 . Apache POI를 사용하여 Excel에서 셀 크기 및 높이 가져 오기 . 문제를 해결할 수 있습니다.

해당 블로그에서 복사하여 붙여 넣기 :

static public class PixelUtil {

    public static final short EXCEL_COLUMN_WIDTH_FACTOR = 256;
    public static final short EXCEL_ROW_HEIGHT_FACTOR = 20;
    public static final int UNIT_OFFSET_LENGTH = 7;
    public static final int[] UNIT_OFFSET_MAP = new int[] { 0, 36, 73, 109, 146, 182, 219 };

    public static short pixel2WidthUnits(int pxs) {
        short widthUnits = (short) (EXCEL_COLUMN_WIDTH_FACTOR * (pxs / UNIT_OFFSET_LENGTH));
        widthUnits += UNIT_OFFSET_MAP[(pxs % UNIT_OFFSET_LENGTH)];
        return widthUnits;
    }

    public static int widthUnits2Pixel(short widthUnits) {
        int pixels = (widthUnits / EXCEL_COLUMN_WIDTH_FACTOR) * UNIT_OFFSET_LENGTH;
        int offsetWidthUnits = widthUnits % EXCEL_COLUMN_WIDTH_FACTOR;
        pixels += Math.floor((float) offsetWidthUnits / ((float) EXCEL_COLUMN_WIDTH_FACTOR / UNIT_OFFSET_LENGTH));
        return pixels;
    }

    public static int heightUnits2Pixel(short heightUnits) {
        int pixels = (heightUnits / EXCEL_ROW_HEIGHT_FACTOR);
        int offsetWidthUnits = heightUnits % EXCEL_ROW_HEIGHT_FACTOR;
        pixels += Math.floor((float) offsetWidthUnits / ((float) EXCEL_ROW_HEIGHT_FACTOR / UNIT_OFFSET_LENGTH));
        return pixels;
    }
}

따라서 셀 너비와 높이를 얻으려면 이것을 사용하여 픽셀 값을 얻을 수 있으며 값은 약 .

PixelUtil.heightUnits2Pixel((short) row.getHeight())
PixelUtil.widthUnits2Pixel((short) sh.getColumnWidth(columnIndex));

함께 스칼라 멋진 래퍼가 spoiwo은

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

Workbook(mySheet.withColumns(
      Column(autoSized = true),
      Column(width = new Width(100, WidthUnit.Character)),
      Column(width = new Width(100, WidthUnit.Character)))
    )

다음과 같이 모든 열과 셀의 기본 너비로 문제에 답했습니다.

int width = 15; // Where width is number of caracters 
sheet.setDefaultColumnWidth(width);

참조 URL : https://stackoverflow.com/questions/11573993/setting-column-width-in-apache-poi

반응형