使用 reportlab 生成发票
Generating Invoices using reportlab
我正在尝试根据 Excel 中可用的数据创建发票。目前,我已经将数据加载到 CSV 中并将其转换为 pandas 数据框,并尝试使用 Reportlab 从以下代码中将其放入 pdf 中:
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph
from reportlab.lib import colors
doc = SimpleDocTemplate("form_letter.pdf",pagesize=A4,
rightMargin=72,leftMargin=72,
topMargin=72,bottomMargin=18)
Story=[]
logo = "company_logo.jpg"
limitedDate = "03/05/2010"
formatted_time = time.ctime()
full_name = "Infosys"
address_parts = ["411 State St.", "Marshalltown, IA 50158"]
im = Image(logo, 2*inch, 1*inch,hAlign='LEFT')
Story.append(im)
Story.append(Spacer(1, 12))
styles=getSampleStyleSheet()
styles.add(ParagraphStyle(name='Justify', alignment=TA_JUSTIFY))
styles.add(ParagraphStyle(name='RIGHT', alignment=TA_RIGHT))
ptext = '<font size=12>%s</font>' % formatted_time
Story.append(Paragraph(ptext, styles["Normal"]))
Story.append(Spacer(1, 12))
# Create return address
ptext = '<font size=12> Customer Name: </font>'
Story.append(Paragraph(ptext, styles["Normal"]))
ptext = '<font size=12>%s</font>' % full_name
Story.append(Paragraph(ptext, styles["Normal"]))
Story.append(Spacer(1,12))
for part in address_parts:
ptext = '<font size=12>%s</font>' % part.strip()
Story.append(Paragraph(ptext, styles["RIGHT"]))
Story.append(Spacer(1, 12))
ptext = '<font size=12>Dear %s:</font>' % full_name.split()[0].strip()
Story.append(Paragraph(ptext, styles["Normal"]))
Story.append(Spacer(1, 12))
ptext = '<font size=12>We would like to welcome you to our subscriber base
for Magazine! \
You will receive issues at the excellent introductory price of . Please
respond by\
to start receiving your subscription and get the following: .</font>'
Story.append(Paragraph(ptext, styles["Justify"]))
Story.append(Spacer(1, 12))
data = [[random.random() for i in range(1,4)] for j in range (1,8)]
df = pd.DataFrame (data)
lista = [df.columns[:,].values.astype(str).tolist()] + df.values.tolist()
t_style = TableStyle([('ALIGN',(1,1),(-2,-2),'RIGHT'),
('TEXTCOLOR',(1,1),(-2,-2),colors.red),
('VALIGN',(0,0),(0,-1),'TOP'),
('TEXTCOLOR',(0,0),(0,-1),colors.blue),
('ALIGN',(0,-1),(-1,-1),'CENTER'),
('VALIGN',(0,-1),(-1,-1),'MIDDLE'),
('TEXTCOLOR',(0,-1),(-1,-1),colors.green),
('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
('BOX', (0,0), (-1,-1), 0.25, colors.black),
])
s = getSampleStyleSheet()
s = s["BodyText"]
s.wordWrap = 'CJK'
t=Table(lista)
t.setStyle(t_style)
Story.append(t)
Story.append(Spacer(1, 12))
ptext = '<font size=12>Thank you very much and we look forward to serving you.</font>'
Story.append(Paragraph(ptext, styles["Justify"]))
Story.append(Spacer(1, 12))
ptext = '<font size=12>Sincerely,</font>'
Story.append(Paragraph(ptext, styles["Normal"]))
Story.append(Spacer(1, 48))
ptext = '<font size=12>Ima Sucker</font>'
Story.append(Paragraph(ptext, styles["Normal"]))
Story.append(Spacer(1, 12))
doc.build(Story)
我已成功创建 PDF,但是我无法执行以下操作:
目前客户名称显示正常。我希望它大胆。我怎样才能把它加粗?
地址在客户名称之后的行中。但是,我希望地址打印在同一行但向右。我怎样才能做到这一点?
在 table 中,我希望我的顶部行和底部行变为粗体并且顶部行应该填充一些颜色。
请告诉我如何解决这 3 个问题。
作为算法逻辑我建议:
- 制作一个名为 "invoicetemplate.docx" 的“.docx”文件。您应该根据需要重新设计该模板,并且还包括每个字段的占位符,例如 {ExcelColum1} 和 {ExcelColum2}
- 使用数据解析 excel 工作表,对于每一行,打开 "invoicetemplate.docx" 并查找并替换与 excel 中那 20 列的名称相对应的占位符。例如,在模板字符串 {InvoiceValue1} 中查找并替换为列 InvoiceValue1
中的 excel 值
- 用 excel 对应的值替换完占位符后,将文档另存为 pdf 并使用新名称。
有许多 python 库和方法可以做到这一点,这取决于您最喜欢的那个。祝你好运。
帕万下午好
因此,为了填充发票模板,我个人会使用以下 python 代码
#FUNCTION DEFINITION
def saveInvoice(templateName, saveWithName, valuesDictionary):
import win32com.client as win32
word = win32.gencache.EnsureDispatch('Word.Application')
word.Visible = False
myTemplate = word.Documents.Open(templateName)
for key in valuesDictionary:
find = word.Selection.Find
find.Text = key
find.Replacement.Text = valuesDictionary[key]
find.Execute(Replace=2,Forward=True)
myTemplate.SaveAs(saveWithName, FileFormat=17)
myTemplate.Close(False)
word.Quit()
#MAIN PROGRAM
templateName = 'C:\Users\Grossman\workspace\Invoicetemplate\invoiceTemplate.docx'
saveWithName= 'C:\Users\Grossman\workspace\Invoicetemplate\Modified1.pdf'
valuesDictionary = {'{PlaceHolder1}' : 'value1', '{PlaceHolder2}' : 'value2', '{PlaceHolder3}' : 'value3'}
saveInvoice(templateName, saveWithName, valuesDictionary)
您必须在包含 20 个键和值的字典中收集所有 excel 行值,其中键将是发票占位符,字典值将是单词模板中要替换的值。
我正在尝试根据 Excel 中可用的数据创建发票。目前,我已经将数据加载到 CSV 中并将其转换为 pandas 数据框,并尝试使用 Reportlab 从以下代码中将其放入 pdf 中:
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph
from reportlab.lib import colors
doc = SimpleDocTemplate("form_letter.pdf",pagesize=A4,
rightMargin=72,leftMargin=72,
topMargin=72,bottomMargin=18)
Story=[]
logo = "company_logo.jpg"
limitedDate = "03/05/2010"
formatted_time = time.ctime()
full_name = "Infosys"
address_parts = ["411 State St.", "Marshalltown, IA 50158"]
im = Image(logo, 2*inch, 1*inch,hAlign='LEFT')
Story.append(im)
Story.append(Spacer(1, 12))
styles=getSampleStyleSheet()
styles.add(ParagraphStyle(name='Justify', alignment=TA_JUSTIFY))
styles.add(ParagraphStyle(name='RIGHT', alignment=TA_RIGHT))
ptext = '<font size=12>%s</font>' % formatted_time
Story.append(Paragraph(ptext, styles["Normal"]))
Story.append(Spacer(1, 12))
# Create return address
ptext = '<font size=12> Customer Name: </font>'
Story.append(Paragraph(ptext, styles["Normal"]))
ptext = '<font size=12>%s</font>' % full_name
Story.append(Paragraph(ptext, styles["Normal"]))
Story.append(Spacer(1,12))
for part in address_parts:
ptext = '<font size=12>%s</font>' % part.strip()
Story.append(Paragraph(ptext, styles["RIGHT"]))
Story.append(Spacer(1, 12))
ptext = '<font size=12>Dear %s:</font>' % full_name.split()[0].strip()
Story.append(Paragraph(ptext, styles["Normal"]))
Story.append(Spacer(1, 12))
ptext = '<font size=12>We would like to welcome you to our subscriber base
for Magazine! \
You will receive issues at the excellent introductory price of . Please
respond by\
to start receiving your subscription and get the following: .</font>'
Story.append(Paragraph(ptext, styles["Justify"]))
Story.append(Spacer(1, 12))
data = [[random.random() for i in range(1,4)] for j in range (1,8)]
df = pd.DataFrame (data)
lista = [df.columns[:,].values.astype(str).tolist()] + df.values.tolist()
t_style = TableStyle([('ALIGN',(1,1),(-2,-2),'RIGHT'),
('TEXTCOLOR',(1,1),(-2,-2),colors.red),
('VALIGN',(0,0),(0,-1),'TOP'),
('TEXTCOLOR',(0,0),(0,-1),colors.blue),
('ALIGN',(0,-1),(-1,-1),'CENTER'),
('VALIGN',(0,-1),(-1,-1),'MIDDLE'),
('TEXTCOLOR',(0,-1),(-1,-1),colors.green),
('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
('BOX', (0,0), (-1,-1), 0.25, colors.black),
])
s = getSampleStyleSheet()
s = s["BodyText"]
s.wordWrap = 'CJK'
t=Table(lista)
t.setStyle(t_style)
Story.append(t)
Story.append(Spacer(1, 12))
ptext = '<font size=12>Thank you very much and we look forward to serving you.</font>'
Story.append(Paragraph(ptext, styles["Justify"]))
Story.append(Spacer(1, 12))
ptext = '<font size=12>Sincerely,</font>'
Story.append(Paragraph(ptext, styles["Normal"]))
Story.append(Spacer(1, 48))
ptext = '<font size=12>Ima Sucker</font>'
Story.append(Paragraph(ptext, styles["Normal"]))
Story.append(Spacer(1, 12))
doc.build(Story)
我已成功创建 PDF,但是我无法执行以下操作:
目前客户名称显示正常。我希望它大胆。我怎样才能把它加粗?
地址在客户名称之后的行中。但是,我希望地址打印在同一行但向右。我怎样才能做到这一点?
在 table 中,我希望我的顶部行和底部行变为粗体并且顶部行应该填充一些颜色。
请告诉我如何解决这 3 个问题。
作为算法逻辑我建议:
- 制作一个名为 "invoicetemplate.docx" 的“.docx”文件。您应该根据需要重新设计该模板,并且还包括每个字段的占位符,例如 {ExcelColum1} 和 {ExcelColum2}
- 使用数据解析 excel 工作表,对于每一行,打开 "invoicetemplate.docx" 并查找并替换与 excel 中那 20 列的名称相对应的占位符。例如,在模板字符串 {InvoiceValue1} 中查找并替换为列 InvoiceValue1 中的 excel 值
- 用 excel 对应的值替换完占位符后,将文档另存为 pdf 并使用新名称。
有许多 python 库和方法可以做到这一点,这取决于您最喜欢的那个。祝你好运。
帕万下午好
因此,为了填充发票模板,我个人会使用以下 python 代码
#FUNCTION DEFINITION
def saveInvoice(templateName, saveWithName, valuesDictionary):
import win32com.client as win32
word = win32.gencache.EnsureDispatch('Word.Application')
word.Visible = False
myTemplate = word.Documents.Open(templateName)
for key in valuesDictionary:
find = word.Selection.Find
find.Text = key
find.Replacement.Text = valuesDictionary[key]
find.Execute(Replace=2,Forward=True)
myTemplate.SaveAs(saveWithName, FileFormat=17)
myTemplate.Close(False)
word.Quit()
#MAIN PROGRAM
templateName = 'C:\Users\Grossman\workspace\Invoicetemplate\invoiceTemplate.docx'
saveWithName= 'C:\Users\Grossman\workspace\Invoicetemplate\Modified1.pdf'
valuesDictionary = {'{PlaceHolder1}' : 'value1', '{PlaceHolder2}' : 'value2', '{PlaceHolder3}' : 'value3'}
saveInvoice(templateName, saveWithName, valuesDictionary)
您必须在包含 20 个键和值的字典中收集所有 excel 行值,其中键将是发票占位符,字典值将是单词模板中要替换的值。