首页 > 其他分享 >【办公类-50-01】20240620自主游戏观察记录表19周内容打乱

【办公类-50-01】20240620自主游戏观察记录表19周内容打乱

时间:2024-06-22 19:32:18浏览次数:12  
标签:01 记录表 19 doc cell table print new path

背景需求:

又到了期末,各种班级资料需要提交。

有一份自主游戏观察记录需要写19周(每周2次)的观察记录,并根据参考书填写一级、三级、五级的评价指标。

去年中六班的时候,我很认真的手写了21周的户外游戏活动内容,主动成为2个需要提交文本资料的班级。

今年组长选了中二和中五提交打印资料。因此中四班的游戏观察资料可以不那么“优质”,所以本学期我想“偷个懒”,再次使用去年的内容做电子稿提交。

考虑到这套资料也给过其他班级,我担心会出现重复,所以有两个调整的思路:

1、将每个周次的内容进行替换,如原来第1周的内容放到第15周,第13周内容调到第2周。

2、虽然内容没有修改,但至少将孩子的名字替换成新的名字(中四班孩子的小名)

设计过程。

1、原素材

2、模板

3、代码思路

(1)读取原素材表格中各个单元格里面的内容,新建一个excel并保存这些内容

 (2)手动更改小名:因为不确定出现哪些名字,需要把表格拉宽,查看里面的名字。这里程序要会暂停。

(3)改完以后,打乱行的顺序,把文字内容重写排列,

(4)把excel每行内容生成一个docx,把所有doc合并在一起

然后程序把所有的docx合并在一个docx内

部分表格手动调整(删除回车符),确保每个表格内容都在一页上。

代码展示:

'''
项目:期末资料:19周游戏观察记录内容周次调换
工具:星火讯飞、阿夏
时间:2024年6月20日
'''

import re
import pandas as pd
from docx import Document
import time

