Excel 转json 和json 转Excel
word = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] default_style = { 'font': {}, 'valign': 'bottom' } def xls2json(xls): from openpyxl import load_workbook workbook = load_workbook(xls) booksheet = workbook.active rows = booksheet.rows merged_cells = booksheet.merged_cells.ranges raw_merges = [x.bounds for x in merged_cells] merges = ['{0}{1}:{2}{3}'.format(word[x[0] - 1], x[1], word[x[2] - 1], x[3]) for x in raw_merges] ocols = {} for i in range(booksheet.max_column): if not booksheet.column_dimensions[word[i]].width: ocols[i] = {'width': 100} else: ocols[i] = {'width': int(booksheet.column_dimensions[word[i]].width * 10)} orows = {} styles = [] i = 0 for row in rows: row_dict = {} j = 0 for cell in row: if cell.value: align = cell.alignment.horizontal vertical = cell.alignment.vertical color = cell.font.color size = int(cell.font.sz) style = default_style.copy() if align: style['align'] = align if vertical: style['valign'] = vertical if vertical != 'center' else 'middle' style['font'] = {'size': size} if isinstance(color.rgb, str): style['color'] = '#{0}'.format(color.rgb[2:]) row_dict[j] = { 'text': cell.value } row_dict[j]['style'] = len(styles) styles.append(style) for rm in raw_merges: if rm[0] == j + 1 and rm[1] == i + 1: row_dict[j]['merge'] = [rm[3] - rm[1], rm[2] - rm[0]] break j += 1 if row_dict: if booksheet.row_dimensions[i + 1].height: orows[i] = {'cells': row_dict, 'height': int(booksheet.row_dimensions[i + 1].height) / 3 * 5} else: orows[i] = {'cells': row_dict, 'height': 23} i += 1 return json_format(orows, ocols, merges, styles)
以上是excel转json完整代码
def json2xls(json_str):
    import openpyxl
    workbook = openpyxl.Workbook()
    worksheet = workbook.active
    data = json.loads(json_str)
    rows = data[0]["rows"]
    merges = data[0]["merges"]
    styles = data[0]["styles"]
    cols = data[0]["cols"]
    # 处理行属性
    for k, v in rows.items():
        if k.isdigit():
            raw_row = int(k) + 1
            # 处理单元格内容
            if 'cells' in v:
                for k1, v1 in v['cells'].items():
                    if int(k1) < 26:
                        raw_col = word[int(k1)]
                        cell = worksheet['{0}{1}'.format(raw_col, raw_row)]
                        if 'text' in v1:
                            cell.value = v1['text']
                        if 'style' in v1:
                            raw_style = styles[int(v1['style'])]
                            align = 'left'
                            vertical = 'bottom'
                            if 'align' in raw_style:
                                align = raw_style['align']
                            if 'valign' in raw_style:
                                vertical = raw_style['valign'] if raw_style['valign'] != 'middle' else 'center'
                            cell.alignment = openpyxl.styles.Alignment(horizontal=align, vertical=vertical)
                            size = 11
                            color = '000000'
                            if 'font' in raw_style:
                                if 'size' in raw_style['font']:
                                    size = int(raw_style['font']['size'])
                            if 'color' in raw_style:
                                color = '{0}'.format(raw_style['color'][1:].upper())
                            cell.font = openpyxl.styles.Font(size=size, color=color)
            # 处理行高
            if 'height' in v:
                worksheet.row_dimensions[raw_row].height = int(v['height']) / 5 * 3
    # 处理列属性
    for k, v in cols.items():
        if k.isdigit():
            if 'width' in v:
                worksheet.column_dimensions[word[int(k)]].width = int(v['width']) * 1.0 / 10
    # 处理单元格合并
    for m in merges:
        worksheet.merge_cells(m)
    output = 'report_{0}'.format(str(len(os.listdir('../Common/modules/ireport/excel'))))
    workbook.save('../Common/modules/ireport/excel/{0}.xlsx'.format(output))
    return '../Common/modules/ireport/excel/{0}.xlsx'.format(output)
以上 是json转excel
附上 所用到的函数
def json_format(rows, cols, merges, styles): data = { 'freeze': 'A1', 'styles': styles, 'merges': merges, 'rows': rows, 'cols': cols, "validations": [], "autofilter": {} } rows = [data] return json.dumps(rows)
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号