启明办公

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 93|回复: 0

office表格处理(Excel,Word)

[复制链接]

2

主题

5

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2022-12-12 15:16:54 | 显示全部楼层 |阅读模式
背景介绍:在办公过程中会遇到将word文档中的表格提取,将表格内容填写到Excel中,或者将表格内容进行清洗(批量替换,正则匹配识别后大小写转换,或者添加索引等等);
这里是我自己写的一些方法,仅供参考,如有不足,请斧正:
def get_table(table,worksheet):
    '''
    将word文档中的表格table填入至创建好的EXCEL表单worksheet中
    :param table:word文档中的表格
    :param worksheet:EXCEL中的表单
    :return:返回填好的EXCEL表单
    '''
    try:
        i = 1
        for row in table.rows:
            j = 1
            for cell in row.cells:
                worksheet.cell(i,j).value = cell.text
                # print(cell.text)
                j += 1
            i += 1
    except:Exception
    pass
    return worksheet
#上述模块用到了try...except来提升可用性--即遇到错误后继续执行不会终端进程,若不需要,可以注掉

#方法调用示例:
document=docx.Document(filePath_send)#打开word文档,filePath_send为word文档的路径+文件名(如:r"C:\python\project\word文档.docx")
#注意:docx库仅支持.docx格式的word文档,如有其它需求,酌情换库如整张worksheet拷贝时等等;
wb = Workbook()#创建工作簿
switchs_sheet = wb.create_sheet('switchs',1)
    tables = document.tables # 获取文档中的所有表格
    for table in tables:
        get_table(table, switchs_sheet)上述方法是一个将word中(也可以是Excel等)的确定的某一个表格,逐行逐单元将内容拷贝到Excel某个确定的表单中;
还有一个根据表头来从一个表格中往另一个表格中填值的方法,两个表格之间的表头的位置(所在的列)、名称、大小写格式都可以不一样,但需要在源码中自己设计;不废话上代码:
def get_colomn_12many(sheet, key_words_list):
    '''
    该函数通过输入关键词列表key_words_list,
    只要表单(sheeet)中表头的关键词,在该列表中查找到,即返回表头所在的列result
    :param sheet: 所查找的表单名称,唯一的表单
    :param key_words_list: 所有可能出现的关键词组成的列表
    :return: 返回索要查找的关键字所在的列(inter)
    '''
    try:
        for key_word in key_words_list:
            col = 1
            for cell in sheet[1]:
                if key_word in cell.value:
                    result = col
                    break
                else:
                    col += 1
        return result
    except:Exception
    print("can't find colomn")
    return None
    pass

def fill_value(sheet_send, colomn_send_title_list, sheet_resive, colomn_resive_title_list):
    '''
    从表单sheet_send中的colomn_send_title_list这一列往sheet_resive的colomn_resive_title_list这一列填值
    :param sheet_send: 接收数据的表单(对象)
    :param colomn_send_title_list: 接收数据的表单表头名称列表,只要关键字在这个list中,即可找到该列,需要输入模板中的表单列头名称
    :param sheet_resive: 发送数据的表单(对象)
    :param colomn_resive_title_list: 发送数据的表单表头名称列表,只要关键字在这个list中,即可找到该列,需要输入各个项目的所有情况
    :return: 返回接受、发送数据的表单(对象)
    '''
    try:
        for row in range(2, sheet_send.max_row + 1):
            sheet_resive.cell(row, get_colomn_12many(sheet_resive, colomn_resive_title_list)).value \
            = sheet_send.cell(row, get_colomn_12many(sheet_send, colomn_send_title_list)).value
    except:Exception
    print("can't fill value")

调用示例:
fill_value(wb_send['表单名称'], ['表头名称1','表头名称2'], wb_recive['表单名称'], ['表头名称'])
#对于wb_recive中的表单来讲必须是确定的某个表头,相当于目标填写位置,其实可以不使用列表来做形参,
#对于wb_send中的表单来讲,表头可以多个,我当时遇到的就是不确定要被抄下来的数据到底在那一列,
#只知道它的表头叫啥,而且写法不一样,好在仅此一列,所以就这么搞了还有一些方法,感觉也都是没啥技巧的代码堆砌,后面遇到好玩的再更新吧。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|启明办公

Copyright © 2001-2013 Comsenz Inc.Template by Comsenz Inc.All Rights Reserved.

Powered by Discuz!X3.4

快速回复 返回顶部 返回列表