for y in range(5):

    path = r'C:\Users\jg2yXRZ\OneDrive\桌面\游戏观察记录'
    # 读取1.docx文件
    doc = Document(path + r"\中(6)班自主游戏观察记录(202302-202306)全部户外.docx")

    weeks=19 # 一共几周
    name1='张三'
    name2='李四'
    


    print('---1、提取原来的游戏观察记录内容-----')
    # 提取所有段落中“第”和“周”之间的内容
    results = []
    for paragraph in doc.paragraphs:
        content = paragraph.text
        pattern = r"第(.*?)周"
        result = re.findall(pattern, content)
        if result:
            results.extend(result)

    # 缩进2字符
    b='    ' 

    table_data1 = []
    for table in doc.tables:
        cell_value1 = table.cell(0, 0).text.replace(" ", "")  # 清除缩进
        lines1 = cell_value1.split('\n')
        del lines1[0]  # 删除第一行
        new_lines1 = [b + line for line in lines1]  # 在每行前面加四个空格
        new_cell_value1 = '\n'.join(new_lines1)
        table_data1.append(new_cell_value1)
        print(new_cell_value1)

    table_data2 = []
    for table in doc.tables:
        cell_value2 = table.cell(2, 0).text.replace(" ", "")   # 清除缩进
        lines2 = cell_value2.split('\n')
        del lines2[0]  # 删除第一行
        new_lines2 = [b + line for line in lines2]  # 在每行前面加四个空格
        new_cell_value2 = '\n'.join(new_lines2)
        table_data2.append(new_cell_value2)
        print(new_cell_value2)

    table_data3 = []
    for table in doc.tables:
        cell_value3 = table.cell(0, 1).text.replace(" ", "")   # 清除缩进
        lines3 = cell_value3.split('\n')
        del lines3[0]  # 删除第一行
        new_lines3 = [b + line for line in lines3]  # 在每行前面加四个空格
        new_cell_value3 = '\n'.join(new_lines3)
        table_data3.append(new_cell_value3)
        print(new_cell_value3)

    table_data4 = []
    for table in doc.tables:
        cell_value4 = table.cell(2, 1).text.replace(" ", "")   # 清除缩进
        lines4 = cell_value4.split('\n')
        del lines4[0]  # 删除第一行
        new_lines4 = [b + line for line in lines4]  # 在每行前面加四个空格
        new_cell_value4 = '\n'.join(new_lines4)
        table_data4.append(new_cell_value4)
        print(new_cell_value4)

    table_data5= []
    for table in doc.tables:
        cell_value5 = table.cell(1, 1).text.replace(" ", "")   # 清除缩进
        print(cell_value5)
        table_data5.append(cell_value5[3:])
        # print(new_cell_value5)

    table_data6= []
    for table in doc.tables:
        cell_value6 = table.cell(3, 1).text.replace(" ", "")   # 清除缩进
        print(cell_value6)
        table_data6.append(cell_value6[3:])
        # print(new_cell_value5) 

    df = pd.DataFrame({'Week': results, 'content1': table_data1,'content2': table_data2,'fx1': table_data3,'fx2': table_data4,'T1': table_data5,'T2': table_data6})
    df.to_excel(path + '\\数据导出改人名.xlsx', index=False)

    # 手动改人名
    print("手动改人名,按任意键继续...")
    input()  # 这里会暂停程序,直到用户输入信息
    print("程序继续执行...")

    print('---2、手动改人名,随机抽取行数,重新保存一份----')

    import pandas as pd

    # 读取Excel文件
    data = pd.read_excel(path + '\\数据导出改人名.xlsx')

    # 获取行数
    num_rows = len(data)
    print(num_rows)
    # 19

    # 打乱行顺序
    shuffled_data = data.sample(frac=1).reset_index(drop=True)

    # 保存打乱顺序后的数据为新的Excel文件
    shuffled_data.to_excel(path +r'\更换顺序.xlsx', index=False)

    # 更改周次和姓名
    import openpyxl



    # 打开Excel文件
    workbook = openpyxl.load_workbook(path +r'\更换顺序.xlsx')

    # 选择工作表
    worksheet = workbook.active

    # 在A列第2行开始写入1-20的数字
    for i in range(2, num_rows+2):
        worksheet.cell(row=i, column=1).value = i - 1

    # 在F列写入教室A的名字
    for i in range(2, num_rows+2):
        worksheet.cell(row=i, column=6).value = name1
    # 在G列写入教室A的名字
    for i in range(2, num_rows+2):
        worksheet.cell(row=i, column=7).value = name2

        time.sleep(2)
    # 保存修改后的Excel文件
    workbook.save(path+r'\更换顺序.xlsx')


    print('---3、写入模板生成新的文件--')

    import os
    import pandas as pd
    from docxtpl import DocxTemplate


    file_path = path + r'\04合成2'
    try:
        os.mkdir(file_path)
    except:
        pass

    list = pd.read_excel(path + '\\更换顺序.xlsx')

    Week= list["Week"]
    content1 = list["content1"].str.rstrip()
    content2 = list["content2"].str.rstrip()
    fx1 = list["fx1"].str.rstrip()
    fx2 = list["fx2"].str.rstrip()
    T1 = list["T1"].str.rstrip()
    T2 = list["T2"].str.rstrip()


    num = list.shape[0]
    for i, (w, c1, c2, f1, f2 ,t1, t2) in enumerate(zip(Week, content1, content2, fx1,fx2,T1, T2)):
        context = {
            "Week": w,
            "content1": c1, 
            "content2": c2,
            "fx1": f1,
            "fx2": f2, 
            "T1": t1,
            "T2": t2,
        }
        tpl = DocxTemplate(path + '\\模版游戏观察记录与反思(2024.1).docx')
        tpl.render(context)
        time.sleep(4)
        tpl.save(file_path + fr"\第{i+1:02d}周.docx")





    print('---4、合并文档--')
    import os
    import shutil
    from docx import Document


    def merge_docx_files(input_folder, output_file):
        output_doc = Document(r'C:\Users\jg2yXRZ\OneDrive\桌面\游戏观察记录\04合成2\第01周.docx')   

        files = os.listdir(input_folder)
        for index, file in enumerate(files):
            if file.endswith(".docx") and index != 0:
                input_file = os.path.join(input_folder, file)
                input_doc = Document(input_file)
                # output_doc.add_page_break()  # 添加换页符
                
                for element in input_doc.element.body:    
                    output_doc.element.body.append(element)
        time.sleep(2)

        output_doc.save(output_file)

    input_folder = file_path
    output_file = path+fr"\{y:02d}中4班 游戏活动观察记录(202402-202406)全部户外.docx"
    merge_docx_files(input_folder, output_file)

存在问题:

本代码有一个问题,就是每次提取的文字会有缺失,原因不明,

