打印数据库表到iText PDF报告Java

时间:2017-07-25 08:57:19

标签: java sql itext

<font color='FF6600'>

我试图将Document document = new Document(); PdfWriter.getInstance(document, new FileOutputStream("VendorOrder.pdf")); document.open(); Image img = Image.getInstance("ReportHeader.png"); img.setAlignment(Image.MIDDLE); document.add(img); String dateOrdered,vendName,vendTotalOrd,vendBalance,vendRebate; String sql = "select * from VendorOrder where NO=?"; pst = sqliteconn.prepareStatement(sql); pst.setString(1, getVendorField.getText()); rs = pst.executeQuery(); if(rs.next()) { dateOrdered = rs.getString("DATE"); vendName = rs.getString("VENDOR"); vendTotalOrd = rs.getString("TOTAL"); vendBalance = rs.getString("BALANCE"); vendRebate = rs.getString("REBATE"); rs.close(); pst.close(); document.add(new Paragraph("\n")); PdfPTable nameTable = new PdfPTable(2); PdfPCell cell = new PdfPCell(new Paragraph("CUSTOMER DETAILS")); cell.setColspan(3); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setBackgroundColor(BaseColor.CYAN); nameTable.addCell(cell); nameTable.setWidths(new int[]{2, 1}); nameTable.addCell("NAME: \n" + vendName); nameTable.addCell("DATE ORDERED: "+ dateOrdered); document.add(nameTable); PdfPTable vendTable = new PdfPTable(3); PdfPCell cell1 = new PdfPCell(new Paragraph("TOTAL PURCHASED")); cell1.setBackgroundColor(BaseColor.LIGHT_GRAY); vendTable.addCell(cell1); PdfPCell cell2 = new PdfPCell(new Paragraph("BALANCE LEFT")); cell2.setBackgroundColor(BaseColor.LIGHT_GRAY); vendTable.addCell(cell2); PdfPCell cell3 = new PdfPCell(new Paragraph("TOTAL REBATE")); cell3.setBackgroundColor(BaseColor.LIGHT_GRAY); vendTable.addCell(cell3); vendTable.addCell(vendTotalOrd); vendTable.addCell(vendBalance); vendTable.addCell(vendRebate); document.add(vendTable); } document.add(new Paragraph("----------------------------------------------------------------------------------------------------------------------------------")); document.add(new Paragraph("\n")); PdfPTable ordTable = new PdfPTable(4); PdfPCell cell = new PdfPCell(new Paragraph("PURCHASED ITEMS")); cell.setColspan(4); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setBackgroundColor(BaseColor.CYAN); ordTable.addCell(cell); PdfPCell cell1 = new PdfPCell(new Paragraph("NEWPAPER")); cell1.setHorizontalAlignment(Element.ALIGN_CENTER); cell1.setBackgroundColor(BaseColor.LIGHT_GRAY); ordTable.addCell(cell1); PdfPCell cell2 = new PdfPCell(new Paragraph("PRICE")); cell2.setHorizontalAlignment(Element.ALIGN_CENTER); cell2.setBackgroundColor(BaseColor.LIGHT_GRAY); ordTable.addCell(cell2); PdfPCell cell3 = new PdfPCell(new Paragraph("# OF ORDERS")); cell3.setHorizontalAlignment(Element.ALIGN_CENTER); cell3.setBackgroundColor(BaseColor.LIGHT_GRAY); ordTable.addCell(cell3); PdfPCell cell4 = new PdfPCell(new Paragraph("SUBTOTAL")); cell4.setHorizontalAlignment(Element.ALIGN_CENTER); cell4.setBackgroundColor(BaseColor.LIGHT_GRAY); ordTable.addCell(cell4); //document.add(ordTable); String newsName,newsPrice,newsOrders,newsSubt; String sql1 = "select NEWSPAPER,PRICE,ORDERS,SUBTOTAL from NewspaperOrder where NO=?"; pst = sqliteconn.prepareStatement(sql1); pst.setString(1, getVendorField.getText()); rs=pst.executeQuery(); while(rs.next()){ newsName = rs.getString("NEWSPAPER"); newsPrice = rs.getString("PRICE"); newsOrders = rs.getString("ORDERS"); newsSubt = rs.getString("SUBTOTAL"); rs.close(); pst.close(); //System.out.println(newsName + " " + newsPrice + " " + newsOrders + " " + newsSubt); ordTable.addCell(newsName); ordTable.addCell(newsPrice); ordTable.addCell(newsOrders); ordTable.addCell(newsSubt); } document.add(ordTable); document.close(); JOptionPane.showMessageDialog(null, "SAVED"); VendorOrder数据库表中的大量信息打印到iText PDF。我试图从NewspaperOrder db表打印一组数据,并且我已成功将它们打印成PDF,而在VendorOrder db表中我试图打印超过1组数据而它只是显示NewspaperOrder db表中的第一组数据。

PDF

基于NewspaperOrder db表,它应该打印出订单ID为&#34; 11&#34;的所有数据。

NewspaperOrder db table

我看到了类似的问题,解决方案与我所做的完全相似。我无法找到错误的位置,因为代码不会抛出任何异常。

2 个答案:

答案 0 :(得分:3)

假设您可以自由选择库,我会选择iText7,因为它可以更好地处理表格。

以下代码是一个小样本,用于说明如何完成。 在你的例子中,令我印象深刻的是代码重复的数量。 我建议将其保持在最低限度。

var o map[string]interface{}
err := json.Unmarshal(data, &o)
if err != nil {
        revel.INFO.Println("Json Decode Error", err)
    }
fmt.Println(o)

这会生成一个pdf文档,其中包含一个包含上述记录的表。

答案 1 :(得分:0)

您仅使用if(rs.next())从数据库中提取给定数据的第一次出现,这就是为什么您的代码未按预期打印所有内容的原因。

使用if(rs.next())代替使用while(rs.next()),它将很好用。