问题描述
我一直在尝试包装单元格字符串,表格变得太宽且超出屏幕。
我知道使用段落会自动换行,但是问题是我要从多个视图发送数据,因此表的宽度和列数会有所不同。我遇到类似“列表”对象没有属性“ split”,“元组”对象没有属性“ split”甚至“段落”对象不可迭代的错误。
class ComprasPDF(View):
def get(self,request,*args,**kwargs):
arr= [(
o.unidad_inventario.control_stock.almacen,o.unidad_inventario.control_stock.producto,o.proveedor,o.cantidad,o.costo_unidad,)
for o in CompraProducto.objects.all()]
data = {
'nombre':'COMPRAS','headings':('ALMACEN','PRODUCTO','PROVEEDOR','CANTIDAD','COSTO POR UNIDAD'),'query': arr
}
pdf = generar_pdf(request,data)
return HttpResponse(pdf,content_type='application/pdf')
像这样在ReportLab上使用它。如您所见,我使用的是我直接发送的数据,而且我不知道如何将段落样式应用于查询数据。
buff = BytesIO()
doc = SimpleDocTemplate(buff,pagesize=A4)
story = []
headings = data['headings']
alldata = data['query']
t = Table([headings] + alldata*10)
t.setStyle(TableStyle(
[
('GRID',(0,0),(-1,-1),1,colors.black),('BACKGROUND',colors.gray)
]
))
story = [Spacer(0,25),t]
doc.build(story,onFirstPage=primera_pagina,onLaterPages=add_numero,)
该表看起来像this。甚至没有分配colWidths使它们自动换行,它们只是重叠。
我需要将数据包装成多行,以便表格适合页面。
编辑:
我找到了一种将数据放入段落的方法。这不完全是我想要的方式,但总比没有好。
def compras_pdf(data):
headings = data['headings']
tdata = []
tdata.append(headings)
for o in data['query']:
talmacen = Paragraph(o.unidad_inventario.control_stock.almacen.nombre,styleN)
tproducto = Paragraph(o.unidad_inventario.control_stock.producto.descripcion)
if o.unidad_inventario.lote_produccion:
tcodigo = Paragraph(o.unidad_inventario.lote_produccion.codigo)
else:
tcodigo = '-'
tproveedor = Paragraph(o.proveedor.__str__())
tcantidad = Paragraph(str(o.cantidad))
tcosto = Paragraph(str(o.costo_unidad))
tfecha = Paragraph(o.fecha_creacion.strftime('%d/%m/%Y %X'))
tdata.append([talmacen,tproducto,tcodigo,tproveedor,tcantidad,tcosto,tfecha])
t = Table(tdata,colWidths=(1.9*inch,1.2*inch,0.7*inch,1.5*inch,0.9*inch,0.8*inch,1*inch))
return t
为每个视图创建自定义功能。 This is the result.
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)