• xlutils模块使用


     python常用模块目录

    1、xlutils 实现拷贝原文件

    原表格:

    import xlrd
    from xlutils.copy import copy
    workbook = xlrd.open_workbook('mcw_test.xlsx')  # 打开工作簿
    new_workbook = copy(workbook)  # 将xlrd对象拷贝转化为xlwt对象
    new_workbook.save("mcw_test.xlsx")  # 保存工作簿

    新工作簿的工作表内容一样,sheet2有点数据也复制出来了,只是格式没有复制过来:

    2、拷贝前获取原工作簿信息

    workbook = xlrd.open_workbook('mcw_test.xlsx')  # 打开工作簿
    sheets = workbook.sheet_names()  # 获取工作簿中的所有工作表名字,形成列表元素
    worksheet = workbook.sheet_by_name(sheets[0])  # 通过sheets[0]工作表名称获取工作簿中所有工作表中的的第一个工作表
    rows_old = worksheet.nrows  # 获取第一个工作表中已存在的数据的行数
    print(sheets,sheets[0],worksheet,worksheet.nrows )
    -------------------------------------结果:
    ['魔降风云变人名单', 'Sheet2', 'Sheet3'] 魔降风云变人名单 <xlrd.sheet.Sheet object at 0x029EC7F0> 4

    3、拷贝后获得新工作簿的信息:

    workbook = xlrd.open_workbook('mcw_test.xlsx')  # 打开工作簿
    new_workbook = copy(workbook)  # 将xlrd对象拷贝转化为xlwt对象
    new_worksheet = new_workbook.get_sheet(0)  # 获取转化后工作簿中的第一个工作表对象
    print(new_worksheet,new_workbook,new_worksheet.name) #有时间整理下工作表对象的方法,工作表可以.name
    ----------------------------结果:
    <xlwt.Worksheet.Worksheet object at 0x02A18CB0> <xlwt.Workbook.Workbook object at 0x02A18AF0> 魔降风云变人名单
    

    4、拷贝后直接修改文件内容:

    import xlrd
    import xlwt
    from xlutils.copy import copy
    # 打开想要更改的excel文件
    old_excel = xlrd.open_workbook('mcw_test.xlsx', formatting_info=True)
    # 将操作文件对象拷贝,变成可写的workbook对象
    new_excel = copy(old_excel)
    # 获得第一个sheet的对象
    ws = new_excel.get_sheet(0)
    # 写入数据
    ws.write(0, 0, '第一行,第一列')
    ws.write(0, 1, '第一行,第二列')
    ws.write(0, 2, '第一行,第三列')
    ws.write(1, 0, '第二行,第一列')
    ws.write(1, 1, '第二行,第二列')
    ws.write(1, 2, '第二行,第三列')
    # 另存为excel文件,并将文件命名,可以重新命名,应该也可以覆盖掉
    new_excel.save('new_mcw_test.xlsx')

     5、读取文件,根据标题行和姓名列获取所有单元格索引坐标。

    #我要修改小郭吹雪的爱好为喝水
    #需求分析:我需要知道"小郭吹雪的行号"和“爱好”的列号。我要修改的内容就是行号和列号所对应的单元格。代码修改就可以用行列索引
    
    
    import xlrd
    import xlwt
    from xlutils.copy import copy
    workbook = xlrd.open_workbook('mcw_test.xlsx') # 打开工作簿
    Data_sheet = workbook.sheets()[0]
    row1 = Data_sheet.row_values(0) #取出第一行
    dic_col_s={str(i):row1[i] for i in range(0,len(row1))} #将第一行的每个元素加个序数标记,标记列表索引,让列表索引和标题对应,由标题则可以从字典获取列号,即列表索引+1,这里需要的是索引
    col2=Data_sheet.col_values(1) #取出第二列,
    dic_row_s={str(i):col2[i] for i in range(0,len(col2))} #将第二列的每个元素加个序数标记,标记为第二列的列表索引。让名字和列表索引对应,就可以在字典中由名字得行号,即列表索引+1。这里需要的是这个索引
    print(dic_row_s)
    print(dic_col_s)
    mtitle="爱好" #需要修改哪个标题
    mname="小郭吹雪" #需要修改哪个人的
    rindex="".join([i for i in dic_row_s if dic_row_s[i]==mname]) #获取要修改的标题所在行的索引
    cindex="".join([i for i in dic_col_s if dic_col_s[i]==mtitle]) #获取要修改的那个人所在的列索引
    print(rindex,cindex) #获得要修改的单元格的行索引和列索引
    ------------------结果:

    {'0': '姓名', '1': '小马过河', '2': '小郭吹雪', '3': '樱花小月'}
    {'0': 'id', '1': '姓名', '2': '性别', '3': '爱好', '4': '毕业时间'}
    2 3

    #由上4、拷贝后直接修改文件内容可知。只要获得行列索引,则可以将对应的单元格原值覆盖掉,即为修改。这里根据要求获得所需的行列索引
    #漏洞分析:如果需要修改一个人的多个列值,那么是执行多次上述查找的代码吗?可以用装饰器做个次数的传参么?有时间研究.
    可看下图,由索引可知,我要修改的是第三行第四列,睡觉改为喝水。索引得出正确

     6、4,5结合成标题6的内容。实现了对已有文件的某个单元格,与之同行的另一个单元格的修改

     
    #------------------------------开始获取需要修改的索引坐标-------------------------
    import xlrd
    import xlwt
    from xlutils.copy import copy
    
    #------------------开始修改----------------------------
    # def recindex():
    workbook = xlrd.open_workbook('mcw_test.xlsx')  # 打开工作簿
    Data_sheet = workbook.sheets()[0]
    row1 = Data_sheet.row_values(0)         #取出第一行
    dic_col_s={str(i):row1[i] for i in range(0,len(row1))} #将第一行的每个元素加个序数标记,标记列表索引,让列表索引和标题对应,由标题则可以从字典获取列号,即列表索引+1,这里需要的是索引
    col2=Data_sheet.col_values(1)       #取出第二列,
    dic_row_s={str(i):col2[i] for i in range(0,len(col2))} #将第二列的每个元素加个序数标记,标记为第二列的列表索引。让名字和列表索引对应,就可以在字典中由名字得行号,即列表索引+1。这里需要的是这个索引
    mtitle="爱好"     #需要修改哪个标题
    mname="小郭吹雪"    #需要修改哪个人的
    rindex="".join([i for i in dic_row_s if dic_row_s[i]==mname])   #获取要修改的标题所在行的索引
    cindex="".join([i for i in dic_col_s if dic_col_s[i]==mtitle])   #获取要修改的那个人所在的列索引
    
    rindex=list(rindex)
    rindex="".join(rindex)
    rindex=int(rindex)
    
    
    cindex=list(cindex)
    cindex="".join(cindex)
    cindex=int(cindex)
    # print(rindex,cindex)
        # return rindex,cindex
    # rindex,cindex=recindex()
    # print(rindex,cindex)  #获得要修改的单元格的行索引和列索引
    # rindex=2
    # cindex=3
    # 打开想要更改的excel文件
    old_excel = xlrd.open_workbook('mcw_test.xlsx', formatting_info=True)
    # 将操作文件对象拷贝,变成可写的workbook对象
    new_excel = copy(old_excel)
    # 获得第一个sheet的对象
    ws = new_excel.get_sheet(0)
    # 写入数据
    ws.write(rindex,cindex, '喝水') #修改第3行第4列
    # 另存为excel文件,并将文件命名,可以重新命名,应该也可以覆盖掉
    new_excel.save('mcw_test.xlsx')
    # ------------------修改接收并保存---------------------

    #上述代码我想说的点。

     1)一是我用了那个手动创建的文件做的Excel文件进行修改,但是报错了。后来用了之前重写过得文件就好了,即下面这个没有漂亮格式的文件

     2)而是我竟然遇到了一个问题,id查看xlrd读文件接收的变量rindex和cindex一样地址的,后面就不能对文件进行修改。于是我用列表转化,再用int转化,知道内存地址改变了才能不报错的往下执行修改操作。思考,为啥xlrd读出来的不能在下面进行格式化呢?xlrd似乎没有打开然后关闭的方法

    3)有时间把上面的写成修改Excel的函数,

    报错信息:
    Traceback (most recent call last):
      File "C:mcw	empxlrd_sty.py", line 25, in <module>
        old_excel = xlrd.open_workbook('mcw_test.xlsx', formatting_info=True)
      File "C:mcwvenvlibsite-packagesxlrd\__init__.py", line 138, in open_workbook
        ragged_rows=ragged_rows,
      File "C:mcwvenvlibsite-packagesxlrdxlsx.py", line 798, in open_workbook_2007_xml
        raise NotImplementedError("formatting_info=True not yet implemented")
    NotImplementedError: formatting_info=True not yet implemented

     7、(表格函数1:改)读取单元格索引并修改单元格的两个函数

    import xlrd
    from xlutils.copy import copy
    fpath='mcw_test.xlsx'
    mname="小郭吹雪"
    mtitle="爱好"
    modifycontent="睡觉"
    def recindex(path,mname,mtitile):
        '''
        定位单元格,返回单元格行列索引供modify_cell函数使用
        :param path: Excel文件路径
        :param mname: 要修改的名字
        :param mtitile: 要修改的标题
        :return: 单元格的行列索引号。rindex:行,cindex:列索引
        '''
        workbook = xlrd.open_workbook(path)
        Data_sheet = workbook.sheets()[0]
        row1 = Data_sheet.row_values(0)
        dic_col_s={str(i):row1[i] for i in range(0,len(row1))}
        col2=Data_sheet.col_values(1)
        dic_row_s={str(i):col2[i] for i in range(0,len(col2))}
        rindex="".join([i for i in dic_row_s if dic_row_s[i]==mname])
        cindex="".join([i for i in dic_col_s if dic_col_s[i]==mtitle])
        rindex=int("".join(list(rindex)))
        cindex=int("".join(list(cindex)))
        return rindex,cindex
    def modify_cell(path,rindex,cindex,modifycontent):
        """
        修改文件指定单元格内容,由recindex函数返回值获取rindex和cindex参数
        :param path: 要修改的Excel文件路径
        :param rindex:recindex返回值元组第一个元素,行索引
        :param cindex:recindex返回值元组第二个元素,列索引
        :param modifycontent: 要修改的单元格新的内容
        :return:
        """
        old_excel = xlrd.open_workbook(path, formatting_info=True)
        new_excel = copy(old_excel)
        ws = new_excel.get_sheet(0)
        ws.write(rindex,cindex, modifycontent)
        new_excel.save(path)
    val=recindex(fpath,mname,mtitle)
    modify_cell(fpath,val[0],val[1],modifycontent)

     8、(表格函数2:增)往工作表中追加多行数据

    import xlrd
    from xlutils.copy import copy
    fpath='mcw_test.xlsx'
    valueli=[["3","明明如月","","听歌","2030.07.01"],
             ["4","志刚志强","","学习","2019.07.01"],]
    def write_excel_xls_append(path, value):
        index = len(value)  # 获取需要写入数据的行数
        workbook = xlrd.open_workbook(path)  # 打开工作簿
        sheets = workbook.sheet_names()  # 获取工作簿中的所有表格
        worksheet = workbook.sheet_by_name(sheets[0])  # 获取工作簿中所有表格中的的第一个表格
        rows_old = worksheet.nrows  # 获取表格中已存在的数据的行数
        new_workbook = copy(workbook)  # 将xlrd对象拷贝转化为xlwt对象
        new_worksheet = new_workbook.get_sheet(0)  # 获取转化后工作簿中的第一个表格
        for i in range(0, index):
            for j in range(0, len(value[i])):
                new_worksheet.write(i+rows_old, j, value[i][j])  # 追加写入数据,注意是从i+rows_old行开始写入
        new_workbook.save(path)  # 保存工作簿
        print("xls/xlsx格式表格【追加】写入数据成功!")
    write_excel_xls_append(fpath,valueli)

     删除备注后的代码:

    import xlrd
    from xlutils.copy import copy
    fpath='mcw_test.xlsx'
    valueli=[["3","明明如月","","听歌","2030.07.01"],
             ["4","志刚志强","","学习","2019.07.01"],]
    def write_excel_xls_append(path, value):
        """
        在excel第一个工作表中追加一行或多行数据
        :param path: 要修改的Excel文件路径
        :param value: 要添加的内容,每行都是列表元素,如示例:[["3","明明如月","","听歌","2030.07.01"],
                                                               ["4","志刚志强","","学习","2019.07.01"],]
        """
        index = len(value)
        workbook = xlrd.open_workbook(path)
        sheets = workbook.sheet_names()
        worksheet = workbook.sheet_by_name(sheets[0])
        rows_old = worksheet.nrows
        new_workbook = copy(workbook)
        new_worksheet = new_workbook.get_sheet(0)
        for i in range(0, index):
            for j in range(0, len(value[i])):
                new_worksheet.write(i+rows_old, j, value[i][j])
        new_workbook.save(path)
        print("xls/xlsx格式表格【追加】写入数据成功!")
    write_excel_xls_append(fpath,valueli)

     9、(表格函数3:查1)显示文件的每行内容,制表符分隔每列

    import xlrd
    fpath="mcw_test.xlsx"
    def read_excel_xls(path):
        workbook = xlrd.open_workbook(path)  # 打开工作簿
        sheets = workbook.sheet_names()  # 获取工作簿中的所有表格
        worksheet = workbook.sheet_by_name(sheets[0])  # 获取工作簿中所有表格中的的第一个表格
        for i in range(0, worksheet.nrows):
            for j in range(0, worksheet.ncols):
                print(worksheet.cell_value(i, j), "	", end="")  # 逐行逐列读取数据#分隔符加空格实现对其点的
            print()
    read_excel_xls(fpath)
    -----------------------------------结果:
    id     姓名     性别     爱好     毕业时间     
    2.0     小马过河     男     跑步     2017.07.01     
    5.0     小郭吹雪     男     睡觉     2016.07.01     
    1.0     樱花小月     女     吃饭     2018.07.01     
    3     明明如月     女     听歌     2030.07.01     
    4     志刚志强     男     学习     2019.07.01     

    10、(表格函数4:查2)以列表形式显示文件的每行内容

    import xlrd
    fpath="mcw_test.xlsx"
    def read_excel_xls(path):
        """
        打印所有行的内容,每行内容以列表形式展示
        :param path:  要查看的Excel文件路径
        """
        workbook = xlrd.open_workbook(path)  # 打开工作簿
        sheets = workbook.sheet_names()  # 获取工作簿中的所有表格
        worksheet = workbook.sheet_by_name(sheets[0])  # 获取工作簿中所有表格中的的第一个表格
        rows = worksheet.row_values(0)
        for i in range(0, worksheet.nrows):
            rows = worksheet.row_values(i) # 逐行逐列读取数据#分隔符加空格实现对其点的
            print(rows)
    read_excel_xls(fpath)
    ------------------------------------结果:
    ['id', '姓名', '性别', '爱好', '毕业时间']
    [2.0, '小马过河', '', '跑步', '2017.07.01']
    [5.0, '小郭吹雪', '', '睡觉', '2016.07.01']
    [1.0, '樱花小月', '', '吃饭', '2018.07.01']
    ['3', '明明如月', '', '听歌', '2030.07.01']
    ['4', '志刚志强', '', '学习', '2019.07.01']

     11、(表格函数5:建)新建表格并写入数据

    import xlwt
    fpath='修仙学院人名单.xlsx'
    sheet_name="小马过河工作表"
    valueli=[['id', '姓名', '性别', '爱好', '毕业时间'],
             ["3","明明如月","","听歌","2030.07.01"],
             ["4","志刚志强","","学习","2019.07.01"],]
    def write_excel_xls(path, sheet_name, value):
        index = len(value)  # 获取需要写入数据的行数
        workbook = xlwt.Workbook()  # 新建一个工作簿
        sheet = workbook.add_sheet(sheet_name)  # 在工作簿中新建一个表格
        for i in range(0, index):
            for j in range(0, len(value[i])):
                sheet.write(i, j, value[i][j])  # 像表格中写入数据(对应的行和列)
        workbook.save(path)  # 保存工作簿
        print("xls/xlsx格式表格写入数据成功!")
    write_excel_xls(fpath,sheet_name,valueli)

    12、(表格函数6:删)未写,待增添







     参考:

    1)https://www.jianshu.com/p/a8391a2b8c6c
    2)https://blog.csdn.net/blog_user_zk/article/details/75334566

  • 相关阅读:
    Java ClassLoader
    Java Hashcode
    Java 装箱 拆箱
    Java 深拷贝,浅拷贝
    Java IO流
    JVM内存模型
    C语言中的__FILE__、__LINE__和#line
    OpenMP和MPI的区别
    visual studio代码备份精减
    MVVM设计模式在WPF中的应用
  • 原文地址:https://www.cnblogs.com/machangwei-8/p/10739115.html
Copyright © 2020-2023  润新知