【问题标题】:How to change the width of a cell?如何更改单元格的宽度?
【发布时间】:2015-11-06 11:03:13
【问题描述】:

在设置单元格底部边框的长度方面需要您的帮助。目前,它显示单元格的底部边框太长,我需要缩短它。我试图改变桌子的宽度,但它不能正常进行。

下面是代码:

Paragraph tableParagraph = new Paragraph();
tableParagraph.setAlignment(Element.ALIGN_LEFT);

PdfPTable table55 = new PdfPTable(2);
table55 = new PdfPTable(new float[] { 6, 6 });
table55.setWidthPercentage(90f);
table55.getDefaultCell().setBorder(PdfPCell.NO_BORDER);

PdfPCell cel2a = new PdfPCell(new Paragraph("Total of Net Profit ", font));

PdfPCell cel2b = new PdfPCell(new Paragraph("100.000" + " USD  ", font));

cel2a.setBorder(Rectangle.NO_BORDER);
cel2b.setBorder(Rectangle.BOTTOM);
cel2a.setLeading(1f, 1.5f);
cel2b.setLeading(1f, 1.5f);

table55.addCell(cel2a);
table55.addCell(cel2b);

【问题讨论】:

  • 单元格下边框的长度与单元格的宽度相同。如果要更改该长度,则必须更改单元格的宽度(当前是页面宽度的 90% 减去左右边距的一半),或者...如果您不想更改单元格的宽度,使用单元格事件使用您自己的代码绘制边框。所以告诉我们:你想改变单元格的宽度吗?如果不是:底部边框的长度应该是多少?
  • 另一方面,您应该删除此行:table55.getDefaultCell().setBorder(PdfPCell.NO_BORDER); 您没有在代码中的任何位置使用默认单元格。相反,您创建自己的 PdfPCell 实例。仅当您像这样添加单元格时,使用默认单元格才有意义:table.addCell("cell content"). 在这种情况下,iText 根据默认单元格的属性创建一个PdfPCell。
  • @BrunoLowagie 是代码表中的第一个编号 6 55 = new PdfPTable(new float[] { 6, 6 });是指第一个单元格宽度吗?
  • table55 = new PdfPTable(new float[] { 6, 6 }); 行等同于table55 = new PdfPTable(2); 通过使用参数new float[] { 6, 6 },您没有定义列的宽度!您只需告诉 iText 您想要两列具有相同宽度。每个测量可用宽度的 90% 的一半。请阅读文档。
  • 那么告诉我:你想改变单元格的宽度吗?或者你想保持单元格的宽度并改变底部边框的长度?没有这个问题的答案,我就写不出你的答案。

标签: java pdf-generation itext pdfptable


【解决方案1】:

定义单元格宽度的方法有多种。为了解释不同的选项,我们必须先讨论定义表格(所有列)的宽度,然后再讨论定义单独列的宽度。

表格宽度:

选项 1:您不定义绝对宽度。

相反,您要求 iText 根据可用空间计算宽度。可用空间是页面宽度减去左边距和右边距的大小。

如果您创建这样的文档:

Document document = new Document();

那么页面的宽度是 595 个用户单位(这是 A4 页面的宽度),边距的宽度是 36 个用户单位(如果您没有明确定义边距,这些是默认值)。因此可用宽度为 523 个用户单位。

当你像这样定义你的表时:

PdfPTable table = new PdfPTable(2);

那么当您将此表格添加到页面时,表格将占据可用宽度的 80%。因此,如果可用宽度为 523,则表格的宽度将为 418.4 个用户单位。

您可以通过更改宽度百分比来更改此设置。例如,如果您添加:

table.setWidthPercentage(100);

然后将使用 100% 的可用宽度,您的表格将是 523 个用户单位宽。

选项 2:您定义绝对宽度。

假设您被要求创建一个宽度为 4 英寸的表格。默认情况下,1 英寸是 72 个用户单位,因此您需要一个包含 288 个用户单位的表格。

可以这样实现:

PdfPTable table = new PdfPTable(2);
table.setTotalWidth(288);
table.setLockedWidth(true);

如果您忘记了 table.setLockedWidth(true); 行,那么 iText 将假定您希望 iText 根据(默认)宽度百分比和可用宽度来计算宽度。锁定宽度,切换 iText 以使用总宽度作为绝对宽度。

列宽:

案例 1:相对宽度

当您不定义任何宽度时,每列将具有相同的宽度。该宽度将通过将表格的宽度除以列数来计算。例如。如果表格的宽度为 288 个用户单位,并且表格有两列,则每列将是 144 个用户单位。

假设您希望第二列的宽度是第一列的三倍,那么您可以像这样更改列的相对宽度:

PdfPTable table = new PdfPTable(2);
table.setWidths(new float[] { 1, 3 });

或者,如果您只想使用一行:

PdfPTable table = new PdfPTable(new float[] { 1, 3 });

如果table 的宽度为 288,那么现在第一列的宽度为 72,第二列的宽度为 216。

如果你这样做,你会得到同样的结果:

PdfPTable table = new PdfPTable(new float[] { 25, 75 });

宽度是相对值。 { 1, 3 } 相当于 { 25, 75 }。

你做了一些奇怪的事情:

PdfPTable table55 = new PdfPTable(2);
table55 = new PdfPTable(new float[] { 6, 6 });

在第一行中,您创建了一个包含两列宽度相同的表格new PdfPTable(2),但您从不使用该PdfPTable(2),因为在第二行中您将table55 变量重新定义为new PdfPTable(new float[]{ 6, 6 } )。

由于{ 6, 6 } 是相对值,这相当于{ 50, 50 } 或{ 1, 1 }...您正在创建一个具有相同宽度的两列的表格。

案例 2:绝对宽度

假设您不想使用相对宽度(例如,因为计算 288 的 1/4 和 288 的 3/4 的数学太难了)并且您想创建一个表格宽度,其中两列第一个1英寸宽,第二个3英寸宽,那么你可以再次使用表格锁定宽度的原理。看看:

PdfPTable table = new PdfPTable(2);
table.setTotalWidth(new float[]{ 72, 216 });
table.setLockedWidth(true);

现在我们将一个数组传递给setTotalWidth() 方法。宽度不再是相对的,我们通过锁定宽度来告诉 iText 使用这些绝对宽度。

现在第一列(以及第一列中的所有单元格)将是 72 个用户单位(1 英寸)宽,第二列将是 216 个用户单位(3 英寸)宽。

单元格宽度:

单元格的宽度跟随列的宽度。

当然,所有这些都已在在线提供的文档中进行了详细解释。请参阅ColumnWidths 等示例或免费电子书The Best iText Questions on StackOverflow 中专门介绍表格的整章。有人想知道为什么没有人阅读过该文档。如果没有人对答案感兴趣,继续回答问题是否有意义? (抱歉这篇哲学笔记,这已经是漫长的一天了。)

【讨论】:

    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多