Вычисления ширины 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);
проблема, я нашел хорошее приближение следующим образом:
- в Excel перейдите в" обычный " вид.
- зайти в формат -> ширина столбца... и обратите внимание на значение
- используйте следующую формулу для расчета ширины:
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.