精华内容
下载资源
问答
  • python实现word转成自定义格式的excel文档(解决思路和代码) 支持按照文件夹去批量处理,也可以单独一个文件进行处理,并且可以自定义标识符 最近在开发一个答题类的小程序,到了录入试题进行测试的时候了,发现一...
  • 主要介绍了python实现word文档批量转成自定义格式的excel文档的解决思路及实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
  • python实实现现word文文档档批批量量转转成成自自定定义义格格式式的的excel文文档档的的思思路路及及实实例例代代码码 这篇文章主要介绍了python实现word文档批量转成自定义格式的excel文档的解决思路及实例代码...
  • 很多时候,我们无论是做毕业论文或者公司办公文档(如:产品操作手册、技术文档、招标书)等等,默认第一页往往是没有页码的,那我们怎样设置页码从某一页开始呢? 这里以毕业论文为例,页码从第三页开始 光标...

    前言

    很多时候,我们无论是做毕业论文或者公司办公文档(如:产品操作手册、技术文档、招标书)等等,默认第一页往往是不会设置页码的,那我们怎样设置页码从某一页开始呢?
    在这里插入图片描述

    这里以毕业论文为例,页码从第三页开始

    1. 光标处于想要设置页码的第三页开始位置,点击 页面布局>>分割线>>下一页
    2. 光标放在第三页的页脚处,点击 页码>>页面底端(选择页码的格式)
    3. 光标放在第三页的页脚处,点击 页码>>设置页码格式(页码编号选择起始页码为1),取消链接到前一节
    4. 将第一页与第二页页码删除,光标放在目的页脚处,点击 页脚>>删除页脚

    注:删除分隔符:视图>>>大纲>>找到对应想要删除的分隔符光标放在相应位置delete即可

    展开全文
  • 来源:https://blog.csdn.net/Jacky_kplin/article/details/104367844python实现word转成自定义格式的excel文档(解决思路...到了录入试题进行测试的时候了,发现一个问题,试题都是word文档格式的,每份有100题左右...

    7d1e87f841d29c89b440279393295d60.png

    来源:https://blog.csdn.net/Jacky_kplin/article/details/104367844

    python实现word转成自定义格式的excel文档(解决思路和代码)

    支持按照文件夹去批量处理,也可以单独一个文件进行处理,并且可以自定义标识符

    最近在开发一个答题类的小程序,到了录入试题进行测试的时候了,发现一个问题,试题都是word文档格式的,每份有100题左右,拿到的第一份试题,光是段落数目就有800个。而且可能有几十份这样的试题。

    而word文档是没有固定格式的,想批量录入关系型数据库mysql,必须先转成excel文档。这个如果是手动一个个粘贴到excel表格,那就头大了。

    我最终需要的excel文档结构是这样的:每道题独立占1行,每1列是这道题的一项内容,大概就是问题、选项A、选项B等等。

    5bd8525f7e90550bee70e9c75b9d0846.png

    但word文档是这种结构,如果按照网上通用的方式去转,基本上你得到的结果就是一大坨文字都在一格里,根本不符合需求。

    2fc2d5212d20c23489c9440f6ffe1fc0.png

    最后我想到了一个解决思路,可以实现这个需求,先看看我转出来的结果:

    81d5a8bba3a7dafa2ef6c659cc00e596.gif

    98d714d3e0acb288920d1f3f19cfc9c0.png

    这个格式虽然跟最终的有点差别,但是只要在excel文档或者在代码里稍微再修改一下,就能完全符合要求了。

    废话少说,先贴出代码,看得懂的可以直接拿去用,看不懂的,可以看我后面的具体说明。

    已经把它封装成通用脚本了,你可以直接调用。

    import pandas as pdimport os# 初始处理函数1,先对初始处理结果进行判断def initail_handle_by_range(file_path, max_page_num, split_str):    df = pd.read_table(file_path)    # 2、先转成Series    S = pd.Series(df['column1'].values)    # 3、转成列表,列表的每个元素就是每个段落    list = S.tolist()    # 传入一个max_page_num    # 4、遍历列表,取出每个段落,按“.”切割,取出第一个元素进行判断,如果它是题号,就应该得到"1"或者"10"    index_list = []    for content in list:        try:            # 不是每个段落都有“.”可以切割的,会报错,报错就跳过            first_str = content.split('%s'%split_str)[0]            # 5、根据最大的题号,自动生成匹配的字符串,用来匹配题号(每个匹配字符串都放在patch_list中)            patch_list = ['%d' % i for i in range(1, max_page_num + 1)]            # 6、比对切割得到的第一个元素,如果它在匹配的字符串中,就获取它在列表中的索引,并把获取到的结果添加到列表index_list中,这就知道了每道题的开头在l中的哪个位置了            if first_str in patch_list:                index = list.index(content)                index_list.append(index)        except:            pass    # 7、根据索引列表,我们可以知道每道题的第一段和最后一段在l中的哪个位置    # index_list = [0, 8, 16]    # print(index_list)    # 先计算每道题长度是否一致,不一致的,设置is_same_length = False    is_same_length = True    length = index_list[1] - index_list[0]    max_index = len(list)    for i in index_list:        # 如果i不是最后一个,那么start就是i,end就是i的下一个        if i < index_list[-1]:            start = i            end = index_list[index_list.index(i) + 1]        else:            start = i            end = max_index        # 判断长度是否一致,不一致就对长度进行比较,把大的赋值给长度        if (end - start) != length:            is_same_length = False            if (end - start) > length:                length = (end - start)    result = [is_same_length, index_list, list, length]    return result# 初始处理函数1,先对初始处理结果进行判断def initail_handle_by_patchstr(file_path, patch_str, split_str):    df = pd.read_table(file_path)    # 2、先转成Series    S = pd.Series(df['column1'].values)    # 3、转成列表,列表的每个元素就是每个段落    list = S.tolist()    # 传入一个max_page_num    # 4、遍历列表,取出每个段落,按“.”切割,取出第一个元素进行判断,如果它是题号,就应该得到"1"或者"10"    index_list = []    for content in list:        try:            # 不是每个段落都有“.”可以切割的,会报错,报错就跳过            first_str = content.split('%s'%split_str)[0]            # 6、比对切割得到的第一个元素,如果它在匹配的字符串中,就获取它在列表中的索引,并把获取到的结果添加到列表index_list中,这就知道了每道题的开头在l中的哪个位置了            if first_str == patch_str:                index = list.index(content)                index_list.append(index)        except:            pass    # 7、根据索引列表,我们可以知道每道题的第一段和最后一段在l中的哪个位置    # index_list = [0, 8, 16]    # print(index_list)    # 先计算每道题长度是否一致,不一致的,设置is_same_length = False    is_same_length = True    length = index_list[1] - index_list[0]    max_index = len(list)    for i in index_list:        # 如果i不是最后一个,那么start就是i,end就是i的下一个        if i < index_list[-1]:            start = i            end = index_list[index_list.index(i) + 1]        else:            start = i            end = max_index        # 判断长度是否一致,不一致就对长度进行比较,把大的赋值给长度        if (end - start) != length:            is_same_length = False            if (end - start) > length:                length = (end - start)    result = [is_same_length, index_list, list, length]    return result# 传入一个文件路径和一个匹配的字符串,至少2个符号,例如"#."def file_handle_by_patchstr(file_path, patch_str, split_str):    result = initail_handle_by_patchstr(file_path, patch_str, split_str)    # 接收初始处理函数的结果    is_same_length = result[0]    index_list = result[1]    list = result[2]    length = result[3]    # 先根据每道题的长度构造一个空的dict,最后用来生成dataFrame    dict = {}    for i in range(1, (length + 1)):        dict['colomn%d' % i] = []    # print(dict)    max_index = len(list)    for i in index_list:        # 如果i不是最后一个,那么start就是i,end就是i的下一个        if i < index_list[-1]:            start = i            end = index_list[index_list.index(i) + 1]        else:            start = i            end = max_index        # 遍历一轮获得的结果就是我们要写入excel的一行        colomn = 1        for index in range(start, end):            # 遍历一次获得的结果就是我们要写入excel的一格            content = list[index]            # 每遍历一次就在一个dict中取出某一列,给它加上这个数据            dict['colomn%d' % colomn].append(content)            colomn += 1            # 在遍历到最后一轮的时候            if index == (end - 1):                # 判断是否需要插入空值                if not is_same_length and ((end - start) < length):                    # 可能缺了2列,也可能缺了1列                    content = ''                    # 如果只是缺了一列,在现有的index上,加1,就是下一列,补上空值                    if (length - (end - start)) == 1:                        colomn = (end - start) + 1                        dict['colomn%d' % (colomn)].append(content)                    else:                        # 如果缺失了2列以上,就遍历,给之后的每一列都补上空值                        for i in range(length - (end - start)):                            colomn = length - i                            dict['colomn%d' % (colomn)].append(content)    final_df = pd.DataFrame(dict)    new_file_path = file_path.split('.')[0] + '.xlsx'    final_df.to_excel(r'%s' % new_file_path)def file_handle_by_range(file_path, max_page_num, split_str):    result = initail_handle_by_range(file_path, max_page_num, split_str)    # 接收初始处理函数的结果    is_same_length = result[0]    index_list = result[1]    list = result[2]    length = result[3]    # 先根据每道题的长度构造一个空的dict,最后用来生成dataFrame    dict = {}    for i in range(1,(length+1)):        dict['colomn%d'%i] = []    max_index = len(list)    for i in index_list:        # 如果i不是最后一个,那么start就是i,end就是i的下一个        if i < index_list[-1]:            start = i            end = index_list[index_list.index(i) + 1]        else:            start = i            end = max_index        # 遍历一轮获得的结果就是我们要写入excel的一行        colomn = 1        for index in range(start, end):            # 遍历一次获得的结果就是我们要写入excel的一格            content = list[index]            # 每遍历一次就在一个dict中取出某一列,给它加上这个数据            dict['colomn%d' % colomn].append(content)            colomn += 1            # 在遍历到最后一轮的时候            if index == (end - 1):                # 判断是否需要插入空值                if not is_same_length and ((end-start)                    # 可能缺了2列,也可能缺了1列                    content = ''                    # 如果只是缺了一列,在现有的index上,加1,就是下一列,补上空值                    if (length-(end-start)) == 1:                        colomn = (end-start) +1                        dict['colomn%d'% (colomn)].append(content)                    else:                        # 如果缺失了2列以上,就遍历,给之后的每一列都补上空值                        # 8-6 = 2, i = 0, 1                        for i in range(length-(end-start)):                            colomn = length - i                            dict['colomn%d' % (colomn)].append(content)    final_df = pd.DataFrame(dict)    new_file_path = file_path.split('.')[0] + '.xlsx'    final_df.to_excel(r'%s'%new_file_path)# 传入一个文件夹路径,最大的迭代数字,切割字符串def dir_handle_by_range(dir_path, max_page_num, split_str):    files = os.listdir(dir_path)  # 获取当前目录的所有文件及文件夹    for file in files:        file_path = os.path.join(dir_path, file)  # 遍历获取每个文件的绝对路径        result = initail_handle_by_range(file_path, max_page_num, split_str)        # 接收初始处理函数的结果        is_same_length = result[0]        index_list = result[1]        list = result[2]        length = result[3]        # 先根据每道题的长度构造一个空的dict,最后用来生成dataFrame        dict = {}        for i in range(1, (length + 1)):            dict['colomn%d' % i] = []        max_index = len(list)        for i in index_list:            # 如果i不是最后一个,那么start就是i,end就是i的下一个            if i < index_list[-1]:                start = i                end = index_list[index_list.index(i) + 1]            else:                start = i                end = max_index            # 遍历一轮获得的结果就是我们要写入excel的一行            colomn = 1            for index in range(start, end):                # 遍历一次获得的结果就是我们要写入excel的一格                content = list[index]                # 每遍历一次就在一个dict中取出某一列,给它加上这个数据                dict['colomn%d' % colomn].append(content)                colomn += 1                # 在遍历到最后一轮的时候                if index == (end - 1):                    # 判断是否需要插入空值                    if not is_same_length and ((end - start) < length):                        # 可能缺了2列,也可能缺了1列                        content = ''                        # 如果只是缺了一列,在现有的index上,加1,就是下一列,补上空值                        if (length - (end - start)) == 1:                            colomn = (end - start) + 1                            dict['colomn%d' % (colomn)].append(content)                        else:                            # 如果缺失了2列以上,就遍历,给之后的每一列都补上空值                            for i in range(length - (end - start)):                                colomn = length - i                                dict['colomn%d' % (colomn)].append(content)        final_df = pd.DataFrame(dict)        new_file_path = file_path.split('.')[0] + '.xlsx'        final_df.to_excel(r'%s' % new_file_path)# 传入一个文件夹路径和一个匹配的字符串,至少2个符号,例如"#."def dir_handle_by_patchstr(dir_path, patch_str, split_str):    files = os.listdir(dir_path)  # 获取目录的所有文件及文件夹    for file in files:        file_path = os.path.join(dir_path, file)  # 遍历获取每个文件的绝对路径        print(file_path)        result = initail_handle_by_patchstr(file_path, patch_str, split_str)        # 接收初始处理函数的结果        is_same_length = result[0]        index_list = result[1]        list = result[2]        length = result[3]        # 先根据每道题的长度构造一个空的dict,最后用来生成dataFrame        dict = {}        for i in range(1, (length + 1)):            dict['colomn%d' % i] = []        # print(dict)        max_index = len(list)        for i in index_list:            # 如果i不是最后一个,那么start就是i,end就是i的下一个            if i < index_list[-1]:                start = i                end = index_list[index_list.index(i) + 1]            else:                start = i                end = max_index            # 遍历一轮获得的结果就是我们要写入excel的一行            colomn = 1            for index in range(start, end):                # 遍历一次获得的结果就是我们要写入excel的一格                content = list[index]                # 每遍历一次就在一个dict中取出某一列,给它加上这个数据                dict['colomn%d' % colomn].append(content)                colomn += 1                # 在遍历到最后一轮的时候                if index == (end - 1):                    # 判断是否需要插入空值                    if not is_same_length and ((end - start) < length):                        # 可能缺了2列,也可能缺了1列                        content = ''                        # 如果只是缺了一列,在现有的index上,加1,就是下一列,补上空值                        if (length - (end - start)) == 1:                            colomn = (end - start) + 1                            dict['colomn%d' % (colomn)].append(content)                        else:                            # 如果缺失了2列以上,就遍历,给之后的每一列都补上空值                            for i in range(length - (end - start)):                                colomn = length - i                                dict['colomn%d' % (colomn)].append(content)        final_df = pd.DataFrame(dict)        print(final_df)        print(file_path)        new_file_path = file_path.split('.')[0] + '.xlsx'        print(new_file_path)        final_df.to_excel(r'%s' % new_file_path)if __name__ == '__main__':    # 文件路径    # file_path = r'C:\Users\Administrator\PycharmProjects\exchange_file\2018-04 技能操作真题.txt'    # 文件夹路径    dir_path = r'C:\Users\Administrator\PycharmProjects\exchange_file\mytest'    # 根据数字处理具体文件,参数传文件路径,可迭代的最大数可自定义,分隔符也自定义    # file_handle_by_range(file_path, 100, '.')    # 根据自定义匹配符处理具体文件,参数传文件路径,匹配符可以自定义,切割符也可以自定义    # file_handle_by_patchstr(file_path, '#', '.')    # 根据数字处理具体整个文件夹,参数传文件路径,可迭代的最大数可自定义,分隔符也自定义    # dir_handle_by_range(dir_path, 100, '.')    # 根据自定义匹配符处理具体文件夹,参数传文件路径,匹配符可以自定义,切割符也可以自定义    # dir_handle_by_patchstr(dir_path, '#', '.')

    一、先说一下实现这个需求的处理逻辑

    解决这个需求的关键点是什么:

    1、python怎么读取这个文件的内容?

    python有相关的word操作库可以读取,但是读取到的结果不方便操作。我们最终是要让它生成excel文件的,所以可以用python非常强大的科学计算包pandas来读取操作数据更好。

    但pandas不能直接读取word文件,所以,需要先把它转成txt文档,这一步很简单,打开word,全部复制到一份新的txt文件中就行了。(注意要在第一行给它加上列名,我直接加了个colomn1,代表是第一列)

    简单处理后的txt文档的结构类似这样:

    d55e139331de359d2dce368496ee6304.png

    2、读取到的数据如何处理?

    使用pandas读取到的数据是一个dataFrame,dataFrame的结构就类似于我们在excel文档里面那样行列分明的。但是,它从txt读取出来的格式是全部内容都视为1列的,而txt中的每一段,在它这里就是每一行(注意是每一段对应一行,而不是每一行对应每一行)

    预览一下:结果显示800行,1列。也就是在txt文档中有800个段落。

    2c151275b781e2ec8549a9e105e7b5b5.png

    3、接下来怎么处理呢?

    pandas强大的地方就在这里了,它可以直接把这1列的内容全部转成Series,Series是什么你可以不用管,你只需要知道Series可以直接转成列表list就行了。有了list我们就方便操作了。

    以上几步就实现了从word里面读取数据,并转化成python的数据类型list了。list里面的每个元素,就等同于我们word里面的每一个段落。

    控制台打印出来的就是这样:

    下面的800是计算出这个列表的长度,代表有800个元素。

    fa3ce600ba1f39da8577c250361b0b2d.png

    接下来我们的需求就变成了:怎么把一个列表,转成有明确行列结构的excel表格了。

    这个要分为2种情况来说:

    1、你的word文档结构相对合理些,每道题都固定是X个段落(例如每道题都是8个段落),这个解决就很简单了。因为这种情况对应就是在list中,每8个元素构成了1道题,你只要按照规律,8个8个取出,最后批量写入excel就行了。(这种解决起来比较简单,就不详细说了)

    2、另一种情况比较麻烦,就是word文档的结构不规范,有的题目可能是8个段落,有的可能是7段,有的是6段。那么要怎么解决呢?

    解决这个问题有几个关键点:

    1、excel表格是行列结构的,它每一行的数据来源于这个txt文档的第几行?(也就是list里面的第几个元素)

    所以我们只要把每道题在list中的索引找出来就行了。

    观察一下源数据,它每道题的开头都是数字加1个英文符号“.”,例如:“1.”和“2.”,最大的是"100.",并且其他段落的开头都不会出现这个结构。那么就简单了,我先构造出一个patch_list=[‘1’, ‘2’, ‘3’…‘100’],用来做匹配。

    然后再遍历源数据列表,对列表的每个元素按“.”号切割,切割后拿到它的第一个元素,拿这个元素跟pacth_lis进行匹配,如果它是在patch_list中的,就代表它是每道题的开头。此时就记录下它的索引,并且把这个索引值存放到一个新列表index_list中。

    下面是我获取到的index_list:

    debbf562523d8fceae5b7a91ab3e2ed0.png

    0代表了第一道题是在列表的第1个元素开始的,8代表第二道题在列表的第9个元素开始。

    于是我们就知道每道题的开头是在列表中的哪个位置了。

    2、拿到了每道题的索引,然后怎么做呢?

    最终我们是要转存到excel文档中的, pandas怎么转excel?

    很简单的,只要你构造出一个dataFrame出来,调用pandas的to_excel方法,就能存入excel文档了。

    3、问题的关键就变成了,有了每道题的索引,怎么把它转成dataFrame结构。

    下面演示一下,假如你想要构造一个dataFrame,需要什么样的数据结构,构造出来的dataFrame在控制台的输出结果是怎么样的,最后生成的excel表格是怎么样的。

    dict = {'colomn1': ['问题1', '问题2', '问题3'],        'colomn2': ["A:问题1的A选项", "A:问题2的A选项", "A:问题3的A选项"],        'colomn3': ['B:问题1的B选项', 'B:问题2的B选项', 'B:问题3的B选项']}df = pd.DataFrame(dict)print(df)df.to_excel(r'C:\Users\Administrator\PycharmProjects\exchange_file\test.xlsx')

    这个就是调用pandas的DataFrame方法,用字典dict生成的一个dataFrame数据。

    这个dataFrame在控制台打印出来就是:

    00eb928bc1761822b0c0ade8514dc278.png

    这个结构存入excel就是对应表格的行和列了。这个结构就符合我的实际需求了。

    6ccd1aa06c5bdc429c897e812757e4bd.png

    所以我们要构造出这个dataframe的关键就是:

    把所有数据梳理一遍,构造成类似这样的一个字典:

    dict = {'colomn1': ['问题1', '问题2', '问题3'],        'colomn2': ["A:问题1的A选项", "A:问题2的A选项", "A:问题3的A选项"],        'colomn3': ['B:问题1的B选项', 'B:问题2的B选项', 'B:问题3的B选项']}

    那么怎么构建这个dict呢?

    我们源数据转出来的list结构是类似这样的:

    list = [‘问题1’,“A:问题1的A选项”, ‘B:问题1的B选项’…‘问题2’,“A:问题2的A选项”, ‘B:问题2的B选项’]

    而我们前面得到的index_list=[0, 8, 16。。。。]

    它记录了“问题1”,“问题2”等等直到“问题100”是在哪个位置开始的,所以我们只需要把index_list遍历一下,轮流取出它的每个元素,它就是每道题的开始位置,然后拿到紧跟在这个元素的下一个是什么,用这个减去1就知道了每道题的开始位置start和结尾位置end是多少了。

    接着使用

    for i in range(start, end):  content = list[i] 

    就可以轮番从list中取出每道题的各项内容,取到的第一个就加到dict的colomn1列表中,第二个就加到dict的colomn2中,按照这个规律,就能把list的内容分开插入到dict中的各个列表中了。

    但在这个过程中,可能你每道题的段落数目不一致,也就是你按照这个规律从list中取出的元素,可能每次取出的数量都不一样。这点需要注意,如果没有对它进行处理,最后会导致转出来的文件内容错位了,例如你的文档里面,第一题有8个段落,第二题只有7个,第三题有8个段落,没处理这个问题的话,最后第三题的第8个段落,就会跑到第7题那边了。并且最终dataFrame会无法生成excel文件。

    那么这个问题怎么解决呢?

    在正式调用处理函数生成excel文件之前,可以先对文件预处理,拿到它们的数据进行判断,如果判断到它每个间隔不一样,有的缺少段落,那么就让数据预处理函数返回一个值为False,间隔一样就返回True。接着在真正的数据提取环节,根据这个进行判断,如果判断到它值是Fales,那么就在每一轮遍历提取数据的最后一次遍历,一次性在它后面的缺失数据的列加上空字符串,作为占位用,这样最后得到的列表长度就都一样了,并且在最后生成的excel表中,它是一个空格。

    最后用dict生成dataFrame,再写入excel文档,我们就大功告成了。

    二、再说一下具体怎么使用:

    一、运行必须的工具

    1、python解释器(pycharm或其他);

    2、python自带模块:os;

    3、自行安装模块:pandas,openpyxl;

    自行安装的模块,在控制台pip install pandas和pip install openpyxl就行了。

    二、怎么调用:

    1、先要做数据预处理:

    先要把word文档的内容复制到txt文档中,并且在第一行加上"column1",处理后像下面这样:

    400954155356a8a0356aaefe0f8fcb97.png

    接着要看你的文档内容是否有题号,如果有的话:

    比如像我这个,有具体的题号1-100题,并且它的写法都是“1.”,在题号后面跟了个英文字符’.‘,顺序递增到100。

    2678da24661f915fbc074249f1fcdd68.png

    那么你就可以调用file_handle_by_range。

    你给它传第一个参数是个具体的文件路径,它就会去打开这个文件,读取里面的内容。

    传的第二个参数是100,它就会自动生成1到100的字符串,用来匹配识别你的每道题的开头在哪个位置。(如果你最大的题号是200,就写200,可以写多,但不能写少,少了识别到的内容会缺失)

    传的第三个参数是’.‘,它就会按照’.'去切割每一行的内容,拿到第一个“.”号前面的内容,用来跟它生成的匹配字符做比对,比对成功了,它就默认该行是你想要写到excel表格里的第一列,接在它后面的每个段落,会自动插入到它后面的列。

    直到匹配到下一个“数字.”开头的,又重复这个过程。

    如果你的文档里面并不是像我这样,没有顺序递增的题号,你可以手动给每个你想要放在表格中第一列的段落,在它前面加标识符,例如“####.”,注意最后是有个小点的。

    像下面这样:

    dd03eadb0330c453470a1018786e4abc.png

    接着调用

    file_handle_by_patchstr(file_path, '####', '.')

    那么它就默认按照’.‘去切割每行内容,并且按照####来匹配识别切到的内容,如果切到在’.'前面的是“####”,那么它就默认这一段是你想存到excel表第一列的段落,在它后面的几段,都会按照每个段落存入一格去处理。直到下一个“####.”出现。

    2、可调用的有4个函数:

    2.1、假如你只想处理一个具体的文档,并且它有具体的题号,最大题号是100,并且它后面跟的是一个’.’,那么就按照下面这个调用

    file_path = r'C:\Users\Administrator\PycharmProjects\exchange_file\2018-04 技能操作真题.txt' file_handle_by_range(file_path, 100, '.')

    2.2、根据自定义匹配符处理具体文件,参数传文件路径,匹配符可以自定义,切割符也可以自定义

    file_path = r'C:\Users\Administrator\PycharmProjects\exchange_file\2018-04 技能操作真题.txt'file_handle_by_patchstr(file_path, '#', '.')

    2.3、根据数字处理具体整个文件夹,参数传文件路径,可迭代的最大数可自定义,分隔符也自定义。(注意文件夹路径,最后是不跟文件名的,它是个文件夹,不是具体文件路径)

    # 文件夹路径dir_path = r'C:\Users\Administrator\PycharmProjects\exchange_file\mytest'dir_handle_by_range(dir_path, 100, '.')

    2.4、根据自定义匹配符处理具体文件夹,参数传文件路径,匹配符可以自定义,切割符也可以自定义

    # 文件夹路径dir_path = r'C:\Users\Administrator\PycharmProjects\exchange_file\mytest'dir_handle_by_patchstr(dir_path, '#', '.')
    展开全文
  • Springboot项目中: 1. 使用Apache POI 3.9 自定义样式导出Excel文件...2. 使用freemarker动态生成word .doc文档(带图片Word以及复杂格式word) 详细说明见个人博客及 github: https://github.com/DuebassLei/excel-poi
  • 先制作Word模版,使用文本框+书签的方式来设计模版;  2.模版制作完之后,根据模版生成新文件,使用File.Copy方法,生成.doc格式新文件;  3.后台取得数据,参照网页渲染的方式标记数据流,方便之后的写入操作;...

    具体思路:

      1.先制作Word模版,使用文本框+书签的方式来设计模版;

      2.模版制作完之后,根据模版生成新文件,使用File.Copy方法,生成.doc格式新文件;

      3.后台取得数据,参照网页渲染的方式标记数据流,方便之后的写入操作;

      4.编辑新文件,根据程序中标记与书签的对应关系,利用类库中的方法来修改书签的内容,最后保存文件即可。

      优点:

      能够自定义元素的位置,方法也很简单易懂,如果只是表格之类的简单格式会很适用。

      缺点:

      灵活性不好,如果要套打的对象是网页,且不是表格形式的,还原程度不好,而且如果文字内容过多会出现超出文本框范围的情况。

      操作过程&代码:

      1)第一步,引入对应的程序集

      如果不是使用第三方的类库的话,是不需要下载的,只要你的系统完整安装了office,你的系统程序集中就会带有操作Word的程序集。

      首先,添加引用Microsoft.Office.Interop.Word,之后,在类中添加相对应的引用:

    1 using MSWord = Microsoft.Office.Interop.Word; //这里重命名为MSWord,之后使用的时候就可以简写了
    2 using System.IO;//要操作文件的话,要引用系统IO
    3 using System.Reflection;

      2)准备工作

    1 MSWord.Application wordApp = new MSWord.Application();//word应用程序变量
    2 MSWord.Document wordDoc;//word文档变量
    3 string TemplateFile = @"D:\Model.doc"; //模版文件的路径,
    4 string FileName = @"D:\" + DateTime.Now.ToString("yyyyMMddHHmmssffffff") + ".doc";//新文件的路径

      3)拷贝模版生成新文件

    1 File.Copy(TemplateFile, FileName);//首先要拷贝一份文件
    2 object obj_FileName = FileName;//新建一个obj变量用于操作

      4)设置操作类型,操作类型有很多中,这里要打开新文件,修改其中的内容

    1 wordDoc = wordApp.Documents.Open(ref obj_FileName);//打开新文件,进行操作
    2 
    3 wordDoc.Activate();//设置现在操作的文件

      5)依据书签修改word内容

     1  //循环书签,判断书签名称,并为其赋值
     2   foreach (MSWord.Bookmark bm in wordDoc.Bookmarks)
     3   {
     4       if (bm.Name == "billno")
     5           {
     6            bm.Select();
     7            bm.Range.Text = "2008";
     8          }
     9           if (bm.Name == "dated")
    10              {
    11                bm.Select();
    12                bm.Range.Text = DateTime.Now.ToString();
    13              }
    14         }

      6)关闭文件

    1   wordDoc.SaveAs2(obj_FileName);//保存文件
    2   wordDoc.Close();//关闭文档对象
    3   wordApp.Quit();//关闭应用程序对象

      7)杀进程,有的情况下,关闭Word文件会不成功,会残留很多word进程

    1 System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("WINWORD");
    2 foreach (System.Diagnostics.Process p in processes)
    3    {
    4        bool b = p.MainWindowTitle == "";
    5        if (p.MainWindowTitle == "")
    6             {
    7               p.Kill();
    8             }
    9     }

    转载于:https://www.cnblogs.com/jydeng/p/4398500.html

    展开全文
  • python实现word转成自定义格式的excel文档(解决思路和代码) 支持按照文件夹去批量处理,也可以单独一个文件进行处理,并且可以自定义标识符。 最近在开发一个答题类的小程序,到了录入试题进行测试的时候了,发现...

    python实现word转成自定义格式的excel文档(解决思路和代码) 支持按照文件夹去批量处理,也可以单独一个文件进行处理,并且可以自定义标识符。

    最近在开发一个答题类的小程序,到了录入试题进行测试的时候了,发现一个问题,试题都是word文档格式的,每份有100题左右,拿到的第一份试题,光是段落数目就有800个。而且可能有几十份这样的试题。

    而word文档是没有固定格式的,想批量录入关系型数据库mysql,必须先转成excel文档。这个如果是手动一个个粘贴到excel表格,那就头大了。

    我最终需要的excel文档结构是这样的:每道题独立占1行,每1列是这道题的一项内容,大概就是问题、选项A、选项B等等。、

    python免费学习资料以及群交流解答点击即可加入

    但word文档是这种结构,如果按照网上通用的方式去转,基本上你得到的结果就是一大坨文字都在一格里,根本不符合需求。

     

    这个格式虽然跟最终的有点差别,但是只要在excel文档或者在代码里稍微再修改一下,就能完全符合要求了。

    废话少说,先贴出代码,看得懂的可以直接拿去用,看不懂的,可以看我后面的具体说明。

    已经把它封装成通用脚本了,你可以直接调用。

    import pandas as pd
    import os
    
    
    # 初始处理函数1,先对初始处理结果进行判断
    def initail_handle_by_range(file_path, max_page_num, split_str):
        df = pd.read_table(file_path)
        # 2、先转成Series
        S = pd.Series(df['column1'].values)
        # 3、转成列表,列表的每个元素就是每个段落
        list = S.tolist()
        # 传入一个max_page_num
        # 4、遍历列表,取出每个段落,按“.”切割,取出第一个元素进行判断,如果它是题号,就应该得到"1"或者"10"
        index_list = []
        for content in list:
            try:
                # 不是每个段落都有“.”可以切割的,会报错,报错就跳过
                first_str = content.split('%s'%split_str)[0]
                # 5、根据最大的题号,自动生成匹配的字符串,用来匹配题号(每个匹配字符串都放在patch_list中)
                patch_list = ['%d' % i for i in range(1, max_page_num + 1)]
                # 6、比对切割得到的第一个元素,如果它在匹配的字符串中,就获取它在列表中的索引,并把获取到的结果添加到列表index_list中,这就知道了每道题的开头在l中的哪个位置了
                if first_str in patch_list:
                    index = list.index(content)
                    index_list.append(index)
            except:
                pass
        # 7、根据索引列表,我们可以知道每道题的第一段和最后一段在l中的哪个位置
        # index_list = [0, 8, 16]
        # print(index_list)
        # 先计算每道题长度是否一致,不一致的,设置is_same_length = False
        is_same_length = True
        length = index_list[1] - index_list[0]
        max_index = len(list)
        for i in index_list:
            # 如果i不是最后一个,那么start就是i,end就是i的下一个
            if i < index_list[-1]:
                start = i
                end = index_list[index_list.index(i) + 1]
            else:
                start = i
                end = max_index
            # 判断长度是否一致,不一致就对长度进行比较,把大的赋值给长度
            if (end - start) != length:
                is_same_length = False
                if (end - start) > length:
                    length = (end - start)
    
    
        result = [is_same_length, index_list, list, length]
    
    
        return result
    
    
    # 初始处理函数1,先对初始处理结果进行判断
    def initail_handle_by_patchstr(file_path, patch_str, split_str):
        df = pd.read_table(file_path)
        # 2、先转成Series
        S = pd.Series(df['column1'].values)
        # 3、转成列表,列表的每个元素就是每个段落
        list = S.tolist()
        # 传入一个max_page_num
        # 4、遍历列表,取出每个段落,按“.”切割,取出第一个元素进行判断,如果它是题号,就应该得到"1"或者"10"
        index_list = []
        for content in list:
            try:
                # 不是每个段落都有“.”可以切割的,会报错,报错就跳过
                first_str = content.split('%s'%split_str)[0]
                # 6、比对切割得到的第一个元素,如果它在匹配的字符串中,就获取它在列表中的索引,并把获取到的结果添加到列表index_list中,这就知道了每道题的开头在l中的哪个位置了
                if first_str == patch_str:
                    index = list.index(content)
                    index_list.append(index)
            except:
                pass
        # 7、根据索引列表,我们可以知道每道题的第一段和最后一段在l中的哪个位置
        # index_list = [0, 8, 16]
        # print(index_list)
        # 先计算每道题长度是否一致,不一致的,设置is_same_length = False
        is_same_length = True
        length = index_list[1] - index_list[0]
        max_index = len(list)
        for i in index_list:
            # 如果i不是最后一个,那么start就是i,end就是i的下一个
            if i < index_list[-1]:
                start = i
                end = index_list[index_list.index(i) + 1]
            else:
                start = i
                end = max_index
            # 判断长度是否一致,不一致就对长度进行比较,把大的赋值给长度
            if (end - start) != length:
                is_same_length = False
                if (end - start) > length:
                    length = (end - start)
    
    
        result = [is_same_length, index_list, list, length]
    
    
        return result
    
    
    
    
    # 传入一个文件路径和一个匹配的字符串,至少2个符号,例如"#."
    def file_handle_by_patchstr(file_path, patch_str, split_str):
        result = initail_handle_by_patchstr(file_path, patch_str, split_str)
        # 接收初始处理函数的结果
        is_same_length = result[0]
        index_list = result[1]
        list = result[2]
        length = result[3]
        # 先根据每道题的长度构造一个空的dict,最后用来生成dataFrame
        dict = {}
        for i in range(1, (length + 1)):
            dict['colomn%d' % i] = []
        # print(dict)
        max_index = len(list)
        for i in index_list:
            # 如果i不是最后一个,那么start就是i,end就是i的下一个
            if i < index_list[-1]:
                start = i
                end = index_list[index_list.index(i) + 1]
            else:
                start = i
                end = max_index
            # 遍历一轮获得的结果就是我们要写入excel的一行
            colomn = 1
            for index in range(start, end):
                # 遍历一次获得的结果就是我们要写入excel的一格
                content = list[index]
                # 每遍历一次就在一个dict中取出某一列,给它加上这个数据
                dict['colomn%d' % colomn].append(content)
                colomn += 1
                # 在遍历到最后一轮的时候
                if index == (end - 1):
                    # 判断是否需要插入空值
                    if not is_same_length and ((end - start) < length):
                        # 可能缺了2列,也可能缺了1列
                        content = ''
                        # 如果只是缺了一列,在现有的index上,加1,就是下一列,补上空值
                        if (length - (end - start)) == 1:
                            colomn = (end - start) + 1
                            dict['colomn%d' % (colomn)].append(content)
                        else:
                            # 如果缺失了2列以上,就遍历,给之后的每一列都补上空值
                            for i in range(length - (end - start)):
                                colomn = length - i
                                dict['colomn%d' % (colomn)].append(content)
    
    
        final_df = pd.DataFrame(dict)
    
    
        new_file_path = file_path.split('.')[0] + '.xlsx'
    
    
        final_df.to_excel(r'%s' % new_file_path)
    
    
    
    
    def file_handle_by_range(file_path, max_page_num, split_str):
        result = initail_handle_by_range(file_path, max_page_num, split_str)
        # 接收初始处理函数的结果
        is_same_length = result[0]
        index_list = result[1]
        list = result[2]
        length = result[3]
    
    
        # 先根据每道题的长度构造一个空的dict,最后用来生成dataFrame
        dict = {}
        for i in range(1,(length+1)):
            dict['colomn%d'%i] = []
        max_index = len(list)
        for i in index_list:
            # 如果i不是最后一个,那么start就是i,end就是i的下一个
            if i < index_list[-1]:
                start = i
                end = index_list[index_list.index(i) + 1]
            else:
                start = i
                end = max_index
            # 遍历一轮获得的结果就是我们要写入excel的一行
            colomn = 1
            for index in range(start, end):
                # 遍历一次获得的结果就是我们要写入excel的一格
                content = list[index]
                # 每遍历一次就在一个dict中取出某一列,给它加上这个数据
                dict['colomn%d' % colomn].append(content)
                colomn += 1
                # 在遍历到最后一轮的时候
                if index == (end - 1):
                    # 判断是否需要插入空值
                    if not is_same_length and ((end-start)<length):
                        # 可能缺了2列,也可能缺了1列
                        content = ''
                        # 如果只是缺了一列,在现有的index上,加1,就是下一列,补上空值
                        if (length-(end-start)) == 1:
                            colomn = (end-start) +1
                            dict['colomn%d'% (colomn)].append(content)
                        else:
                            # 如果缺失了2列以上,就遍历,给之后的每一列都补上空值
                            # 8-6 = 2, i = 0, 1
                            for i in range(length-(end-start)):
                                colomn = length - i
                                dict['colomn%d' % (colomn)].append(content)
        final_df = pd.DataFrame(dict)
    
    
        new_file_path = file_path.split('.')[0] + '.xlsx'
    
    
        final_df.to_excel(r'%s'%new_file_path)
    
    
    # 传入一个文件夹路径,最大的迭代数字,切割字符串
    def dir_handle_by_range(dir_path, max_page_num, split_str):
        files = os.listdir(dir_path)  # 获取当前目录的所有文件及文件夹
        for file in files:
            file_path = os.path.join(dir_path, file)  # 遍历获取每个文件的绝对路径
            result = initail_handle_by_range(file_path, max_page_num, split_str)
            # 接收初始处理函数的结果
            is_same_length = result[0]
            index_list = result[1]
            list = result[2]
            length = result[3]
    
    
            # 先根据每道题的长度构造一个空的dict,最后用来生成dataFrame
            dict = {}
            for i in range(1, (length + 1)):
                dict['colomn%d' % i] = []
            max_index = len(list)
            for i in index_list:
                # 如果i不是最后一个,那么start就是i,end就是i的下一个
                if i < index_list[-1]:
                    start = i
                    end = index_list[index_list.index(i) + 1]
                else:
                    start = i
                    end = max_index
                # 遍历一轮获得的结果就是我们要写入excel的一行
                colomn = 1
                for index in range(start, end):
                    # 遍历一次获得的结果就是我们要写入excel的一格
                    content = list[index]
                    # 每遍历一次就在一个dict中取出某一列,给它加上这个数据
                    dict['colomn%d' % colomn].append(content)
                    colomn += 1
                    # 在遍历到最后一轮的时候
                    if index == (end - 1):
                        # 判断是否需要插入空值
                        if not is_same_length and ((end - start) < length):
                            # 可能缺了2列,也可能缺了1列
                            content = ''
                            # 如果只是缺了一列,在现有的index上,加1,就是下一列,补上空值
                            if (length - (end - start)) == 1:
                                colomn = (end - start) + 1
                                dict['colomn%d' % (colomn)].append(content)
                            else:
                                # 如果缺失了2列以上,就遍历,给之后的每一列都补上空值
                                for i in range(length - (end - start)):
                                    colomn = length - i
                                    dict['colomn%d' % (colomn)].append(content)
    
    
            final_df = pd.DataFrame(dict)
    
    
            new_file_path = file_path.split('.')[0] + '.xlsx'
    
    
            final_df.to_excel(r'%s' % new_file_path)
    
    
    # 传入一个文件夹路径和一个匹配的字符串,至少2个符号,例如"#."
    def dir_handle_by_patchstr(dir_path, patch_str, split_str):
        files = os.listdir(dir_path)  # 获取目录的所有文件及文件夹
        for file in files:
            file_path = os.path.join(dir_path, file)  # 遍历获取每个文件的绝对路径
            print(file_path)
            result = initail_handle_by_patchstr(file_path, patch_str, split_str)
            # 接收初始处理函数的结果
            is_same_length = result[0]
            index_list = result[1]
            list = result[2]
            length = result[3]
            # 先根据每道题的长度构造一个空的dict,最后用来生成dataFrame
            dict = {}
            for i in range(1, (length + 1)):
                dict['colomn%d' % i] = []
            # print(dict)
            max_index = len(list)
            for i in index_list:
                # 如果i不是最后一个,那么start就是i,end就是i的下一个
                if i < index_list[-1]:
                    start = i
                    end = index_list[index_list.index(i) + 1]
                else:
                    start = i
                    end = max_index
                # 遍历一轮获得的结果就是我们要写入excel的一行
                colomn = 1
                for index in range(start, end):
                    # 遍历一次获得的结果就是我们要写入excel的一格
                    content = list[index]
                    # 每遍历一次就在一个dict中取出某一列,给它加上这个数据
                    dict['colomn%d' % colomn].append(content)
                    colomn += 1
                    # 在遍历到最后一轮的时候
                    if index == (end - 1):
                        # 判断是否需要插入空值
                        if not is_same_length and ((end - start) < length):
                            # 可能缺了2列,也可能缺了1列
                            content = ''
                            # 如果只是缺了一列,在现有的index上,加1,就是下一列,补上空值
                            if (length - (end - start)) == 1:
                                colomn = (end - start) + 1
                                dict['colomn%d' % (colomn)].append(content)
                            else:
                                # 如果缺失了2列以上,就遍历,给之后的每一列都补上空值
                                for i in range(length - (end - start)):
                                    colomn = length - i
                                    dict['colomn%d' % (colomn)].append(content)
            final_df = pd.DataFrame(dict)
            print(final_df)
            print(file_path)
    
    
            new_file_path = file_path.split('.')[0] + '.xlsx'
            print(new_file_path)
    
    
            final_df.to_excel(r'%s' % new_file_path)
    
    
    
    
    if __name__ == '__main__':
        # 文件路径
        # file_path = r'C:\Users\Administrator\PycharmProjects\exchange_file\2018-04 技能操作真题.txt'
        # 文件夹路径
        dir_path = r'C:\Users\Administrator\PycharmProjects\exchange_file\mytest'
    
    
        # 根据数字处理具体文件,参数传文件路径,可迭代的最大数可自定义,分隔符也自定义
        # file_handle_by_range(file_path, 100, '.')
    
    
        # 根据自定义匹配符处理具体文件,参数传文件路径,匹配符可以自定义,切割符也可以自定义
        # file_handle_by_patchstr(file_path, '#', '.')
    
    
        # 根据数字处理具体整个文件夹,参数传文件路径,可迭代的最大数可自定义,分隔符也自定义
        # dir_handle_by_range(dir_path, 100, '.')
    
    
        # 根据自定义匹配符处理具体文件夹,参数传文件路径,匹配符可以自定义,切割符也可以自定义
        # dir_handle_by_patchstr(dir_path, '#', '.')
    

    一、先说一下实现这个需求的处理逻辑

    解决这个需求的关键点是什么:

    1、python怎么读取这个文件的内容?

    python有相关的word操作库可以读取,但是读取到的结果不方便操作。我们最终是要让它生成excel文件的,所以可以用python非常强大的科学计算包pandas来读取操作数据更好。

    但pandas不能直接读取word文件,所以,需要先把它转成txt文档,这一步很简单,打开word,全部复制到一份新的txt文件中就行了。(注意要在第一行给它加上列名,我直接加了个colomn1,代表是第一列)

    简单处理后的txt文档的结构类似这样:

    2、读取到的数据如何处理?

    使用pandas读取到的数据是一个dataFrame,dataFrame的结构就类似于我们在excel文档里面那样行列分明的。但是,它从txt读取出来的格式是全部内容都视为1列的,而txt中的每一段,在它这里就是每一行(注意是每一段对应一行,而不是每一行对应每一行)

    预览一下:结果显示800行,1列。也就是在txt文档中有800个段落。

    3、接下来怎么处理呢?

    pandas强大的地方就在这里了,它可以直接把这1列的内容全部转成Series,Series是什么你可以不用管,你只需要知道Series可以直接转成列表list就行了。有了list我们就方便操作了。

    以上几步就实现了从word里面读取数据,并转化成python的数据类型list了。list里面的每个元素,就等同于我们word里面的每一个段落。

    控制台打印出来的就是这样:

    下面的800是计算出这个列表的长度,代表有800个元素。

    接下来我们的需求就变成了:怎么把一个列表,转成有明确行列结构的excel表格了。

    这个要分为2种情况来说:

    1、你的word文档结构相对合理些,每道题都固定是X个段落(例如每道题都是8个段落),这个解决就很简单了。因为这种情况对应就是在list中,每8个元素构成了1道题,你只要按照规律,8个8个取出,最后批量写入excel就行了。(这种解决起来比较简单,就不详细说了)

    2、另一种情况比较麻烦,就是word文档的结构不规范,有的题目可能是8个段落,有的可能是7段,有的是6段。那么要怎么解决呢?

    解决这个问题有几个关键点:

    1、excel表格是行列结构的,它每一行的数据来源于这个txt文档的第几行?(也就是list里面的第几个元素)

    所以我们只要把每道题在list中的索引找出来就行了。

    观察一下源数据,它每道题的开头都是数字加1个英文符号“.”,例如:“1.”和“2.”,最大的是"100.",并且其他段落的开头都不会出现这个结构。那么就简单了,我先构造出一个patch_list=[‘1’, ‘2’, ‘3’…‘100’],用来做匹配。

    然后再遍历源数据列表,对列表的每个元素按“.”号切割,切割后拿到它的第一个元素,拿这个元素跟pacth_lis进行匹配,如果它是在patch_list中的,就代表它是每道题的开头。此时就记录下它的索引,并且把这个索引值存放到一个新列表index_list中。

    下面是我获取到的index_list:

    0代表了第一道题是在列表的第1个元素开始的,8代表第二道题在列表的第9个元素开始。

    于是我们就知道每道题的开头是在列表中的哪个位置了。

    2、拿到了每道题的索引,然后怎么做呢?

    最终我们是要转存到excel文档中的, pandas怎么转excel?

    很简单的,只要你构造出一个dataFrame出来,调用pandas的to_excel方法,就能存入excel文档了。

    3、问题的关键就变成了,有了每道题的索引,怎么把它转成dataFrame结构。

    下面演示一下,假如你想要构造一个dataFrame,需要什么样的数据结构,构造出来的dataFrame在控制台的输出结果是怎么样的,最后生成的excel表格是怎么样的。

    dict = {'colomn1': ['问题1', '问题2', '问题3'],
            'colomn2': ["A:问题1的A选项", "A:问题2的A选项", "A:问题3的A选项"],
            'colomn3': ['B:问题1的B选项', 'B:问题2的B选项', 'B:问题3的B选项']}
    
    
    df = pd.DataFrame(dict)
    
    
    print(df)
    
    
    df.to_excel(r'C:\Users\Administrator\PycharmProjects\exchange_file\test.xlsx')
    

    这个就是调用pandas的DataFrame方法,用字典dict生成的一个dataFrame数据。

    这个dataFrame在控制台打印出来就是:

    这个结构存入excel就是对应表格的行和列了。这个结构就符合我的实际需求了。

    所以我们要构造出这个dataframe的关键就是:把所有数据梳理一遍,构造成类似这样的一个字典。

    dict = {'colomn1': ['问题1', '问题2', '问题3'],
            'colomn2': ["A:问题1的A选项", "A:问题2的A选项", "A:问题3的A选项"],
            'colomn3': ['B:问题1的B选项', 'B:问题2的B选项', 'B:问题3的B选项']}
    
    
    

    那么怎么构建这个dict呢?

    我们源数据转出来的list结构是类似这样的:

    list = [‘问题1’,“A:问题1的A选项”, ‘B:问题1的B选项’…‘问题2’,“A:问题2的A选项”, ‘B:问题2的B选项’]

    而我们前面得到的index_list=[0, 8, 16。。。。]

    它记录了“问题1”,“问题2”等等直到“问题100”是在哪个位置开始的,所以我们只需要把index_list遍历一下,轮流取出它的每个元素,它就是每道题的开始位置,然后拿到紧跟在这个元素的下一个是什么,用这个减去1就知道了每道题的开始位置start和结尾位置end是多少了。接着使用

    for i in range(start, end):
      content = list[i] 
    

    就可以轮番从list中取出每道题的各项内容,取到的第一个就加到dict的colomn1列表中,第二个就加到dict的colomn2中,按照这个规律,就能把list的内容分开插入到dict中的各个列表中了。

    但在这个过程中,可能你每道题的段落数目不一致,也就是你按照这个规律从list中取出的元素,可能每次取出的数量都不一样。这点需要注意,如果没有对它进行处理,最后会导致转出来的文件内容错位了,例如你的文档里面,第一题有8个段落,第二题只有7个,第三题有8个段落,没处理这个问题的话,最后第三题的第8个段落,就会跑到第7题那边了。并且最终dataFrame会无法生成excel文件。

    那么这个问题怎么解决呢?

    在正式调用处理函数生成excel文件之前,可以先对文件预处理,拿到它们的数据进行判断,如果判断到它每个间隔不一样,有的缺少段落,那么就让数据预处理函数返回一个值为False,间隔一样就返回True。接着在真正的数据提取环节,根据这个进行判断,如果判断到它值是Fales,那么就在每一轮遍历提取数据的最后一次遍历,一次性在它后面的缺失数据的列加上空字符串,作为占位用,这样最后得到的列表长度就都一样了,并且在最后生成的excel表中,它是一个空格。

    最后用dict生成dataFrame,再写入excel文档,我们就大功告成了。

    二、再说一下具体怎么使用:

    运行必须的工具

    1、python解释器(pycharm或其他);

    2、python自带模块:os;

    3、自行安装模块:pandas,openpyxl;

    自行安装的模块,在控制台pip install pandas和pip install openpyxl就行了。

    怎么调用

    1、先要做数据预处理:先要把word文档的内容复制到txt文档中,并且在第一行加上"column1",处理后像下面这样:

    接着要看你的文档内容是否有题号,如果有的话:比如像我这个,有具体的题号1-100题,并且它的写法都是“1.”,在题号后面跟了个英文字符“.”,顺序递增到100。

    那么你就可以调用file_handle_by_range。你给它传第一个参数是个具体的文件路径,它就会去打开这个文件,读取里面的内容。

    传的第二个参数是100,它就会自动生成1到100的字符串,用来匹配识别你的每道题的开头在哪个位置。(如果你最大的题号是200,就写200,可以写多,但不能写少,少了识别到的内容会缺失)

    传的第三个参数是“.”,它就会按照“.”去切割每一行的内容,拿到第一个“.”号前面的内容,用来跟它生成的匹配字符做比对,比对成功了,它就默认该行是你想要写到excel表格里的第一列,接在它后面的每个段落,会自动插入到它后面的列。

    直到匹配到下一个“数字.”开头的,又重复这个过程。

    如果你的文档里面并不是像我这样,没有顺序递增的题号,你可以手动给每个你想要放在表格中第一列的段落,在它前面加标识符,例如“####.”,注意最后是有个小点的。像下面这样:

    接着调用

    file_handle_by_patchstr(file_path, '####', '.')

    那么它就默认按照“.”去切割每行内容,并且按照####来匹配识别切到的内容,如果切到在“.”前面的是“####”,那么它就默认这一段是你想存到excel表第一列的段落,在它后面的几段,都会按照每个段落存入一格去处理。直到下一个“####.”出现。

    2、可调用的有4个函数:

    2.1、假如你只想处理一个具体的文档,并且它有具体的题号,最大题号是100,并且它后面跟的是一个“.”,那么就按照下面这个调用

    file_path = r'C:\Users\Administrator\PycharmProjects\exchange_file\2018-04 技能操作真题.txt'
     file_handle_by_range(file_path, 100, '.')
    

    2.2、根据自定义匹配符处理具体文件,参数传文件路径,匹配符可以自定义,切割符也可以自定义

    file_path = r'C:\Users\Administrator\PycharmProjects\exchange_file\2018-04 技能操作真题.txt'
    file_handle_by_patchstr(file_path, '#', '.')
    

    2.3、根据数字处理具体整个文件夹,参数传文件路径,可迭代的最大数可自定义,分隔符也自定义。(注意文件夹路径,最后是不跟文件名的,它是个文件夹,不是具体文件路径)

    # 文件夹路径
    dir_path = r'C:\Users\Administrator\PycharmProjects\exchange_file\mytest'
    dir_handle_by_range(dir_path, 100, '.')
    

    2.4、根据自定义匹配符处理具体文件夹,参数传文件路径,匹配符可以自定义,切割符也可以自定义

    # 文件夹路径
    dir_path = r'C:\Users\Administrator\PycharmProjects\exchange_file\mytest'
    dir_handle_by_patchstr(dir_path, '#', '.')
    展开全文
  • 该文章使用的Word版本为Mac版的Word 2016,相关的选项和Win版的Word 2016可能有些出入,但应该都能找到对应的选项,功能是一致的。 本文的目录结构: 1.通用页面设置 2.分节页码设置 分节页码设置步骤 3.分节...
  • 在使用 Word 制作合同等格式文本的过程中,经常会需要处理一些「待定内容」,例如签署方的全称、签署日期等。对此,常见的处理方法是用 [*]、下划线等方式做标记,等确认后再填上。 这种方法是有很多缺陷的。如果...
  • 需求:百度编辑器上增加一个按钮,上传word文档并自动添加内容到编辑框 思路:1,百度编辑器增加上传按钮;2,解析word文档,返回富文本;3,插入富文本到编辑框 第一,百度编辑器增加自定义按钮 ueditor.config....
  • 开学时间的推迟,马上要交论文的小可爱是不是长舒一口气呢?当你建立好完美框架,整理完全部数据,分析完结果,一个字一个字码好...页面设置页边距按上方左图选择自定义页边距,出现右图所示,在右图中进行修改即可...
  • 中间是可以生成文档的项目。右侧是你需要生成的项目,双击即可添加到右侧,大家可以慢慢研究,这里只选择其中的两项。 选中table--下的list of table column,双击。 选中项右键点击layout,进入  ...
  • 由于项目开发需要,产品给出word模板,需要导出该格式word文件。 1.通过word模板文件生成我们需要的模板.ftl文件。 步骤:将word文件转换成Microsoft XML格式文件(打开word,文件另存为xml格式文件),用notepad+...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 496
精华内容 198
关键字:

word文档自定义格式