Вычисления ширины POI Apache

у меня возникли проблемы с получением точного размера, который я хочу с моими вычислениями для columnWidth и моей расчетной высоты строки, потому что я не понимаю документацию.

С точки зрения columnWidth, я использую строку кода sheet.setColumnWidth(int columnIndex, int width); но я не понимаю как правильно рассчитать ширину. Я понимаю, что он говорит:

width = Truncate([{Number of Visible Characters} * {Maximum Digit Width} + {5 pixel padding}]/{Maximum Digit Width}*256)/256

поэтому у меня есть точный пример листа Excel того, что я хочу создать, и когда я выделяю столбец и выбираю ширину столбца, он говорит мне, что это 9.67 (94 pixels). Так что же это значит? Как подключить это к моему уравнению, чтобы получить значение ширины, которое я хочу?

другая проблема, с которой я сталкиваюсь, заключается в том, что я использую код, который я нашел в другом месте (даже на SO) для динамического вычисления высоты строки. Но моя проблема в том, что я не понимаю, что mergedCellWidth в приведенном ниже коде должны быть в строку nextPos = measurer.nextOffset(mergedCellWidth). Кажется, я не могу получить это значение правильно, и это испортит, сколько строк, по его мнению, должно быть, и поэтому моя высота строки не право.

java.awt.Font currFont = new java.awt.Font("Calibri", 0, 11);
AttributedString attrStr = new AttributedString(record.getDescription());
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() < record.getDescription().length()) {
    System.out.println(measurer.getPosition());
    nextPos = measurer.nextOffset(mergedCellWidth); // mergedCellWidth is the max width of each line
    lineCnt++;
    measurer.setPosition(nextPos);
    System.out.println(measurer.getPosition());
}

row.setHeight((short)(row.getHeight() * lineCnt));

Я думаю, что в моем случае примеры были бы лучшим ответом для меня. Спасибо!

2 ответов


Ну, похоже, никто не может мне помочь. После проб и ошибок, я нашел пару приближений, которые работали хорошо для меня.

по поводу моего sheet.setColumnWidth(int columnIndex, int width); проблема, я нашел хорошее приближение следующим образом:

  1. в Excel перейдите в" обычный " вид.
  2. зайти в формат -> ширина столбца... и обратите внимание на значение
  3. используйте следующую формулу для расчета ширины: width = ([number from step 2] * 256) + 200

это на самом деле кажется работают довольно хорошо.

по поводу моей второй проблемы о том, что mergedCellWidth должно быть, я нашел следующие работы ok для этого значения:(float) (sheet.getColumnWidth(columnIndex) / 256 * 4). Он работает намного лучше для строк меньшей длины, и когда строки становятся больше, строка начинает становиться слишком большой (поэтому я предполагаю, что коэффициент 4 немного слишком много, но он работает для моих целей).

Я также проверил источник POI Apache для столбцов автоматической калибровки, чтобы попытаться получить представление о том, что происходит. Не много направления, хотя в том, что означают единицы, и я не смог следить за их расчетами и воспроизводить их в моем шаблоне Excel.


в Excel 2007, с файлом XSSF (xlsx), следующий код, кажется, работает отлично:

public static int poiWidthToPixels(final double widthUnits) {
        if (widthUnits <= 256) {
            return (int) Math.round((widthUnits / 28));
        } else {
            return (int) (Math.round(widthUnits * 9 / 256));
        }
}

где widthUnits-значение, возвращаемое листом.getColumnWidth.