Apache POI宽度计算

Jon*_*ins 7 apache-poi

我通过计算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
Run Code Online (Sandbox Code Playgroud)

所以我有一个确切的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));
Run Code Online (Sandbox Code Playgroud)

我认为在我的情况下,例子对我来说是最好的答案.谢谢!

Jon*_*ins 13

好吧,似乎没有人真的可以帮助我.经过反复试验,我发现了一些对我有用的近似值.

关于我的sheet.setColumnWidth(int columnIndex, int width);问题,我发现一个很好的近似如下:

  1. 在Excel中,转到"正常"视图.
  2. 转到格式 - >列宽...并记下值
  3. 使用以下公式计算宽度: width = ([number from step 2] * 256) + 200

这实际上似乎运作得相当好.

关于我mergedCellWidth应该做什么的第二个问题,我发现以下工作对该值有效:(float) (sheet.getColumnWidth(columnIndex) / 256 * 4).它对于较小的长度字符串效果更好,并且随着字符串变大,行开始变得有点太大(所以我假设因子4有点太多但它适用于我的目的).

我还查看了用于自动调整大小列的Apache POI源代码,以试图了解正在发生的事情.尽管单位意味着什么并没有很多方向,但是我无法按照他们的计算并在我的Excel模板中重现它们.

  • 您可以通过使用上面的公式来获得宽度,例如,我在第2步中获得的值是8.43,然后我使用您的公式并得到2358.08,该数字的单位是多少,我该怎么办?我需要以像素为单位的尺寸或可以使用的某种方式。请您详细说明。 (2认同)