简单使用openpyxl读取合并单元格输出json



#!/usr/bin/env python
# encoding: utf-8

import openpyxl
import collections
import json
import commands

#颜色显示
def blue(string):
    print ("\033[0;34m%s\033[0m" % string)

def cyan(string):
    print ("\033[0;36m%s\033[0m" % string)

def green(string):
    print ("\033[0;32m%s\033[0m" % string)

def red(string):
    print ("\033[0;46m%s\033[0m" % string)

def write_Conf(path,data):

    with open(path, ‘a+‘) as f:
        f.write(data + "\n")

def cmd(args):
    status, output = commands.getstatusoutput(args)
    if status == 0:
        return 0
    else:
        return "Command error or something"

def merge():
    #查询合并的单元格
    m_list = worksheet.merged_cells
    #判断单元格生成坐标输出到list
    merge_all_list = []
    for m_area in m_list:
        # 合并单元格的起始行坐标、终止行坐标
        r1, r2, c1, c2 = m_area.min_row, m_area.max_row, m_area.min_col, m_area.max_col
        if (r1 != r2 and c1 != c2):
            row_col = [(x, y) for x in xrange(r1, r2 + 1) for y in xrange(c1, c2 + 1)]
            merge_all_list.append(row_col)
        elif (r1 == r2 and c1 != c2):  # or (r1 != r2 and c1 == c2):
            col = [(r1, n) for n in xrange(c1, c2 + 1)]
            merge_all_list.append(col)
        elif (r1 != r2 and c1 == c2):
            row = [(m, c1) for m in xrange(r1, r2 + 1)]
            merge_all_list.append(row)
    return merge_all_list,col   #返回一个元组(索引0是合并之后的单元格列表,索引1是第一行合并的单元格坐标)
result = cmd("> json.conf")
if result == 0:
    print "Have to empty"
else:
    print result

workbook = openpyxl.load_workbook("moban.xlsx")  #加载已经存在的excel
name_list = workbook.sheetnames
# worksheet = workbook.get_sheet_by_name(name_list[0])  #最新版本已经不能使用这种方法
worksheet = workbook[name_list[0]]
# print name_list
# print workbook
# print worksheet

rows = worksheet.rows
columns = worksheet.columns

#如下是最大行数和最大列数
row_number = worksheet.max_row
col_number = worksheet.max_column

#定义添加顺序的字典
temp = collections.OrderedDict()

