Java 从数据库到itextpdf的结果集

Java 从数据库到itextpdf的结果集,java,itext,Java,Itext,我是java新手,我使用itextpdf作为输出 现在我被这个问题吓坏了 Document document = new Document(PageSize.A4, 25, 25, 25, 25); PdfWriter writer = PdfWriter.getInstance(document,new FileOutputStream("D:\\PURCHASEORDER\\"+see+".pdf")); document.open(); try { Class.forName(dr

我是java新手,我使用itextpdf作为输出
现在我被这个问题吓坏了

Document document = new Document(PageSize.A4, 25, 25, 25, 25);
PdfWriter writer = PdfWriter.getInstance(document,new FileOutputStream("D:\\PURCHASEORDER\\"+see+".pdf"));
document.open();
try {
    Class.forName(driver);
    conn = DriverManager.getConnection(url+db, user, pass);
    Statement st = conn.createStatement();
    String zero = dates.getSelectedItem().toString();
    String sql = "select name as hehe from names where  servedate = '"+zero+"'";
    pst=conn.prepareStatement(sql);
    rs=pst.executeQuery();

    Rectangle react = writer.getPageSize();
    PdfPTable table2 = new PdfPTable(new float[] { 3,3,3});
    table2.setTotalWidth(527);
    table2.getDefaultCell().setBorder(Rectangle.NO_BORDER);
    PdfPCell cell = new PdfPCell(new Paragraph(""));
    cell.setColspan(8);
    cell.setHorizontalAlignment(Element.ALIGN_LEFT);
    cell.setBackgroundColor(BaseColor.GRAY);
    table2.addCell(cell);
    table2.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);

    while(rs.next()){
        String v1 = rs.getString("hehe");
        FontFactory.getFont(FontFactory.TIMES_BOLD,14,BaseColor.BLACK)));
        table2.addCell(new Paragraph("TOTAL Number: "+v1+"", FontFactory.getFont(FontFactory.TIMES_ROMAN,12,BaseColor.BLACK)));
        table2.addCell(new Paragraph("TOTAL Number: "+v1+"", FontFactory.getFont(FontFactory.TIMES_ROMAN,12,BaseColor.BLACK)));
        table2.addCell(new Paragraph("TOTAL Number: "+v1+"", FontFactory.getFont(FontFactory.TIMES_ROMAN,12,BaseColor.BLACK)));

    }
    table2.setWidthPercentage(100);
    document.add(table2);

} catch (Exception e) {
    JOptionPane.showMessageDialog(null, e);
}
document.close();
String pdfFile="D:\\PURCHASEORDER\\"+see+".pdf";
File f = new File(pdfFile);
if (pdfFile.toString().endsWith(".pdf")) {
    Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + pdfFile);
} else {
    //For cross platform use
    Desktop desktop = Desktop.getDesktop();

    desktop.open(f);
}
我的问题是,我想以pdf格式显示数据库中的结果集,但有点扭曲。

例如,我将设置一个包含3列的表,
这些是来自数据库的结果集,

名称
约翰

玛丽
桑尼
基尔

所以现在itextpdf中的输出应该如下所示

