1313from pathlib import Path
1414import fosslight_util .constant as constant
1515from jsonmerge import merge
16+ from fosslight_util .cover import CoverItem
1617
1718_HEADER = {'BIN (' : ['ID' , 'Binary Name' , 'Source Code Path' ,
1819 'NOTICE.html' , 'OSS Name' , 'OSS Version' ,
3132IDX_FILE = 0
3233IDX_EXCLUDE = 7
3334logger = logging .getLogger (constant .LOGGER_NAME )
35+ COVER_SHEET_NAME = 'Scanner Info'
3436
3537
3638def write_excel_and_csv (filename_without_extension , sheet_list , ignore_os = False , extended_header = {}, hide_header = {}):
@@ -105,9 +107,9 @@ def get_header_row(sheet_name, sheet_content, extended_header={}):
105107 if sheet_name .startswith (header_key ):
106108 selected_header = merged_headers [header_key ]
107109 break
108-
109- if not selected_header :
110- selected_header = sheet_content .pop (0 )
110+ if len ( sheet_content ) > 0 :
111+ if not selected_header :
112+ selected_header = sheet_content .pop (0 )
111113 return selected_header , sheet_content
112114
113115
@@ -166,16 +168,18 @@ def write_result_to_csv(output_file, sheet_list_origin, separate_sheet=False, ex
166168 return success , error_msg , output
167169
168170
169- def write_result_to_excel (out_file_name , sheet_list , extended_header = {}, hide_header = {}):
171+ def write_result_to_excel (out_file_name , sheet_list , extended_header = {}, hide_header = {}, cover = "" ):
170172 success = True
171173 error_msg = ""
172174
173175 try :
174- if sheet_list :
175- output_dir = os .path .dirname (out_file_name )
176- Path (output_dir ).mkdir (parents = True , exist_ok = True )
176+ output_dir = os .path .dirname (out_file_name )
177+ Path (output_dir ).mkdir (parents = True , exist_ok = True )
177178
178- workbook = xlsxwriter .Workbook (out_file_name )
179+ workbook = xlsxwriter .Workbook (out_file_name )
180+ if cover :
181+ write_cover_sheet (workbook , cover )
182+ if sheet_list :
179183 for sheet_name , sheet_contents in sheet_list .items ():
180184 selected_header , sheet_content_without_header = get_header_row (sheet_name , sheet_contents [:], extended_header )
181185 try :
@@ -188,13 +192,33 @@ def write_result_to_excel(out_file_name, sheet_list, extended_header={}, hide_he
188192
189193 if hide_header :
190194 hide_column (worksheet , selected_header , hide_header )
191- workbook .close ()
195+ workbook .close ()
192196 except Exception as ex :
193197 error_msg = str (ex )
194198 success = False
195199 return success , error_msg
196200
197201
202+ def write_cover_sheet (workbook , cover ):
203+ worksheet = workbook .add_worksheet (COVER_SHEET_NAME )
204+
205+ format_bold = workbook .add_format ({'bold' : True })
206+ worksheet .merge_range ('A1:B1' , 'About the scanner' , format_bold )
207+
208+ key_format = workbook .add_format ({'bold' : True , 'font_color' : 'white' , 'bg_color' : 'navy' })
209+ item_format = workbook .add_format ()
210+ item_format .set_text_wrap ()
211+
212+ cover_json = cover .get_print_json ()
213+ row = 1
214+ for item in cover_json :
215+ worksheet .write (row , 0 , item , key_format )
216+ worksheet .write (row , 1 , cover_json [item ], item_format )
217+ row += 1
218+ worksheet .set_column (0 , 0 , 30 )
219+ worksheet .set_column (1 , 1 , 100 )
220+
221+
198222def write_result_to_sheet (worksheet , sheet_contents ):
199223 row = 1
200224 for row_item in sheet_contents :
@@ -221,7 +245,33 @@ def create_worksheet(workbook, sheet_name, header_row):
221245 return worksheet
222246
223247
224- def merge_excels (find_excel_dir , final_out , merge_files = '' ):
248+ def merge_cover_comment (find_excel_dir , merge_files = '' ):
249+ FIND_EXTENSION = '.xlsx'
250+ merge_comment = []
251+ cover_comment = ''
252+ try :
253+ files = os .listdir (find_excel_dir )
254+
255+ if len ([name for name in files if name .endswith (FIND_EXTENSION )]) > 0 :
256+ for file in files :
257+ if merge_files :
258+ if file not in merge_files :
259+ continue
260+ if file .endswith (FIND_EXTENSION ):
261+ file = os .path .join (find_excel_dir , file )
262+ df_excel = pd .read_excel (file , sheet_name = COVER_SHEET_NAME , index_col = 0 , engine = 'openpyxl' )
263+ if not df_excel .empty :
264+ tool_name = df_excel .loc [CoverItem .tool_name_key ].values [0 ]
265+ comment = df_excel .loc [CoverItem .comment_key ].values [0 ]
266+ merge_comment .append (str (f"[{ tool_name } ] { comment } " ))
267+ cover_comment = '\n ' .join (merge_comment )
268+ except Exception as ex :
269+ logger .warning (f'Fail to merge comment of Scanner info: { str (ex )} ' )
270+
271+ return cover_comment
272+
273+
274+ def merge_excels (find_excel_dir , final_out , merge_files = '' , cover = '' ):
225275 success = True
226276 msg = ""
227277 FIND_EXTENSION = '.xlsx'
@@ -231,7 +281,7 @@ def merge_excels(find_excel_dir, final_out, merge_files=''):
231281
232282 if len ([name for name in files if name .endswith (FIND_EXTENSION )]) > 0 :
233283 writer = pd .ExcelWriter (final_out )
234-
284+ write_cover_sheet ( writer . book , cover )
235285 for file in files :
236286 if merge_files :
237287 if file not in merge_files :
@@ -243,13 +293,14 @@ def merge_excels(find_excel_dir, final_out, merge_files=''):
243293 excel_file = pd .ExcelFile (file , engine = 'openpyxl' )
244294
245295 for sheet_name in excel_file .sheet_names :
246- sheet_name_to_copy = f"{ f_short_name } _{ sheet_name } "
296+ if sheet_name == COVER_SHEET_NAME :
297+ continue
247298 df_excel = pd .read_excel (
248299 file , sheet_name = sheet_name , engine = 'openpyxl' )
249- if sheet_name not in added_sheet_names :
250- sheet_name_to_copy = sheet_name
251- df_excel .to_excel (writer , sheet_name_to_copy ,
252- index = False )
300+ if sheet_name in added_sheet_names :
301+ sheet_name = f" { f_short_name } _ { sheet_name } "
302+ df_excel .to_excel (writer , sheet_name , index = False )
303+ added_sheet_names . append ( sheet_name )
253304 writer .close ()
254305 except Exception as ex :
255306 msg = str (ex )
0 commit comments