From 503d7724b4ccf1228874e85167b489ccca6e3aa4 Mon Sep 17 00:00:00 2001 From: navry Date: Tue, 5 Aug 2025 12:21:05 +0200 Subject: [PATCH] pridane export body --- body_easy_exported.xlsx | Bin 0 -> 5127 bytes excel_labels.py | 14 +++++++ requirements.txt | 6 +++ templates/upload_form.html | 78 ++++++++++++++++++++++++++++--------- test.py | 76 +++++++++++++++++++++++++++--------- 5 files changed, 136 insertions(+), 38 deletions(-) create mode 100644 body_easy_exported.xlsx create mode 100644 excel_labels.py diff --git a/body_easy_exported.xlsx b/body_easy_exported.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..542c575ce8aec66127dcb70ce2562cbe5e33d252 GIT binary patch literal 5127 zcmZ`-2RNH;_m90tgi>3rs=Zp9(x7%xRIHZN7DQ{+ENa)Py?1NG-laxSLByUlYrKk@ ztyTYMukU@|`hQcsM#}qBKc5gh=rh+H{}Sr-U=-li!mK&ul>nJPWSlaSS@y*}|1~ z^7QOw$Q1~?!Bv+G-W6DJ6cy1|Trv`qs^n%VnPnuVT=U|TivX!hCh_83MCc)D^fFib zU}si%Z3IoUI)9jev<*A^3$t}3761VJw+WUoSLme;1+kjiokFA`7k#7Nn>Agj-KDSwFg4~;c zD!FXEMtUOokmi{5+})HT$~V4--a#Riyw0k9H+6-GkPUPZ@x$xj>+-sHNFwpS4&@Y) zK6}_1%&8%8F(t%JB5BpE<1=q4o7L!&M{mZ$lDYOpeN&VNQ5jQ)R^-;Fj!PE^@5!-W zgjC87{JfR@C<=tj#O@Rh-|K+w)O`_F5#DEB7Y*NNEC;UMT{19gP{mco~=*)oQ}rzNO;cMwA!)<=#c z-M0hkYCv$?=QA}aL0eiZ!9b%Z2T!ZmAip-1+my&evaLAHrZgE`zKzpCu*%xHgy;UY zz?1cm(1bk?iz&gG@#cEL&kKek9KgFm*NYI}J`fjZnAIBF0y-spK7pt@X9FV$)jg<@ z<0cCbdO`N_ziMXY41#POa_Cg7EPTxPY!rs{9~i^TS!=$qi2k5K>PJEIut0`)xf(-j z_KqDso=tz2gQ7O1m_!1cgcyui{RUx0D_X{(i~1d1AMC8<4eWc+!>ay)pL`PVn(iOv zjnEK^kV#8r7!5vuan!Yy71=lKCgw=Lu)OObQHLCkaAw3^c+i~Lk#XSAmVcM1CeL=r zYVv5hJht#%l%Dp;cc1yqG@EqdD2Vomz5CoqbXa%UkOx`ouJ)_W^04lbA-7FiF7ESk z`}~b-Hj2v2n_g5jwO(R?${-8Y=z_zP^%G6hEPr(*w?nz>_u)|1M8yn?aBy-XRmCAWxRgk9jA*EGsZG7VOuj)E3*aJ zHh*JAa73q;bpUx4<(^!>P48NJEuhZjZIFdARX5s0Yq$n@_NY`mUe2QT>p<+Y!SPsf zV4T?<%)5gTF~BzF5DB%^ty~u)-1AJc&in1_fyk%l4Za~`q7Hn~-&ICw)mA9DisUy$ z#0c_I9}&F|GO){f_exBzm|27vZ?}$US^qr29AAuhv{RDha z1v`xgvN^-`ci4Tb+eacGpOu{;U8m*3(-UF>H!Tfa2YP$-5%D~el35?Vp4-S}?rxn- zaReb!AMvwai%}1#zRS^Y7SZ?ZRu|E_6@-%rsXqd}6Hb+>$l$c0cc}Je;tQhjW`hi5 zWdo7pCdY?5mN8$e86Xi=s&`fYt1h9nmPU2A_(k+&n0 z$kY?Mm&>-D6OxSTRC?vqugHO5MqG4i}k9xt%fxAHOzwUTLSF*!48Dw43_ZeE*{*Vdv5VBX% zYA0JmqlNnUsH``O6sUELgi6&ifwoXBcmKLx>l*L&_`5Dnx6fdo+k?#2sh~);xW`Dzoe~ngTMQ1xM1|Nhqknri=H|#*GLPr1O6O#9P zq>Vf@gJp7(eqg?rAzEg`oK)1|6{L7!3&l+e9K74ftdMg>L+D|m1W)2!la)5M*E~WPbKDGfm7*4$0AB4qljU5#}vNE z&y14U9Fd7J#^RX?r_|lfThStxnf86KgA_+ zYs-3M{1pR>wu$~n+zW++u;is%WBWQpIeGGqBV?Nm!%c1Kaf>=(i4=FLXfuviI36Nv zufKzf9H@O;mU!z(m0IXIyw?cl6MYWV$QnhV0AW(0Z z-8rD>{b~=&6BQU&^5Z3`o+g?(9i)KnQcd)o6{mQ#OP@!tC4YIRm2{PRb<*Axxg5)c zi=CjF*iyFR%QU~Xj|O5O9xmNF%9*EDcYQz*#-4oXqCf`dqsjQTZK1Y%K|e5Ow}G<9SuUBkv^yUNsO2Q_1; z9SW-1LD{}JIfRs)zIi!>tenNe)DZx^Kq)Xg;7ztJnox(c_@NlKQJA^?O>C2}d5p9m zx^*o=hf@7Pr44SEu09`qij4m6`?g6P%rC!X*5q9M*6QgiK_k3gU6!efV*f{fiKpp> zT&xCQZWtmj9~r`hgpe&yUji>BTy2*y8ERJD-fP9P@au)u-_oaVHDLkBifqxIvcT;U zx#z%&{p9+M+mu+9q(BCvw*ixwCDi|Kxf#Y0KUU*o`lD~GaXX|K$gQUaOH_{XdgR+i zTJyDMBI5n1aozG$s2L=viXa)Kt!sCu0_pdiOaCX%p9CGo+f~-Z5LAU20KjncvcrM9 zc{)Jhm%YuL!A$s!5al_|GDUHGa%uyIXEB?O4YFff$^46v7H(5RRSU=Yi53x%WSbztDiuEiNKQyKm2au4Pb4d$Ur;9zt`fB$U3f{(xaE@tm_2KxCtM(t!;IcxMUH` z$B_R-wM+c8^5l(fm#>52n%EI=x_=Qw2Ps1{e2ahycO?J1tIB<_&UA0Y`Mgy+Yrb-t z;@A|c?cE|jL%w&T|K@?6-*Ob4zUQOEdr?s(V#sDEsz*u=(uEA_wOizn)CE>@)mHzIv6-@DCW$UBeKN1hbmELLK0O z0+%u)PTdJxm{b8l1vS@r+l4J$I$5ChA?%%X@#Q!@~yU(brfzZLfHAF{^es(_vO4r22) zBAzE80gqVh(>pdij|=e&IfHI zl>_AKm5ML-9=$uboh=eU&Yzjh^Dswb9=#hzr@eA7O>@9X<1N>+1qq+gMeH5)YIFGu z-Ft>GVffppU_f23*|74`ro|rMvFBI(90D=ymQn228cMI7l7!flePh`(mP|y8_!I1+ z%;JJs%Tm$NxPxGcOiQ|N?~b`Lg~@8xvpvZfSqRwlnFQ$7Z)hT5T=nf|7X3a$X0xeo z`^%dzMw#Y7%;cN^JXXWi2Qc?k)XbLYivdhN}+PGUwXv;X?&T_q~H(KKXKlugQbm4}$T$%4{iCqez7o{x4N>)6#zCcz? zIvkE}w;RXZj48OeX>wAfmG6(F0t({WzOLSg_wy={e`PwmW!NZ=QfVk-TR7NUBKgzE zv=GH028@9dIKPjg5G9zC8`R0oT;J0f3OBu^QCU3dl1AO;1%ExW6P0jQ*c6E5{rZ6< zsLM2OHR}n?4fcAbN-evR?2UR}_tAIw8D~koC2qfzwXA`s5;aS(!kB-&Q3zos`!iK7 zs*A#mP~BQrf+gR^7nHX=u(k0H>5si?1B|!%p(rL;9#Lx_$f&=%NVwAaVPhnko-=HD zY2lDUZ5MpA(Y3d|`<{ujVrE!%DBA(=qW%vr|Afd82VT&7)gIg2YU~XgEF_ZNx{36e zBlUXrQM9^RBvF1hzJEHu3i>0B*lx_@v(E!g7BP*gE2ECYz^PhXzqJg9jgp97#h6|b z$(10httsxH&n{#q1`^so*z=!%!~Iy%&$92H#eEK;_oT=<-|-$t6vTIHlZ7tIBIGe$ z85TA*&i@|TU|93( + @@ -11,32 +12,72 @@ -