|__columnname u| _; columnname | | columnname |
|_____约翰·简·玛丽·玛丽·玛莉 |_____桑尼(桑尼)(桑尼)(桑尼)(桑尼)(桑尼)(桑尼)(桑尼)基尔(桑尼)(桑尼


我希望在每一列中都插入结果,但我不知道该怎么做。

有人吗?如果有人能指引我,那就太好了

Document document = new Document(PageSize.A4, 25, 25, 25, 25);
PdfWriter writer = PdfWriter.getInstance(document,new FileOutputStream("D:\\PURCHASEORDER\\"+see+".pdf"));
document.open();
try {
    Class.forName(driver);
    conn = DriverManager.getConnection(url+db, user, pass);
    Statement st = conn.createStatement();
    String zero = dates.getSelectedItem().toString();
    String sql = "select name as hehe from names where  servedate = '"+zero+"'";
    pst=conn.prepareStatement(sql);
    rs=pst.executeQuery();

    Rectangle react = writer.getPageSize();
    PdfPTable table2 = new PdfPTable(new float[] { 3,3,3});
    table2.setTotalWidth(527);
    table2.getDefaultCell().setBorder(Rectangle.NO_BORDER);
    PdfPCell cell = new PdfPCell(new Paragraph(""));
    cell.setColspan(8);
    cell.setHorizontalAlignment(Element.ALIGN_LEFT);
    cell.setBackgroundColor(BaseColor.GRAY);
    table2.addCell(cell);
    table2.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);

    while(rs.next()){
        String v1 = rs.getString("hehe");
        FontFactory.getFont(FontFactory.TIMES_BOLD,14,BaseColor.BLACK)));
        table2.addCell(new Paragraph("TOTAL Number: "+v1+"", FontFactory.getFont(FontFactory.TIMES_ROMAN,12,BaseColor.BLACK)));
        table2.addCell(new Paragraph("TOTAL Number: "+v1+"", FontFactory.getFont(FontFactory.TIMES_ROMAN,12,BaseColor.BLACK)));
        table2.addCell(new Paragraph("TOTAL Number: "+v1+"", FontFactory.getFont(FontFactory.TIMES_ROMAN,12,BaseColor.BLACK)));

    }
    table2.setWidthPercentage(100);
    document.add(table2);

} catch (Exception e) {
    JOptionPane.showMessageDialog(null, e);
}
document.close();
String pdfFile="D:\\PURCHASEORDER\\"+see+".pdf";
File f = new File(pdfFile);
if (pdfFile.toString().endsWith(".pdf")) {
    Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + pdfFile);
} else {
    //For cross platform use
    Desktop desktop = Desktop.getDesktop();

    desktop.open(f);
}

为什么不使用resultsetMetadata选项获取一行中的字段数,迭代并用tab或pipe分隔每个值呢。在行尾追加换行符。 hasNext of resultset将运行所有执行相同操作的记录。 将整个内容保存在列表中。使用该列表写入PDF

这是错误的:

while(rs.next()){
    String v1 = rs.getString("hehe");
        FontFactory.getFont(FontFactory.TIMES_BOLD,14,BaseColor.BLACK)));
    table2.addCell(new Paragraph("TOTAL Number: "+v1+"", FontFactory.getFont(FontFactory.TIMES_ROMAN,12,BaseColor.BLACK)));
    table2.addCell(new Paragraph("TOTAL Number: "+v1+"", FontFactory.getFont(FontFactory.TIMES_ROMAN,12,BaseColor.BLACK)));
    table2.addCell(new Paragraph("TOTAL Number: "+v1+"", FontFactory.getFont(FontFactory.TIMES_ROMAN,12,BaseColor.BLACK)));
}
首先,让我们通过创建一个可重用的
Font
对象来清理脏代码:

Font font = FontFactory.getFont(FontFactory.TIMES_ROMAN,12,BaseColor.BLACK);
其次,让我们解决向每行添加相同值的问题:

String v1;
while(rs.next()){
    v1 = rs.getString("hehe");
    table2.addCell(new Paragraph("TOTAL Number: " + v1, font));
}
最后,我们知道iText只向表中添加完整的行,在您的示例中,Sonny和Kiel只在三行中填充两个单元格,因此我们需要完成最后一行:

table2.completeRow();
现在我们可以将
表2
添加到文档中

其他一些评论:

这太过分了:

PdfPTable table2 = new PdfPTable(new float[] { 3,3,3});
如果您想要一个包含3列且每列宽度相同的列,则无需传递具有相等值的
float[]
,只需执行以下操作:

PdfPTable table2 = new PdfPTable(3);
这句话没有意义:

table2.setTotalWidth(527);
这没有意义,因为:

  • 您没有锁定宽度,因此
    527
    的宽度将被忽略。您可以添加
    table.setLockedWidth(true)
  • 还有
    表2.setWidthPercentage(100)将宽度定义为可用宽度的100%
  • 您必须选择一个或另一个:绝对宽度或相对宽度。两者兼而有之是没有意义的。请阅读

    这是完全错误的:

    cell.setColspan(8);
    
    您定义的表有3列,因此您将colspan设置为有8列。在包含3列的表中,最大colspan为3

    最后:


    你是个新手,现在正在使用iText 5。既然您刚刚开始,为什么不使用iText 7呢?iText 7是对iText 5的重写。它有一个不同的、更经得起未来考验的API。表已被解释。

    您是否研究过使用java提供的PreparedStatement和ResultSet类?是的,我已经知道了,唯一不知道的是如何显示它们,以便将每个ResultSet插入到每个列中。好的,非常感谢,我将尝试此方法。对不起,我真的是新手。现在我正在学习itext7。