我是java的新手,我使用itextpdf作为输出。
现在我对这个问题感到非常慌张。
我的问题是我想以pdf格式显示数据库中的结果集
例如,我将设置一个包含3列的表,
这些是数据库的结果集,
名称
约翰
简
玛丽
桑尼
基尔
所以现在应该像这样查看itextpdf中的输出
| __ columnname _ | __ 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);
}
答案 0 :(得分:1)
这是错误的:
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();
现在我们可以将table2
添加到文档中。
其他一些评论:
这太过分了:
PdfPTable table2 = new PdfPTable(new float[] { 3,3,3});
如果您想要一个包含3列的列,每列都具有相同的宽度,则无需传递具有相同值的float[]
,您可以这样做:
PdfPTable table2 = new PdfPTable(3);
这条线没有意义:
table2.setTotalWidth(527);
没有意义,因为:
527
的宽度将被忽略。您可以添加table.setLockedWidth(true);
table2.setWidthPercentage(100);
,它将宽度定义为可用宽度的100%。您必须选择其中一种:绝对宽度或相对宽度。两者都没有意义。请阅读How to define the width of a cell?
完全错误:
cell.setColspan(8);
您正在定义一个包含 3列的表格,因此您将colspan设置为好像有 8列。在包含3列的表中,最大colspan为3。
<强>最后:强>
你是新手,你正在使用iText 5.为什么不开始使用iText 7? iText 7是对iText 5的重写。它有一个不同的,更适合未来的API。表格解释为here。
答案 1 :(得分:0)
为什么不使用resultsetMetadata选项来获取行中的字段数,迭代和制表符或管道分隔每个值。在行尾添加换行符。 hasNext of resultset将运行执行相同操作的所有记录。 将整个事物保存在列表中。使用该列表写入PDF。
OpenCsv | SQL | Writes only the header and not the table content