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 %}
+ | {{ column }} |
+ {% endfor %}
+
+
+
+ {% for row in sheet.data %}
+
+ {% for cell in row %}
+ | {{ cell }} |
+ {% endfor %}
+
+ {% endfor %}
+
+
+{% 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
+
+
+
+
+ | Name |
+
+ Age |
+
+ Occupation |
+
+
+
+
+
+
+
+ | Alice |
+
+ 30 |
+
+ Engineer |
+
+
+
+
+
+ | Bob |
+
+ 25 |
+
+ Data Scientist |
+
+
+
+
+
+ | Charlie |
+
+ 35 |
+
+ Teacher |
+
+
+
+
+
+
+Scores
+
+
+
+
+ | Name |
+
+ Math |
+
+ Science |
+
+ English |
+
+
+
+
+
+
+
+ | Alice |
+
+ 85 |
+
+ 92 |
+
+ 88 |
+
+
+
+
+
+ | Bob |
+
+ 78 |
+
+ 81 |
+
+ 86 |
+
+
+
+
+
+ | Charlie |
+
+ 93 |
+
+ 89 |
+
+ 91 |
+
+
+
+
+
+
+Attendance
+
+
+
+
+ | Name |
+
+ January |
+
+ February |
+
+ March |
+
+
+
+
+
+
+
+ | Alice |
+
+ Present |
+
+ Absent |
+
+ Present |
+
+
+
+
+
+ | Bob |
+
+ Absent |
+
+ Present |
+
+ Present |
+
+
+
+
+
+ | Charlie |
+
+ Present |
+
+ Present |
+
+ Present |
+
+
+
+
+
+
+
+
+
\ 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
zcmZ`-1yodP+Z`H)ZW%(QL>W4yQ@Xn)2N;?GDd|gx(jC%>qzz*sxGO&q`P7HJh>(|+v!y!B*~N{+
z+{K06%h5sQ*#Hog3r{AX=)=6V@1oSVz*41=u#YYrVDdpk;vLeJ_W0`w{oB9DSP)T38ub!c+Cs+M|g6m
z|8W4r+a-t{QxhTIKkO22$|15>%QpMbN?P7eg{~t7`(@2ixox
zYhe*d`(9?BIA$iB>pA8Z^|%>{B{``|s&?CeMaqwB4WWSd0)Bm@B=2W~qp_8|$Oa~j
z7mYw143ppBGjqBjP=~x*a#m)3kHNMQ!`d2#&Zc+ZE4O)0$p^G!Aq6O;dXmhI5%B#p
zhpx-%c`*oLU5J)D$cd9$|4zV=bIG!*VZ>+cj?Oka8*yFxo{>@cz~DZ=B#b77n(Bjgbmq6XXXtWCr`l3d2PDl2kLu;WV4!i(5Z1wSY
zx-!1FELKZx?8I+jBhxku7;B_9X74#S_AIiyV%Q76Wlt^qePv|#t6}#IDD%CmO8dff
z3R@}Jr41hv^4b-Nu{!{L7mvvgqi89Q@1H+O0)3)wo|81*)!!D3B);zMLZ5_=Ql;?9
z!m{Hq2mlW|N0illt0e297CRC~jpHT}_iNQb*crV+M{>b;yJoAdj#8WZ3VD38{e*_>
zlLDZxP)fF%GZBfGZfncAC5cliQbR6p!8m&t3`XYR_nd@DVL~)EQoe}ei{7W5^{?W@~}!v$86
z?8vds+u4FteR7o4TMN8peBiE0ujID9iYyUYQj)CgTZ+6COWA
z{&pxjj<}UBOh7SXE8kTg{VM12dxiG3-~sEa2LG@L9tZHV6S;9p#brX~67h9zUaW!)
z1Dtmux^}r`;k;s{blgCUy+%5*6(29)!<6o~>XpGyQNE8%KkRsQ8r&ur!0v}A+G#u#
z%^R(M$lzzwJ{D~>FY9E~c~QwVJ;lq;VyOok?CsI6O1%G3Ft=^<%2q6AZ|nRMV@Oqo
z0UHBFoKnymNydiD=>FXYoj7Y&Moc&Z+GCK1Q6xE1)K2SKM~cZ)D^-mw4I)O%>s5K~
zVqnCXi0LYP5SK@~9;WoIE~%xKSwQiy=7WnW-2k4jjYtA*o#zW$zKdfMk7b4;POVhw
z29Q(>nqyP;tdKxXT6`mLOf$~;{n>h#7wC)NC-g?YG(E@Fk0T=&tL+-q1v?@sv^^2~
z`FFST!qO1$rNh0Snx@$#cdPS~IXaXxf@SN?8m9KZWQ$g2Y%j3>s?tE+*VHlNGU`TS
zjm!5{j*(e&Sxq%IT^dPPnkk0VI#u2Gq;jO!6zqVek=nfKpNG`6>(C-}jP|Qr>_p+@
zs)%cYir!p2VpR%U5_!uc%3{U*11hbSRaS*g9f4LEo;s4$TW^=X_PDBQHIR7J5u$Q8
zHVeM=fpFOr?=P_7;ed@I3`oAHm~2g~W@c6T(0iPxdbXSGU%B+j5v~ZYnjV@+SNb2%
zEuA|h3d<{Jd3O<`xXYk2B-3D0P;xJ;ZzsfIlA;VI^*!1}4Yn$#2~0c3eYcO-c%OWz
zLQF6~2K-l;>f=!+60)djJdC@Pu%(@yL_5!zsdI3UV~94l)dXd~bY#0I4@~-_Hq$}n
zG&64K%opv!W>5>WnbLb7r);)+-)A0=i^3^IWe*C{7wO)FyJh+`bjXx{*Po<2<6aPS
znGu>td;FCYEM4f|?iUpmNc_s8rKw8oj44YP{&X+sPUhw0OyTj|BA)N~E5jlyR$_4_
zEZ^G+n3gd{hrFiG$t)_0Ybv^@x$wLL^$+m!tOXXrWimiK6Vc^@u|Q|Z35gZ)nQ?sE
zV|-qkc#Owf>2>@C%c?+;+3Owr>WYSU
zY#|VLH;$iQKf8!u(i|+4lPJ_wrT{AoHjw@~RBDZDZ7hab54d?Z%QEB2!p_U8jo%;CejQ0AgxOGzB{In;qg#za}Ha73FJOTG5&0VyLJ{Ge}
zv8Vf=6-b^6p7gS*3R){9T*S>s*ylI!ZTcQ-o>t}
z(brooM4#*IN)?6OKWm4sa{9$%S_Gl|Wf7mNletmWW2cy8Lg|M%kY;@;@ZDZUg06uQ
z?Zjf+v0`6gIWchhOB#EDK249Un^SJ)gU!I^U^q=&3J)`Nb1tgkvp|XsLJ7CWha9g>
zDql#h>;Wh3+6)KvA+_#?DwB46l@oGs!PeV%-p8q?D8>lI6>ns^=T+uFS^m;-KY$LV
z3qRSsFEMkR{klG4@^C;1Pf(zVXh_L^k7T$FFE{q^_Me_UcVg{tMS42y-#yL!V_xvn
zo^dMRB)TGBCM5SXfBM9)!CMfOHq)v9Gm~l`a?RUmJM|==0;L@lV
zOl3piJdKz7l$I1RL0ZJmCdvJ@gjJoOuQndf#13f3iUziq*Bt(21yf^Miel7otK(BB
zBxGp_uE5!pRJ6XXkXRF9)`AJ1F3Ln+2Qq7P0Y9Q#zpU$qz$+45ar$8usA%5GIVEbD
zp{)zXrvrI)*#f(&$A$rC%bpa8k(B7Dnup|R7c}PhQm0a?-6xIAP$M6Uhb`Ixj&FrI
zo?4q%blpQ#$0*1Lw0${&WUVB7m;)+z~>x|h#=<=>Mb51x^f`<7MbVN)^pDH((a
zeqQ%D8{0qgnLyg^loMrJpoj$4q()^L$${7Ee-aJ2?o}A?D
zj7;zDR^UEX=@{=^888l{UaMk9UORm}-9}t~PAF{Jf4pUrh|WavEJ^Ql^Jz|Vu45Jf
zg}5=6M4xFz%z(b!xHxS48v)$qVI9_zo?*0M9HHxg$@4oI8inMh>=dRA6rJPdI!>oFnWF>|k%Ix}ZI$e6uyjxBI^B*ZW9&m+{>W5><1;LMV?Jjd=A
z`jt}GX}d}ti>loUcV3oXVYi-BZHX1fQsYm?>loV`x$?F;
z0Vlht>mM2Mk3%+tnDF5iC2NBO3yW=T;(Yo*67MJvc}|zFP+CmOEmsELI$rbCd7P`V
z!xfeQa*(EKODxgB`3pl+-76yN)f0DFePaqS=}=;bx4{{G_4W{C_Kj-W0FD=xtC!~M
z97rqk5j0Roe=lP_i
z%bV$4jFdy0J__E+R)jrj*Im0qr%#)cyP1H7&b19^J_wT8@68v14&w9Y{UipW1j65E
zQNqw$=M9y5?ugKip=Er>`qR^k+v;*JkvkFvE&zc4tB||7dpkhfez$Ct`s^%un*F6u~{H1~7;qSJk9FsjG`?|QhvI@k#wF6s?R1z+vS~Z
z3?Y^!y6Y{mith{BA;_K7Aah~mS1GRO;-7Bp@soYlGj}~DQZ_`}9j^LShpe`-Q
z;?_8KuwUN?Z!C{AaG+($T^v=l3+!3Ru&Md`mEH4uaGn)G;6MN5+oeI@UrsUt7q@XM
z^)5RsV{7)w$6bIYi$wh9a^~5y1z4cv0k^UqkjlzlR}<^yGQ`Wfe;I3D;fW5US@OZX
zqXs)G9h|G;Yohr*TI2KP)9O|dzS~Jp)7!Wkrx#?H!t2sJM9rDHP4q6PhZaS0o!D&^
zOd=CY`IkoNJm#&;0>7Q^9U#Nz>fST;tiUefP8Qk+Xi=p4NkiY=bC|qy0yP@h3VIWk
z!3wHoU2(DBHHBPNQF2ceqUi_rv&z=2Ne9iOC)f~s9CWe$_*6**53Woq)}6*k_pfQx
zMg5$mN)tyD<+GD2`RMnW?iR3onJadWlYA1CK|B6@V^O(F&>+mD2v*?48B2x{x(M#J
z;YCD#TRx3F32$OD&?R$4ukpe(kiF|g4GrlBxV?x2AMCV;pJ@1as})Us51G0-oTNrI
z)3hODnG_k<$gl>O!XOTA9PB^t*$ItK$gN)@pldjX6KnWx1P^470{sj{H=pn$2}YDm
zc5Bsik!u_-mA9w}$t)dIVoRW~F8bxIDzws=uo^=bU7ttnHEL^00@62?~f_W!r9sWNBX`?SWtYgj@NBkl!aAoRD#yiL>(?f
zM63E%+f3C0ol2oPLSL>AGywdh>
zE-Tb7nlD8R1`|fv@$rM$rSaP)3qRTNs#M69P#m;OWsI7Cp#sY8JaP#24ADBRtcSun
z1C4lla~q?a(H_*S4S%8PH;&aNu?z4y46)hK&s33|Pcx2f?hq!j+>@S%$2t2@=XdyA
zlwmOHjm7hp$D#Jzu4$#{X6RjI7p`uVdoQ6hxGQlz{9>lo(JIQFQ}!_Ld3Gevd2DP;
zS#@9$2LT0*rx-~Z#c(Jn^94x>+wueY?jXj>ekTEnvLGE^>HEWFF}?vG67cn3QLV^SbS(E&|I;OcXNEoxTM
zSzIoNSlTqBcq97HEzhp>VhZkgBvA9I&)LGdTc}wm_};XjsXw;l=+gm(pA~Btr;5mF
z1*LeivWB!BIGG*e#XovloTvi&ez)wk1I)Mda$>1Xylq#vxCj&))w08Hx1
zi~SjC#g~dk49G}ZKu&=_1S2D9XD4@vle?+5w+qD023*TXo
zjgi>+;5~7CFq}6n#7=yRlqD7)Ajm2^@`*RytAo?ux$-L^x0b|^aS2g8t&)r2wylDx
z$s>y3N7m;N_vn>O{lwPhCSL^fe%)&cA1CmCL6fp!bNOj0@jBEGe64W1KHy`I5%!j|
zX`?^6DpkPpz-JR9KV^Z-o?~wZW-#XAu;LRHT8(56gt^e=M
z|69>-f^Qb0-(WgqmLkFbQkHJ=+)VG^JVeN7{fA^%SHeKb$3NODE}$RTX06D7JpBhF
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