Files
cve-dashboard/backend/scripts/__pycache__/extract_xlsx_schema.cpython-312.pyc

53 lines
3.6 KiB
Plaintext
Raw Normal View History

<EFBFBD>
<00>W<EFBFBD>i<EFBFBD>
<00><00>D<00>dZddlZddlZddlmZd<04>Zedk(re<05>yy)a<>
Extract the structural schema of a compliance xlsx file as JSON.
Usage: python3 extract_xlsx_schema.py <path_to_xlsx>
Output:
{
"sheets": [
{
"name": "Summary",
"columns": ["Metric", "Non-Compliant", "..."],
"metric_values": ["2.3.4i", "5.2.4", "..."]
},
{
"name": "2.3.4i",
"columns": ["Preferred - Hostname", "GRANITE - IPv4_Address", "..."]
}
]
}
- Uses openpyxl in read-only mode.
- Extracts sheet names, first-row column headers per sheet, and unique metric
values from the Summary sheet (header at row 4, data from row 5 onward).
- On error, returns { "error": "..." } on stdout and exits with non-zero code.
Dependencies: openpyxl (already in requirements.txt)
<EFBFBD>N)<01> load_workbookc
<00>f<00>ttj<00>dkr5tt j
ddi<01><00>tj d<04>tjd} t|dd<05><06>}jsEtt j
ddi<01><00>|j<00>tj d<04>g}|jD<00>]I}||}t|jdd<05> <09><00>}|r-|d
D<00>cgc]}|<07><01>t|<07>j<00><00><02> c}ng}||d <0B>} |d k(r<>g}
t|jd d d<05><0E><00>} | r<>| d
D<00>cgc]}|rt|<07>j<00>nd<0F><02>!} }d} t| <0C>D]\}}|dk(s<01> |} n| <0A>T|jdd<05><12>D]>}|| <00><01> t|| <00>j<00>}|s<01>(|dk7s<01>.|
j!|<11><00>@t#t%|
<EFBFBD><00>| d<|j!| <09><00><01>L|j<00>tt j
d|i<01><00>y#t$rL}tt j
ddt|<02><00><00>i<01><00>tj d<04>Yd}~<02><02>-d}~wwxYwcc}wcc}w)N<><00>errorzNo file path provided<65>T)<02> read_only<6C> data_onlyzCannot open file: zWorkbook contains no sheets)<02>max_row<6F> values_onlyr)<02>name<6D>columns<6E>Summary<72>)<03>min_rowr
r <00><00>Metric<69>)rr <00> metric_values<65>sheets)<13>len<65>sys<79>argv<67>print<6E>json<6F>dumps<70>exitr<00> Exception<6F>str<74>
sheetnames<EFBFBD>close<73>list<73> iter_rows<77>strip<69> enumerate<74>append<6E>sorted<65>set)<12>filepath<74>wb<77>er<00>
sheet_name<EFBFBD>ws<77>rows<77>cr <00>entryr<00> header_rows<77> summary_cols<6C>
metric_idx<EFBFBD>i<>col<6F>row<6F>vals <20>&backend/scripts/extract_xlsx_schema.py<70>mainr8!sf<00><00>
<EFBFBD>3<EFBFBD>8<EFBFBD>8<EFBFBD>}<7D>q<EFBFBD><18> <0A>d<EFBFBD>j<EFBFBD>j<EFBFBD>'<27>#:<3A>;<3B><<3C>=<3D> <0B><08><08><11> <0B><12>x<EFBFBD>x<EFBFBD><01>{<7B>H<EFBFBD><14> <1A>8<EFBFBD>t<EFBFBD>t<EFBFBD> D<><02>
<0E>=<3D>=<3D> <0A>d<EFBFBD>j<EFBFBD>j<EFBFBD>'<27>#@<40>A<>B<>C<>
<EFBFBD><08><08>
<EFBFBD> <0B><08><08><11> <0B> <0F>F<EFBFBD><18>m<EFBFBD>m<EFBFBD> <1D>
<EFBFBD> <0F>
<EFBFBD>^<5E><02><14>B<EFBFBD>L<EFBFBD>L<EFBFBD><11><04>L<EFBFBD>=<3D>><3E><04>HL<48>4<EFBFBD><01>7<EFBFBD>D<>a<EFBFBD>a<EFBFBD>m<EFBFBD>3<EFBFBD>q<EFBFBD>6<EFBFBD><<3C><<3C>><3E>D<>RT<52><07><1F><1E>
<EFBFBD><05> <16><19> "<22><1E>M<EFBFBD><1E>r<EFBFBD>|<7C>|<7C>A<EFBFBD>q<EFBFBD>d<EFBFBD>|<7C>S<>T<>K<EFBFBD><1A>EP<45>QR<51>^<5E>T<><01>!<21><03>A<EFBFBD><06> <0C> <0C><0E><12> ;<3B>T<> <0C>T<>!<21>
<EFBFBD>'<27> <0C>5<><1E>F<EFBFBD>A<EFBFBD>s<EFBFBD><1A>h<EFBFBD><EFBFBD>%&<26>
<EFBFBD><1D><1E><1E>)<29>!<21>|<7C>|<7C>A<EFBFBD>4<EFBFBD>|<7C>H<>:<3A><03><1E>z<EFBFBD>?<3F>6<>"%<25>c<EFBFBD>*<2A>o<EFBFBD>"6<>"<<3C>"<<3C>"><3E>C<EFBFBD>"<22>s<EFBFBD>h<EFBFBD><EFBFBD> -<2D> 4<> 4<>S<EFBFBD> 9<> :<3A>
&,<2C>C<EFBFBD> <0A>,><3E>%?<3F>E<EFBFBD>/<2F> "<22><0E> <0A> <0A>e<EFBFBD><1C>A <1D>D<07>H<EFBFBD>H<EFBFBD>J<EFBFBD> <09>$<24>*<2A>*<2A>h<EFBFBD><06>'<27>
(<28>)<29><>[ <15><14> <0A>d<EFBFBD>j<EFBFBD>j<EFBFBD>'<27>%7<><03>A<EFBFBD><06>x<EFBFBD>#@<40>A<>B<>C<> <0B><08><08><11> <0B> <0B><><14><>E<01><> Us+<00>&I<00>J)<06> J)<06>$J.<06> J&<03>AJ!<03>!J&<03>__main__)<07>__doc__rr<00>openpyxlrr8<00>__name__<5F><00>r7<00><module>r?s/<00><01><04>4 <0B> <0B>"<22>6*<2A>r <0C>z<EFBFBD><19><08>F<EFBFBD>r>