• python操作excel


    python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库。可从这里下载https://pypi.python.org/pypi。下面分别记录python读和写excel.

    python读excel——xlrd

    这个过程有几个比较麻烦的问题,比如读取日期、读合并单元格内容。下面先看看基本的操作

    import xlrd
    import xlwt
    import  uuid
    from  datetime  import   datetime
    workbook = xlrd.open_workbook('shujuzhengli.xls')
    print(workbook.sheet_names())
    li = []
    tem = []
    fields = ['name', 'full_name', 'model', 'brand', 'leader', 'entry_date', 'start_date']
    for  sheet  in workbook.sheet_names():
        table = workbook.sheet_by_name(sheet)  #根据名称获取sheet内容
        nrows = table.nrows#有效行数
        ncols = table.ncols#有效列数
        print(nrows,ncols)
        if nrows  and  ncols:
            for nrows_num in  range(nrows):  #行
                print("nrows_num",nrows)
    
                dic = {}
                for ncols_num  in  range(ncols): #列
                    print("ncols_num",ncols_num)
                    value = table.cell_value(nrows_num, ncols_num)
                    dic[fields[ncols_num]]=value
                print("dic",dic)
                li.append(dic)
    
    
    print("li",li)
    import   pymysql
    
    conn = pymysql.connect(host='192.168.99.200',port=3306,database='bms',user='root',passwd='Cwtc@2018',charset='utf8')
    cursor = conn.cursor()
    t = datetime.now()
    for  i  in li:
        name = i["name"]
        sql = "select *  from bms_system_equipment where  name = '%s'"%(name)
        cursor.execute(sql )
        ret = cursor.fetchone()
        u = str(uuid.uuid4()).replace("-","")
        if  not   ret:
            sql = "insert into bms_system_equipment(uuid,name,full_name,model,brand,leader,entry_date,start_date,status,created_at,updated_at,deleted) values ('%s','%s','%s','%s','%s','%s','%s','%s',%s,'%s','%s',%s) "
                %(u,i["name"],i["full_name"],i["model"],i["brand"],i["leader"],datetime.strptime(str(i["entry_date"]), "%Y.%m"),datetime.strptime(str(i["start_date"],), "%Y.%m"),2,t,t,0)
            print(sql)
    

      

    # 根据sheet索引或者名称获取sheet内容
        sheet2 = workbook.sheet_by_index(1) # sheet索引从0开始
        sheet2 = workbook.sheet_by_name('sheet2')
    # 获取整行和整列的值(数组)
        rows = sheet2.row_values(3) # 获取第四行内容
        cols = sheet2.col_values(2) # 获取第三列内容
        print rows
        print cols
    
        # 获取单元格内容
        print sheet2.cell(1,0).value.encode('utf-8')
        print sheet2.cell_value(1,0).encode('utf-8')
        print sheet2.row(1)[0].value.encode('utf-8')
        # 获取单元格内容的数据类型
        print sheet2.cell(1,0).ctype
     

    python读取excel中单元格内容为日期的方式

    python读取excel中单元格的内容返回的有5种类型,即上面例子中的ctype:

    ctype :  0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error

    即date的ctype=3,这时需要使用xlrd的xldate_as_tuple来处理为date格式,先判断表格的ctype=3时xldate才能开始操作。现在命令行看下:

    >>> sheet2.cell(2,2).ctype  #1990/2/22
    >>> sheet2.cell(2,1).ctype  #24
    >>> sheet2.cell(2,0).ctype  #小胖
    >>> sheet2.cell(2,4).ctype  #空值(这里是合并单元格的原因)
    >>> sheet2.cell(2,2).value  #1990/2/22
    33656.0
    >>> xlrd.xldate_as_tuple(sheet2.cell_value(2,2),workbook.datemode)
    (1992, 2, 22, 0, 0, 0)
    >>> date_value = xlrd.xldate_as_tuple(sheet2.cell_value(2,2),workbook.datemode)
    >>> date_value
    (1992, 2, 22, 0, 0, 0)>>> date(*date_value[:3])datetime.date(1992, 2, 22)>>> date(*date_value[:3]).strftime('%Y/%m/%d') '1992/02/22'
    

      即可以做下简单处理,判断ctype是否等于3,如果等于3,则用时间格式处理

    if (sheet.cell(row,col).ctype == 3):
        date_value = xlrd.xldate_as_tuple(sheet.cell_value(rows,3),book.datemode)
        date_tmp = date(*date_value[:3]).strftime('%Y/%m/%d')
    

      读取合并单元格的内容

    只能获取合并单元格的第一个cell的行列索引,才能读到值,读错了就是空值。

    即合并行单元格读取行的第一个索引,合并列单元格读取列的第一个索引

    合并单元格可能出现空值,但是表格本身的普通单元格也可能是空值,要怎么获取单元格所谓的"第一个行或列的索引"呢?

    这就要先知道哪些是单元格是被合并的!

      获取合并的单元格

    读取文件的时候需要将formatting_info参数设置为True,默认是False,所以上面获取合并的单元格数组为空,

    >>> workbook = xlrd.open_workbook(r'F:demo.xlsx',formatting_info=True)
    >>> sheet2 = workbook.sheet_by_name('sheet2')
    >>> sheet2.merged_cells
    [(7, 8, 2, 5), (1, 3, 4, 5), (3, 6, 4, 5)]
    

      merged_cells返回的这四个参数的含义是:(row,row_range,col,col_range),其中[row,row_range)包括row,不包括row_range,col也是一样,即(1, 3, 4, 5)的含义是:第1到2行(不包括3)合并,(7, 8, 2, 5)的含义是:第2到4列合并。

    利用这个,可以分别获取合并的三个单元格的内容:

    >>> print sheet2.cell_value(1,4)   #(1, 3, 4, 5)
    好朋友
    >>> print sheet2.cell_value(3,4)   #(3, 6, 4, 5)
    同学
    >>> print sheet2.cell_value(7,2)   #(7, 8, 2, 5)
    暂无
    

      发现规律了没?是的,获取merge_cells返回的row和col低位的索引即可! 于是可以这样一劳永逸

    >>> merge = []
    >>> for (rlow,rhigh,clow,chigh) in sheet2.merged_cells:
        merge.append([rlow,clow])
        
    >>> merge
    [[7, 2], [1, 4], [3, 4]]
    >>> for index in merge:
        print sheet2.cell_value(index[0],index[1])
        
    暂无
    好朋友
    同学
    >>>
    

      写EXCEL--xlwt

    def write_excel():
        # 创建工作簿
        workbook = xlwt.Workbook(encoding='utf-8')
        # 创建sheet
        data_sheet = workbook.add_sheet('demo')
        row0 = [u'状态', u'设备编号', u'楼层', u'系统',u"类型"]
        row1 = [u'测试', '15:50:33-15:52:14', 22706, 4190202]
        # {
        #     "id": "2db098e82c70434cad582386664ccc68",
        #     "name": "EAF-L7-29",
        #     "type": "BPV",
        #     "module": [
        #         {
        #             "空调系统": {
        #                 "id": 1,
        #                 "index": -2,
        #                 "child": {
        #                     "空调风系统": {
        #                         "id": 2,
        #                         "index": 0,
        #                         "child": 0
        #                     }
        #                 }
        #             }
        #         }
        #     ],
        #     "installFloor": "B1",
        #     "state": 0
        # },
        # 生成第一行和第二行
        i = 0
        for  j  in  dict:
            row = [str(j.get("state")),j.get("name"),j.get("installFloor"),u"空调系统",str(j.get("type"))]
            i +=1
            for k in range(len(row0)):
                data_sheet.write(i, k, row[k], set_style('Times New Roman', 220, True))
    
        # 保存文件
        workbook.save('demo2.xls')
    
    if __name__ == '__main__':
        write_excel()
        print(u'创建demo.xlsx文件成功')
    

      

    参考:https://www.cnblogs.com/zhoujie/p/python18.html

    I can feel you forgetting me。。 有一种默契叫做我不理你,你就不理我

  • 相关阅读:
    js_css_dl.dt实现列表展开、折叠效果
    property_自己编写一个读取Property文件的Util类
    HttpClient_002_中文乱码、HttpClient中文乱码透析、总结
    HttpClient_001_初步实现项目01的servlet,与项目02的servlet,之间数据访问
    jsp:中文乱码解决
    linux命令
    js 监测from表单中的input和select,时时监测,没有输入或选择信息报错,不允许提交数据
    数据库的那些事
    待参考
    layer.open多次触发,遮罩层覆盖content的解决办法
  • 原文地址:https://www.cnblogs.com/weidaijie/p/10715108.html
Copyright © 2020-2023  润新知