123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- #!/usr/bin/python
- #-*- coding: UTF-8 -*-
- # ----------------------------------------------------------------------------
- # Convert the performance test result from json files to excel.
- #
- # Author: Bill Zhang
- #
- # License: MIT
- # ----------------------------------------------------------------------------
- '''
- Convert the performance test result from json files to excel.
- '''
- import xlwt
- import os
- import json
- from argparse import ArgumentParser
- DEFAULT_STYLE = 'borders: left thin, right thin, top thin, bottom thin;'
- CONDITION_STYLE = 'pattern: pattern solid, fore_color light_green;'
- RESULT_STYLE = 'pattern: pattern solid, fore_color light_yellow;'
- BASE_KEYS = [
- 'osVersion',
- 'fileVersion',
- 'timeStamp',
- 'engineVersion',
- 'device'
- ]
- KEY_CONDITION_HEADERS = "conditionHeaders"
- KEY_RESULT_HEADERS = "resultHeaders"
- KEY_RESULTS = "results"
- START_COL_INDEX = 0
- START_ROW_INDEX = 0
- class KnownException(Exception):
- pass
- class Convertor:
- def __init__(self, src_path, output_path=None):
- self.src_path = self.change_to_abspath(src_path)
- if not os.path.exists(self.src_path):
- raise KnownException('%s is not existed!' % self.src_path)
- if output_path is None:
- # not specified output path, default use source path
- if os.path.isfile(self.src_path):
- self.output_path = os.path.dirname(self.src_path)
- else:
- self.output_path = self.src_path
- else:
- self.output_path = self.change_to_abspath(output_path)
- def change_to_abspath(self, path):
- ret = os.path.expanduser(path)
- if not os.path.isabs(ret):
- ret = os.path.abspath(ret)
- ret = os.path.normpath(ret)
- return ret
- def get_col_width(self, col_str):
- return 256 * (len(col_str) + 1)
- def convert_file(self, file_path):
- f = open(file_path)
- testData = json.load(f)
- f.close()
- basename, ext = os.path.splitext(os.path.basename(file_path))
- dst_file_path = os.path.join(self.output_path, "%s.xls" % basename)
- if os.path.isfile(dst_file_path):
- os.remove(dst_file_path)
- workbook = xlwt.Workbook(encoding = 'ascii')
- default_style = xlwt.Style.easyxf(DEFAULT_STYLE)
- con_style = xlwt.Style.easyxf("%s%s" % (DEFAULT_STYLE, CONDITION_STYLE))
- ret_style = xlwt.Style.easyxf("%s%s" % (DEFAULT_STYLE, RESULT_STYLE))
- for key in testData.keys():
- if key in BASE_KEYS:
- continue
- # create a sheet for the test case
- sheetObj = workbook.add_sheet(key)
- # get test case data
- caseInfo = testData[key]
- # Add headers for the test case
- condHeaders = caseInfo[KEY_CONDITION_HEADERS]
- retHeaders = caseInfo[KEY_RESULT_HEADERS]
- curRow = START_ROW_INDEX
- curCol = START_COL_INDEX
- col_widths = {}
- for header in (condHeaders + retHeaders):
- sheetObj.write(curRow, curCol, header, default_style)
- col_width = self.get_col_width(header)
- col_widths[curCol] = col_width
- sheetObj.col(curCol).width = col_width
- curCol += 1
- rets = caseInfo[KEY_RESULTS]
- for retInfo in rets:
- curRow += 1
- curCol = START_COL_INDEX
- for ret in retInfo:
- if (curCol - START_COL_INDEX) < len(condHeaders):
- use_style = con_style
- else:
- use_style = ret_style
- sheetObj.write(curRow, curCol, ret, use_style)
- new_width = self.get_col_width(ret)
- old_width = col_widths[curCol]
- if new_width > old_width:
- sheetObj.col(curCol).width = new_width
- col_widths[curCol] = new_width
- curCol += 1
- workbook.save(dst_file_path)
- print("%s is generated." % dst_file_path)
- def do_convert(self):
- if not os.path.exists(self.output_path):
- os.makedirs(self.output_path)
- if os.path.isfile(self.src_path):
- self.convert_file(self.src_path)
- else:
- for f in os.listdir(self.src_path):
- full_path = os.path.join(self.src_path, f)
- ignore, ext = os.path.splitext(f)
- if os.path.isfile(full_path) and ext == '.json':
- self.convert_file(full_path)
- if __name__ == '__main__':
- parser = ArgumentParser(description="Performance test data convertor.")
- parser.add_argument('-s', dest='src_path', required=True, help='Specify the json file path or the folder path of json files.')
- parser.add_argument('-o', dest='output_path', help='Specify the output path of excel files.')
- (args, unknown) = parser.parse_known_args()
- try:
- convertor = Convertor(args.src_path, args.output_path)
- convertor.do_convert()
- except Exception as e:
- if e.__class__.__name__ == "KnownException":
- print(' '.join(e.args))
- else:
- raise
|