首页 > 解决方案 > 从mysql到reportlab的多个值

问题描述

我有一个问题,我无法在 mysql 表中显示我的第二条记录。该报告仅连续显示 1 条记录,而第二条记录未显示在 pdf 文件中。我在 python 2.7 上使用 reportlab 生成报告

这是我的代码,我还不能修复:

def nilaisql():
  rpt = raw_input("input NPM : ")
  sql = "select nama, tanggal, jamMasuk from t_"+rpt
  curs.execute(sql)
  result = curs.fetchall()
  for row in result:
      c = canvas.Canvas("Sampelone.pdf")
      c.drawString(250, 700, str(row[0]))
      c.save()
  os.system("Sampelone.pdf")

这是我在mysql上的记录。我想显示第二行记录,但 pdf 只显示第一行记录

它应该显示第二行记录

这是我的pdf文件上的结果

我被困在这里,如果你知道一些事情,我真的很感激你可以在这里分享解决方案

标签: pythonmysqlsqlpython-2.7reportlab

解决方案


for row in result:
  c = canvas.Canvas("Sampelone.pdf")
  c.drawString(250, 700, str(row[0]))
  c.save()

您的代码片段正在做的是,创建一个新文件并将变量的内容写入rowpdf 文件并c.save保存。在下一次迭代中,这个相同的文件被重新创建,它是空白的,原始文件被这个空白文件覆盖,并且row打印的内容这就是为什么你总是会在其中看到第一行记录的原因。
这应该可以正常工作。根据您的使用和文档高度增加或减少 y 的值。

c = canvas.Canvas("Sampelone.pdf") #creates a pdf
for row in result:   
  c.drawString(250, y, str(row[0])) #writes data at given co-ordinates
c.save() #saves the pdf

这样您就可以看到 pdf 中的所有行记录。

但是这种做法并不被认为是好的,你应该总是把你的数据放在这样的流动中。.

from reportlab.lib import styles
from reportlab.platypus import SimpleDocTemplate, Paragraph


def nilaisql():
    pdfname = 'mydoc.pdf'
    doc = SimpleDocTemplate(
        pdfname
    )
    style = styles["Normal"]
    story = []


    rpt = raw_input("input NPM : ")
    sql = "select nama, tanggal, jamMasuk from t_" + rpt
    curs.execute(sql)
    result = curs.fetchall()

    for row in result:
        story.append(Paragraph(row, style))

    doc.build(
        story
    )

    os.system("Sampelone.pdf")

在reportlab-userguide中阅读有关flowables 的更多信息


推荐阅读