2017-06-03 97 views
0

我试图从Excel中可用的数据创建发票。目前,我已经加载CSV数据并转换同样为大熊猫数据帧,并尝试使用ReportLab的从下面的代码放入PDF:使用reportlab生成发票

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,但是,我无法执行以下操作:

  1. 当前客户名称显示正常。我希望它是大胆的。我怎样才能使它大胆?

  2. 地址在Customer Name后面。但是,我想要将地址打印在同一行上,但朝右侧打印。我怎样才能做到这一点?

  3. 在表格中,我希望我的顶部行和底部行变成粗体,顶部行应该填充一些颜色。

请让我知道如何解决这3个问题。

回答

0

作为一个算法逻辑我建议:

  1. 做一个 “的.docx” 文件名为 “invoicetemplate.docx”。你应该重新设计该模板,但是你想,也包括像{ExcelColum1}和{} ExcelColum2
  2. 每个字段占位符解析Excel工作表中的数据,并为每一行,打开“invoicetemplate.docx”和查找和替换占位符对应于excel中那20列的名称。例如找到模板字符串{} InvoiceValue1和列InvoiceValue1与Excel值替换
  3. 使用完excel的相应值替换占位符之后,将文档保存为PDF文件使用新名称。

有许多python库和方法可以做到这一点,取决于你自己最喜欢的。祝你好运。

+0

Hi Gherta,谢谢你的回复。你可以让我知道这样的图书馆,因为我不知道任何。 –

0

下午好帕

因此,用于填充发票模板我个人使用下面的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) 

你必须收集所有的Excel行值在字典中有20个按键和值,其中密钥将是发票占位符,字典值将是要在单词模板中替换的值。

+0

要安装pywin32 MKE一定要打开命令行,然后运行“PIP安装https://pypi.python.org/packages/bb/5b/2f6207cab31f707fc4a8d33e3d6b14daa8750ecabf658127e31d16cdd06b/pypiwin32-220-cp36-none-win32.whl#md5=2f8467256cf3dc4a295ad9cef15bbde7” –