所以我就生成多份随机排序的文件,从中挑选一个内容相对多的文件,作为提交的电子稿的资料。

运气好,以下这份文字较为齐全(撑满格子)

哎,偷懒就不能保证打乱文字的稳定性,所以要多抽几次博一个成功的概率,或者还是乖乖的自己手写吧!

标签:01,记录表,19,doc,cell,table,print,new,path
From: https://blog.csdn.net/reasonsummer/article/details/139886467

相关文章

  • HDU-4281 Judges' response(2012 ACM/ICPC Asia Regional Tianjin Online)
    HDU-4281Judges'response(2012ACM/ICPCAsiaRegionalTianjinOnline)状态压缩+01背包+区间dp题意:有n个地点,第一个地点是裁判位置,其他n-1个地点是选手的位置。裁判要给选手解决问题,每个选手都有一个时间表示解决这个选手问题所需要的时间。同样的,裁判也有一个时间,表示这......
  • Qt版本选择01
    嵌入式推荐用Qt4.8,打包的程序小:Qt4.8.7是Qt4的终结版本,是Qt4系列版本中最稳定最经典的最后支持xp系统的长期支持版本:Qt5.6.3;Qt5.7.0是最后支持xp系统的非长期支持版本。最后提供mysql数据库插件的版本:Qt5.12.3。最后支持win7的版本:Qt5.15系列。Qt6不支持win7最后样式表性能最......
  • 【B站黑马程序员LINUX 学习笔记 01】
    课程看的是b站黑马程序员的https://www.bilibili.com/video/BV1n84y1i7td/?spm_id_from=333.337.search-card.all.click&vd_source=be621a30ea2e4e0374f5df95b0b017f201操作系统概述计算机由:硬件和软件组成。操作系统是计算机软件的一种,它主要负责:作为用户和计算机硬件......
  • CF1978E Computing Machine 题解
    好写程度:\(E>D>C\)。好想程度:\(C>D=E\)。总结:C是全场最难。我们考虑把两个操作对全体的\(a_i,b_i\)都做一遍,会发现我们只会做这两遍,不会再有嵌套的了,因为都做过一遍后\(\{a\}\)中0的数量只会减少,而且即使再做一遍也无法给\(\{b\}\)改成不一样的了,比较显然。下文中令......
  • 电压互感器(zmpt101b)交流电压采样
        交流电压采样是我们在控制逆变电路时重要的一环。有一种采样方法就是用电压互感器+运放将目标交流电压转化为单片机可以测量的电压(即控制在合适的大小内,并且均转化为正值)。    在淘宝上我们可以买到现成的互感器模块,如下图: 其原理图如下:感谢@qq_389......
  • BD202301·公园题解
    BD202301·公园题解考虑将整个移动过程分为两个部分:小度和度度熊汇合之前小度和度度熊汇合之后第一部分可以直接用Dijkstra算法直接搞定,第二部分可以考虑反向思考,从N点出发做一次Dijkstra,最后枚举每个汇合点即可得到答案。时间复杂度\(\Theta(nlogn)\)代码如下:#include......
  • 01 Shell编程规范与变量
    1、Shell脚本概述在一些复杂的Linux维护工作中,大量的重复性的输入和交互操作不仅费力费时,而且容易出错,而编写一个恰到好处的Shell脚本程序,可以批量处理、自动化地完成一系列维护任务,大大减轻管理员的负担。Shell脚本是什么?简单的说,只要将平时使用的各种Linux命令按顺序保存......
  • 190.回溯算法:组合(力扣)
    代码随想录(programmercarl.com)一、什么是回溯算法    回溯算法是一种通用的算法设计技巧,特别适用于解决组合、排列、子集等问题。它通过逐步构建解决方案,并在发现部分解决方案无效时撤销(回溯)部分计算,从而寻找所有可能的解决方案。    回溯算法的基本思......
  • [题解]AT_abc195_d [ABC195D] Shipping Center
    思路一个简单的贪心,对于每一次操作,我们假设我们能用盒子的大小的数组处理成\(a\)。那么,我们可以对\(a\)进行从小到大排序。然后,对于我们所有的箱子,我们可以以\(w\)为关键字,从小到大排序。接着,我们可以进行暴力枚举,对于\(a_i\),我们要取的必定为\(\max_{w_j\leqa_i}(v_j......
  • 校园资讯平台微信小程序(30143)
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项......