programing

Apache POI에서 열 너비 설정

batch 2023. 4. 11. 21:49
반응형

Apache POI에서 열 너비 설정

저는 Apache POI API를 사용하여 XML을 MS Excel로 변환하기 위한 툴을 자바에서 작성하고 있습니다.XML 입력으로 열 너비를 포인트로 받습니다.그러나 Apache POI API는 글꼴 크기 등을 기준으로 열 너비를 설정할 때 약간 이상한 논리를 가지고 있습니다(API 문서 참조).

Excel이 예상한 대로 점을 너비로 변환하는 공식이 있습니까?이런 거 해본 사람 있어?

이 있습니다.setRowHeightInPoints()메서드(열에는 없음).

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

안타깝게도 setColumnWidth(int column) 함수만 있습니다.인덱스(int width) 시작점class Sheet; width는 표준 글꼴(워크북의 번째 글꼴)의 숫자입니다. 글꼴이 변경되면 사용할 수 없습니다.글꼴 크기의 함수에서 너비를 계산하는 방법에 대해 설명합니다.공식은 다음과 같습니다.

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

데이터 입력 후 언제든지 사용할 수 있습니다.Sheet.

사용법에 주의해 주십시오.autoSizeColumn()작은 파일에서도 문제없이 사용할 수 있지만, 각 컬럼에 대해 1회(마지막)만 호출하고 루프 내에서 호출하지 않도록 주의해 주십시오.

사용을 피하세요.autoSizeColumn()큰 Excel 파일에 있습니다.메서드로 인해 성능 문제가 발생합니다.

110k 행/11 열 파일에 사용했습니다.이 방법에서는 모든 컬럼을 자동 사이징하는 데 약 600만 시간이 소요되었습니다.

자세한 내용은 Apache POI의 컬럼 크기를 자동화하는 방법을 참조하십시오.

이 블로그에 기재되어 있는 사용방법도 사용할 수 있습니다.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));

Scala와 함께 멋진 포장지가 있습니다.

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

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

반응형