From bdbb616f2c89b5d140186f7df7321d3d8f6f5796 Mon Sep 17 00:00:00 2001 From: dengjinlai <936887607@qq.com> Date: Thu, 1 Aug 2024 17:06:39 +0800 Subject: [PATCH] =?UTF-8?q?jinja2=E6=A8=A1=E6=9D=BF=E7=94=9F=E6=88=90excel?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.py | 4 +- excel_generation.py | 54 ++++++ input/excel_base_template.html | 27 +++ input/excel_template.html | 28 ++++ output/excel_generated_report.html | 190 ++++++++++++++++++++++ output/excel_generated_report.xlsx | Bin 0 -> 6212 bytes output/generated_report.docx | Bin 47991 -> 47991 bytes output/generated_report.pdf | Bin 69839 -> 69839 bytes process/inference.py | 12 +- excel_temp.py => test_files/excel_temp.py | 0 10 files changed, 313 insertions(+), 2 deletions(-) create mode 100644 excel_generation.py create mode 100644 input/excel_base_template.html create mode 100644 input/excel_template.html create mode 100644 output/excel_generated_report.html create mode 100644 output/excel_generated_report.xlsx rename excel_temp.py => test_files/excel_temp.py (100%) diff --git a/config.py b/config.py index 121ca86..99afedf 100644 --- a/config.py +++ b/config.py @@ -7,11 +7,13 @@ template_dir = os.path.join(BASE_DIR, 'input') output_dir = os.path.join(BASE_DIR, 'output') os.makedirs(output_dir, exist_ok=True) output_html_path = os.path.join(output_dir, 'generated_report.html') +output_excel_html_path = os.path.join(output_dir, 'excel_generated_report.html') output_pdf_path = os.path.join(output_dir, 'generated_report.pdf') output_docx_path = os.path.join(output_dir, 'generated_report.docx') +output_excel_path = os.path.join(output_dir, 'excel_generated_report.xlsx') -report_html_path = os.path.join(template_dir, 'report_template.html') +report_html_path = os.path.join(template_dir, 'report_template.html') image_path = os.path.join(template_dir, 'image.png') \ No newline at end of file diff --git a/excel_generation.py b/excel_generation.py new file mode 100644 index 0000000..86adf47 --- /dev/null +++ b/excel_generation.py @@ -0,0 +1,54 @@ +from jinja2 import Environment, FileSystemLoader +import config +from process.inference import html2excel_pandas + + +def render_html(template, output_file_path): + sheets_data = [ + { + 'name': 'Personal Info', + 'columns': ['Name', 'Age', 'Occupation'], + 'data': [ + ['Alice', 30, 'Engineer'], + ['Bob', 25, 'Data Scientist'], + ['Charlie', 35, 'Teacher'] + ] + }, + { + 'name': 'Scores', + 'columns': ['Name', 'Math', 'Science', 'English'], + 'data': [ + ['Alice', 85, 92, 88], + ['Bob', 78, 81, 86], + ['Charlie', 93, 89, 91] + ] + }, + { + 'name': 'Attendance', + 'columns': ['Name', 'January', 'February', 'March'], + 'data': [ + ['Alice', 'Present', 'Absent', 'Present'], + ['Bob', 'Absent', 'Present', 'Present'], + ['Charlie', 'Present', 'Present', 'Present'] + ] + } +] + + + # 渲染模板 + html_content = template.render(sheets=sheets_data) + with open(output_file_path, 'w', encoding='utf-8') as f: + f.write(html_content) + + + +def main(): + env = Environment(loader=FileSystemLoader(config.template_dir)) + template = env.get_template("excel_template.html") + + render_html(template, config.output_excel_html_path) + html2excel_pandas(config.output_excel_html_path, config.output_excel_path) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/input/excel_base_template.html b/input/excel_base_template.html new file mode 100644 index 0000000..0a42e6d --- /dev/null +++ b/input/excel_base_template.html @@ -0,0 +1,27 @@ + + + + + + {% block title %}Base Template{% endblock %} + + + + {% block content %}{% endblock %} + + diff --git a/input/excel_template.html b/input/excel_template.html new file mode 100644 index 0000000..c25e069 --- /dev/null +++ b/input/excel_template.html @@ -0,0 +1,28 @@ +{% extends "excel_base_template.html" %} + +{% block title %}Excel Report{% endblock %} + +{% block content %} +

Excel Report

+{% for sheet in sheets %} +

{{ sheet.name }}

