помощь в pythone

misha43432

Знающий
Дней с нами
3.767
Розыгрыши
0
Сообщения
94
Репутация
4
Реакции
63
Всем привет, возник вопросик по созданию PDF из таблицы excel в питоне, библиотека fpdf.

Есть 7 столбцов из excel и теперь нужно загрузить их в лист pdf, но когда делаю команду pdf.multi_cell то следующий столбец вставляется после предыдущего и никак не хочет рядом, пробовал задание координат x и y, безуспешно, он просто меняет их на том листе, на котором конец другого столбца.

вывод делал через массив

from fpdf import FPDF
from PyPDF2 import PdfFileMerger, PdfMerger, PdfFileReader, PdfWriter, PdfReader

import pandas as pd


pd.set_option('display.max_colwidth', None)
pdf = FPDF(orientation='L', unit='mm', format='A4') # создание листа
pdf.add_font("Sans", style="", fname="Roboto-Medium.ttf", uni=True) # добавление шрифта sans
pdf.add_font("Sans2", style="", fname="Roboto-Regular.ttf", uni=True) # добавление шрифта regular


pdf.add_page() # добавление страницы
pdf.set_font("Sans", size=12) # размер шрифта
pdf.cell(200, 10, txt="привет", ln=1, align="C") # сам текст

pdf.add_page() # добавить страницу
path = 'F:/test/0004.png' # путь к картинке
pdf.image(path, x = 25, y = 25, w = 250, h = 0) # вставка картинки и координаты

pdf.add_page() # добавить страницу


df = pd.read_excel('F:/test/0018.xlsx') # добавить таблицу

# df = df.groupby("ADSK_Наименование").agg({"Длина":'sum',
# "ADSK_Единица измерения":'first',
# "ADSK_Завод-изготовитель":'first',
# "ADSK_Количество":'sum',
# "Шифр РД":'first',
# }).reset_index()
# df.drop(columns = ['Id', 'ADSK_Обозначение', 'ADSK_Единица измерения',
# 'ADSK_Завод-изготовитель',
# 'ADSK_Количество',
# 'Шифр РД',
# 'BD_Помещение',
# 'Длина',
# 'Файл источника'], axis = 1, inplace=True) # удалить столбцы


df.sort_values(by = 'Шифр РД', ascending=False) # сортировка по ШИФР рд

# text = df.to_string() # перевод в текст
# text_experssion = text # перевод в текст

a1 = df['ADSK_Наименование']
a2 = df['ADSK_Обозначение']
a3 = df['ADSK_Единица измерения']
a4 = df['ADSK_Завод-изготовитель']
a5 = df['ADSK_Количество']
a6 = df['Шифр РД']
a7 = df['Длина']

text = a1.to_string() # перевод в текст
text1 = a2.to_string() # перевод в текст
text2 = a3.to_string() # перевод в текст
text3 = a4.to_string() # перевод в текст
text4 = a5.to_string() # перевод в текст
text5 = a6.to_string() # перевод в текст
text6 = a7.to_string() # перевод в текст

while text.find(' ') != -1:
text = text.replace(' ', ' ')
text1 = text1.replace(' ', ' ')
text2 = text2.replace(' ', ' ')
text3 = text3.replace(' ', ' ')
text4 = text4.replace(' ', ' ')
text5 = text5.replace(' ', ' ')
text6 = text6.replace(' ', ' ')


# from fpdf.enums import XPos, YPos

pdf.set_font("Sans2", size = 8) # размер шрифта

#pdf.multi_cell(40, 4, text, border = 1, align = 'L')



for row in text, text2, text3, text4, text5, text6:
pdf.multi_cell(ln = 1,w = 40, h = 4, txt=row, border=1)

#pdf.set_xy(col_x, col_y)
#pdf.multi_cell(col_witdh, col_hight, text2, border = 1)


pdf.output("simple_demo.pdf") # печать

for row in text, text2, text3, text4, text5, text6:
pdf.multi_cell(ln = 1,w = 40, h = 4, txt=row, border=1)
1675948478800.png
 
Функция multi_cell, если верить докам, просто позволяет печатать с переносовм строк. Тебе же нужно горизонтально ячейки рисовать.
Я до конца не вник в то, как работает эта библиотека (не имел с ней дела), но похоже, тебе надо использовать ф-цию cell.

Вот например тут - http://www.fpdf.org/en/tutorial/tuto5.htm - (а можно тут вообще ссылки постить?) есть пример (на SO тоже есть, только на пхп).

Тебе нужно пройтись по всем строкам и разбить их на столбцы. Вот пример, как это делается (пример я скопировал с той страницы, и он на PHP, но суть, я думаю, та же)


foreach($header as $col)
fpdf.cell(40,7,$col,1);
fpdf.ln();

foreach($data as $row)
{
foreach($row as $col)
fpdf.cell(40,6,$col,1);
fpdf.ln();
}

тут headers = это массив строк: ['country', 'Capital', 'Area']
а data - массив массивов, получается:
[
['India', 'Delhi', 42.7],
['Spain', 'Madrid', 604.3]
]

Если есть вопросы - пиши.