XLSX to DXF Converter

+
+

XLSX to DXF Converter

+
-
- -
- - - -
+ + +
+
+
- - - - - +
+ + + +
+ + + + + +
+
+
+ +
+ + +
+ + +
+ + + + + +
+
+ +
- - + \ No newline at end of file diff --git a/test.py b/test.py index 1afb4ab..826f1e3 100644 --- a/test.py +++ b/test.py @@ -1,9 +1,10 @@ -from flask import Flask, request, render_template, send_file +from flask import Flask, request, render_template, send_file, make_response from io import BytesIO, StringIO import ezdxf import openpyxl import os import sys +import pandas as pd app = Flask(__name__) @@ -11,28 +12,65 @@ app = Flask(__name__) def upload_file(): if request.method == 'POST': file = request.files['file'] - if file.filename.endswith('.xls') or file.filename.endswith('.csv') or file.filename.endswith('.xlsx'): - # Create a text file with the uploaded file name - - velikost = request.form['range'] - nazev_souboru = request.form['output_file'] - print(velikost) + if request.form['btn'] == 'dxf': + if file.filename.endswith('.xls') or file.filename.endswith('.csv') or file.filename.endswith('.xlsx'): + # Create a text file with the uploaded file name + + velikost = request.form['range'] + nazev_souboru = request.form['output_file'] + print(velikost) - body = nacti_data_z_excelu(file) - #print(body) + body = nacti_data_z_excelu(file) + #print(body) - dxf_file = exportuj_do_dxf(body, velikost) - dxf_file.seek(0) - return send_file( - path_or_file=dxf_file, - as_attachment=True, - download_name= nazev_souboru+".dxf" or 'hotovson.dxf', - mimetype='application/octet-stream' - ) + dxf_file = exportuj_do_dxf(body, velikost) + dxf_file.seek(0) + return send_file( + path_or_file=dxf_file, + as_attachment=True, + download_name= nazev_souboru+".dxf" or 'hotovson.dxf', + mimetype='application/octet-stream' + ) + else: + return render_template('upload_form.html', no_file=True) else: - return render_template('upload_form.html', no_file=True) + # Generate the download file + file_data = BytesIO(b"necum") + file_name = request.form['excel_output_file'] + + + df = pd.read_excel(file, sheet_name='List1') + + + df_deduplicated = df.drop_duplicates(subset=['Název'], keep='first') + + df_final = pd.concat([df, df_deduplicated]).sort_values(by=['x', 'y'], ascending=request.form.get('select')== '1') + df_final = df_final['Název'].reset_index(drop=True) + + + df_final.to_excel(file_data, sheet_name='List1', index=False, header=False) + file_data.seek(0) + + return send_file( + path_or_file=file_data, + as_attachment=True, + download_name= file_name+".xlsx" or 'hotovson.xlsx', + mimetype='application/octet-stream' + ) + return render_template('upload_form.html') +@app.route('/excel_labels', methods=['GET', 'POST']) +def excel_labels(): + + # Generate the download file + file_data = BytesIO(b"necum") + file_name = 'download_file.xlsx' + + response = make_response(send_file(file_data, mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')) + response.headers['Content-Disposition'] = f'attachment; {file_name}' + return response + def nacti_data_z_excelu(soubor, listname="List1"): wb = openpyxl.load_workbook(soubor, data_only=True) sheet = wb[listname] @@ -76,4 +114,4 @@ def exportuj_do_dxf(body, velikost) -> BytesIO: if __name__ == '__main__': - app.run(debug=False, port=5003, host='0.0.0.0') \ No newline at end of file + app.run(debug=True, port=5003, host='0.0.0.0') \ No newline at end of file