+ + + + {% for column in sheet.columns %} + + {% endfor %} + + + + {% for row in sheet.data %} + + {% for cell in row %} + + {% endfor %} + + {% endfor %} + +
{{ column }}
{{ cell }}
+{% endfor %} +{% endblock %} diff --git a/output/excel_generated_report.html b/output/excel_generated_report.html new file mode 100644 index 0000000..c72f958 --- /dev/null +++ b/output/excel_generated_report.html @@ -0,0 +1,190 @@ + + + + + + Excel Report + + + + +

Excel Report

+ +

Personal Info

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAgeOccupation
Alice30Engineer
Bob25Data Scientist
Charlie35Teacher
+ +

Scores

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameMathScienceEnglish
Alice859288
Bob788186
Charlie938991
+ +

Attendance

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameJanuaryFebruaryMarch
AlicePresentAbsentPresent
BobAbsentPresentPresent
CharliePresentPresentPresent
+ + + + \ No newline at end of file diff --git a/output/excel_generated_report.xlsx b/output/excel_generated_report.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..94c47568a6ae237c7fc519aff21edc805d160623 GIT binary patch literal 6212 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 Cipl8! literal 0 HcmV?d00001 diff --git a/output/generated_report.docx b/output/generated_report.docx index ede49da6484161dff05ff2321bce5d18a6457a96..cd8928f0cd4ac653d1705da82d9b77836d06d4ae 100644 GIT binary patch delta 318 zcmezVjp_S0CcXe~W)=|!1_lm>;&#T!jePSNSwM`<8yR_^tbG_z8U1k jX$4`d+UW{me1=Jx?Se{`?1C!ZzRMD#<_k>9Xtyf>o+xm# delta 318 zcmezVjp_S0CcXe~W)=|!1_llWKj;4u8~NrlvVa(yH!|`-SqGT{xgla=d_7RHW&Deo zAY#5kyilmmgI!6 zmToD7%F1tZf*O*#-4-l4dD(VT2;=^CYY0PbhZ}^Eu>&fye1{!GC_zaUW+Xa;>*#%X+eU~Lf%@>%I(Qa1&Suuk$ diff --git a/output/generated_report.pdf b/output/generated_report.pdf index 254563eabd08cfa6bb6100d4b09a186279d0d5c4..91ae754cbec03729a6619c398fc3c35b768c2999 100644 GIT binary patch delta 430 zcmZXPy-Nc@5XBixa`}|Q2)0)xRlPF$MjwMx`EB%1wI5Wu0%Gb zn&s|U)M87_AU@~yeoaVs6)v#ptEZD`zuxdUnsNv|T*sG<%%;Eb$ znZ-PmaBaAOw}T9>2LW1#+(lv8)I(?&?b=?vqP$C+YU r#hE0;i!;TAJHuT4c((D!94T;p1>V?yz4N_6xn^qLG4I)Tpn{&bw}lL6KIoh;Adr z#*}mVh%jEferb8=bAPY1Qxc&F0=kdelXi#pljh}!0nlqwPhlP&3v@a#&a1#Oy$#mM zMn`m$DJG2JmfkarmkxXA+21t`(YPvuHZ3IE?v6o|E|Lv5nuB`$nYdZ^R0cy2gGRbi zfif^9tv0UZ!86k~&@ydQ;RL$U=achy{nB?(h)PT`gX1s$_W~}0JVV4V&jN0ynG`<` c^(WRws=P!SE%Op>HFs+@sLx354r;LZ1;JWw6#xJL diff --git a/process/inference.py b/process/inference.py index 20945d9..d91441a 100644 --- a/process/inference.py +++ b/process/inference.py @@ -2,6 +2,7 @@ import aspose.words as aw import pdfkit from docx import Document from docx.oxml.ns import qn +import pandas as pd # from docx.oxml import OxmlElement @@ -69,9 +70,18 @@ def html2pdf_pdfkit(html_path, pdf_path): print("pdf报告生成成功!") +def html2excel_pandas(html_path, excel_path): + # 将HTML文件转换为EXCEL + tables = pd.read_html(html_path) + # 创建一个Excel工作簿 + with pd.ExcelWriter(excel_path) as writer: + # 写入到Excel的不同工作表中 + for i, df in enumerate(tables): + sheet_name = f'Sheet{i+1}' + df.to_excel(writer, sheet_name=sheet_name, index=False) - + print("excel文件生成成功!") diff --git a/excel_temp.py b/test_files/excel_temp.py similarity index 100% rename from excel_temp.py rename to test_files/excel_temp.py