最近项目上需要把表格文件(xls、xlsx、csv等格式)转换成PDF,在网上找了很多工具,都不是很理想,例如下图是使用smallpdf工具转换的效果:
它虽然转换了,内容也都在,但是样式不好看,没表格效果不说,并且表格列数多的时候,它会把其他几列放在后面几页进行显示,这展示的效果就很不好了,然后又找了其他的一些转换工具,效果都大差不差,没办法,只能自己造轮子。好在使用reportlab 这种Python库对文件的转换支持的很好,最后没费太多功夫做了个转换工具出来,效果如下:
转换Excel为PDF后的效果如下:
这效果就很舒服了,基本和Excel展示效果差不多。
代码核心部分如下:
# 处理Excel文件
if csv_path.endswith(".xls") or csv_path.endswith(".xlsx"):
df = pd.read_excel(csv_path, engine='openpyxl')
else:
# 处理CSV文件
df = pd.read_csv(csv_path)
styles = getSampleStyleSheet()
style_normal = styles["Normal"]
data = [df.columns.tolist()]
for row in df.values:
wrapped_row = [Paragraph(str(cell), style_normal) for cell in row]
data.append(wrapped_row)
# 创建PDF文档
doc = SimpleDocTemplate(pdf_path, pagesize=landscape(letter))
# 配置表格样式
table_style = TableStyle([
('BACKGROUND', (0,0), (-1,0), colors.HexColor(header_color)),
('TEXTCOLOR', (0,0), (-1,0), colors.whitesmoke),
('ALIGN', (0,0), (-1,-1), 'CENTER'),
('FONTNAME', (0,0), (-1,0), header_font),
('FONTSIZE', (0,0), (-1,0), header_size),
('BOTTOMPADDING', (0,0), (-1,0), 10),
('BACKGROUND', (0,1), (-1,-1), colors.beige),
('GRID', (0,0), (-1,-1), 0.5, colors.black)
])
...
列宽可以根据需要调整,我默认给的80,高度我是设置的自适应,主要是为了展示完整。
小工具已打包,有需要的文章上方自取。
注:打开会有点慢(大约8秒),主要是在搜索系统的可用字体。