for i in xrange(2, worksheet.max_row+1):
    install_list = []
    col_merger = []
    for j in xrange(1, worksheet.max_column+1):

        merge_list = merge()

        ‘‘‘
        merge_list结果就类似如下坐标
        [(1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (1, 10), (1, 11), (1, 12), (1, 13), (1, 14)]
        [(3, 1), (4, 1)]
        [(2, 2), (2, 3), (3, 2), (3, 3)]
        [(4, 1), (5, 1), (6, 1)]
        [(8, 2), (8, 3), (8, 4), (9, 2), (9, 3), (9, 4), (10, 2), (10, 3), (10, 4)]
        ‘‘‘
        #循环合并的单元格的坐标和字典的横纵坐标对比,
        #如果存在单元格的list就获取合并单元格中的左上角单元格值,然后跳出
        #如果不存在单元格的list就再继续判断是不是大于第五列,大于第五列就是添加list中然后跳出,不然添加的是重复的list
        for a, b in enumerate(merge_list[0]):
            if (i, j) in b:
                    cell_value_header = worksheet.cell(row=1, column=j).value
                    cell_value = worksheet.cell(row=merge_list[0][a][0][0], column=merge_list[0][a][0][1]).value
                    temp[cell_value_header] = cell_value
                    break
            else:
                if j >= merge_list[-1][0][-1]:
                    cell_value_header = worksheet.cell(row=1, column=merge_list[-1][0][-1]).value
                    cell_value = worksheet.cell(row=i, column=j).value
                    if not cell_value is None:
                        col_merger.append(cell_value)
                    temp[cell_value_header] = col_merger
                    break
                else:
                    cell_value_header = worksheet.cell(row=1, column=j).value
                    cell_value = worksheet.cell(row=i, column=j).value
                    temp[cell_value_header] = cell_value

    # print json.dumps(temp)
    write_Conf("json.txt", json.dumps(temp))

原文地址:https://www.cnblogs.com/y-x-h/p/9151968.html

时间: 2024-11-10 16:02:19

简单使用openpyxl读取合并单元格输出json的相关文章

.net读取Excel转datatable、.net读取的Excel存在合并单元格并且转成datatable

项目中经常会遇到Excel导入数据,Excel的模板会可能是存在合并单元格的,模板如下图所示 读取时需要填充合并单元格的值,转成datatable单元格值时,填充合并单元格的值,如下图所示: 合并单元格的值填充,这种格式的datatable使用SqlBulkCopy批量导入更为方便 Excel转datatable方法代码: /// <summary> /// Excel转DataTable /// </summary> /// <param name="filePa

Apache POI 合并单元格--简单解释版带Demo

合并单元格所使用的方法: sheet.addMergedRegion( CellRangeAddress  cellRangeAddress  ); CellRangeAddress  对象的构造方法需要传入合并单元格的首行.最后一行.首列.最后一列. CellRangeAddress cra=new CellRangeAddress(0, 3, 3, 9); 怎样把数据写入合并后的单元格中 首先要查看你 CellRangeAddress 构造方法的firstcol index 创建firstc

bootstrap table合并单元格(该版本是简单的应用)

//获取列表数据 function loadTableData(tableId, request, data) { $.ajax({ type : "GET", url : request, contentType : 'application/json', dataType : "json", data : data, success : function(json) { //从后台获取到数据后进行表格的渲染 $('#featureBusinessClassify

NPOI操作EXCEL(五)——含合并单元格复杂表头的EXCEL解析

我们在第三篇文章中谈到了那些非常反人类的excel模板,博主为了养家糊口,也玩命做出了相应的解析方法... 我们先来看看第一类复杂表头: ...... 博主称这类excel模板为略复杂表头模板(蓝色部分为表头部分,蓝色前面几行是博主项目的基础样式,称为元数据),这类excel的表头多为2-3行,甚至于5/6行 ,具有合并层级关系,看似复杂,但只需要在我们以前的基础上稍微做一下重构就可以完美实现解析. 我们以各地区户籍人口城乡构成表头为例: 其实,只要我们能准确解析这类表头所表达的意思,就能复用以

C# 获取Excel中的合并单元格

C# 获取Excel中的合并单元格 我们在制作表格时,有时经常需要合并及取消合并一些单元格.在取消合并单元格时需要逐个查找及取消,比较麻烦.这里分享一个简单的方法来识别Excel中的合并单元格,识别这些合并单元格之后对这些单元格进行取消合并操作,还可以进行其他操作如设置格式等. 为了展示,这里我使用了一个模板Excel文件,它含有两个合并区域,如下图: 代码使用: 步骤1:实例化一个Workbook对象并加载Excel文档. Workbook workbook = new Workbook();

php 数据导出到excel 2种带有合并单元格的导出

具体业务层面 可能会有所不同.以下两种方式涉及的合并单元格地方有所不同,不过基本思路是一致的. 第一种是非插件版本.可能更容易理解点,基本思路就是 组装table 然后 读取 输出到excel上.缺点是要设置样式不太好设置. 第二种是利用插件  PHPExcel   有点是可以对输出格式做各种设置.缺点是初次接触这个插件的同学,并且对表格合并不熟悉的同学,可能要花点时间理解 另外注意excel对数字过长会处理成你不想要的数据,记得对该数据格式化成字符串 貌似就可以解决.以前遇到过 /** * *

在Asp.Net MVC中使用NPOI插件实现对Excel的操作(导入,导出,合并单元格,设置样式,输入公式)

前言 NPOI 是 POI 项目的.NET版本,它不使用 Office COM 组件,不需要安装 Microsoft Office,目前支持 Office 2003 和 2007 版本. 1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.NPOI是POI的C#版本,NPOI的行和列的index都是从0开始 3.POI读取Excel有两种格式一个是HSSF,另一个是XSSF. HSSF和XSSF的区别如下: HSSF

【记录】解析具有合并单元格的Excel

最近公司让做各种数据表格的导入导出,就涉及到电子表格的解析,做了这么多天总结一下心得. 工具:NOPI 语言:C# 目的:因为涉及到导入到数据库,具有合并单元格的多行必然要拆分,而NPOI自动解析的时候拆分单元格除第一个单元格外其余值都是空,对于列头有合并项目的,数据库设计一般才有合并单元格下面的最小列单元作为数据库字段.于是希望达到这样一个效果.于是有了一个思路就是把读入的Excel复制到新建的Excel,然后再去读新的Excel.总体思路就是把合并单元格所包含的所有最小单元格的值都设置成合并

devexpress实现单元格合并以及依据条件合并单元格

1.devexpress实现单元格合并非常的简单,只要设置属性[AllowCellMerge=True]就可以了,实现效果如下图: 2.但是在具体要求中并非需要所有的相同单元格都合并,可能需要其他的条件来控制合并.这个时候我们就需要在事件gridView1_CellMerge中来控制了.下图为根据最后一列判断是否合并单元格的效果图(其中第四列设置为不合并<非必需>,这里只是为了达到一个比较效果.). 3.重要代码: int row1 = e.RowHandle1; int row2 = e.R