当前位置: 首页 > news >正文

【教学类-43-25】20241203 数独3宫格的所有可能-使用模版替换(12套样式,空1格-空8格,每套510张,共6120小图)

前期做数独惨宫格的所有排列,共有12套样式,空1格-空8格,每套510张,共6120小图)

【教学类-43-24】20241127 数独3宫格的所有可能(12套样式,空1格-空8格,每套510张,共6120小图)-CSDN博客文章浏览阅读1.7k次,点赞41次,收藏30次。【教学类-43-24】20241127 数独3宫格的所有可能(12套样式,空1格-空8格,每套510张,共6120小图)https://blog.csdn.net/reasonsummer/article/details/144069290

代码用的是生成一个docx,转一个PDF,最后把所有的PDF合并,这种方式转化PDF容易报错(保存时间不够),就出现程序中断,及时顺利运行不报错,也要3个半小时。

所以我想了半天,想到一个新的思路

1、用12套的第一套生成510张图片+1个基础样式,获得44张A4图纸

2、吧44张图纸合并在一个word内(这样转PDF快一点,稳定不报错)

3、在一套3宫格的510张基础样式(一个word)基础上,对里面的数字进行替换,如果不是空,就清空原来的数字,换成新的数字,如果是空,就继续留空

4.生成12个合并word,每个里面有44张图纸,再把每个合并word转成每个PDF。

但是测试过程中,总是出现第一张基本样式表的“样式X”字样没有替换成“样式01、样式02……”,测试无数次后,发现原来要想替换文字,段落的字体格式、间距、大小、必须一样才行。

代码展示

import math
from itertools import permutations# 测试11*11格,2*2一共4套3*3 宫格
'''
目的:数独3宫格(1,2,3)有12套不同的基础模板,对每套题目进行空1=空8的不重复获取。
(12套样式,空1格-空8格,每套510张,共6120小图)
本代码先做样式1,获取基本样式510张,打印时44页,然后尝试用替换方式制作另外的11款
作者:阿夏
时间:2024年11月30日 13:35
20:30-22:24'''import random
from win32com.client import constants,gencache
from win32com.client.gencache import EnsureDispatch
from win32com.client import constants # 导入枚举常数模块
import os,timeimport docx
from docx import Document
from docx.shared import Pt 
from docx.shared import RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qnfrom docxtpl import DocxTemplate
import pandas as pd
from docx2pdf import convert
from docx.shared import RGBColor
from datetime import datetime
from docx import Document
from docx.enum.text import WD_BREAK# 生成题库
import random
import copy# 开始时间
start_time = datetime.now()# 制作"单元格"# 几宫格
hsall=3
# int(input('3宫格数独=3\n'))
hs=hsall
# 内容太多了,容易报错,如果报错,就重新设置起始宫格数字1-8
start=1
# 第几套,第一套
sz=1print('------第1步:制作单元格-------')ll=['3'] # 如果输入345
mm=['34']# 3对应的套数是4*3套
gz=int(mm[0][0])*int(mm[0][1])
nn=['36']# 3对应的写入单元格的数字大小36磅 
# ll=['3','4','5','6','7','8','9'] # 如果输入345
# mm=['43','43','32','32','32','32','32']# 3对应的套数是4*3套
# nn=['36','24','36','24','24','24','24']# 3对应的写入单元格的数字大小36磅 
for r in range(len(ll)):if hsall ==int(ll[r]):# 底边几套.底边看有2份db=int(mm[r][0])# int(input('底边几套? 3\n'))# 侧边几套 侧边看也是2份print(db )        cb=int(mm[r][1])# int(input('侧边几套? 2\n'))print(cb)size=int(nn[r])print(size)        # 写入单元格数字的大小(撑满格子)# 新建一个”装N份word和PDF“的临时文件夹
path=r'C:\Users\jg2yXRZ\OneDrive\桌面\数独所有可能'# 新建“单独docx”输出文件夹
tencent=path+fr'\{hs}宫格'
os.makedirs(tencent,exist_ok=True)
tencent1=tencent+fr'\01_{hs}宫格_样式A_单独_X张A4_Y张小图'
os.makedirs(tencent1,exist_ok=True)# 计算不同模板中的单元格坐标,放在bg里
# 棋盘格子数量,# 如果正方形:底边2*侧边2,就是3*3宫格 2*2=4套,底边边格子数量就是3*2+1=7,侧边格子数量就是3*2+1=7,
# 如果长方形:底边3*侧边2,就是3*3宫格,3*2=6套 底边格子数量就是3*3+2=11,侧边格子数量就是3*2+1=7,
# if db==cb:
db_size = hs*db+db-1
cb_size=  hs*cb+cb-1
print('{}宫格排列底{}侧{}共{}套,底边格子数{}'.format(hs,db,cb,db*cb,db_size ))
print('{}宫格排列底{}侧{}共{}套,侧边格子数{}'.format(hs,db,cb,db*cb,cb_size ))# 确定每个宫格的左上角坐标 00 04 40  44
bgszm=[]
for a in range(0,cb_size,hs+1):    # 0-11每隔4,写一个坐标  侧边yfor b in range(0,db_size,hs+1):  # 0-11每隔4,写一个坐标  侧边xbgszm.append('{}{}'.format('%02d'%a,'%02d'%b))
print(bgszm)
# 3宫格排列底3侧2共6套,底边格子数11
# 3宫格排列底3侧2共6套,侧边格子数7
# ['0000', '0004', '0008', '0400', '0404', '0408']# 转为元祖
start_coordinates = [(int(s[0:2]), int(s[2:4])) for s in bgszm]
cell_coordinates = []# 推算每个起始格子后面的单元格数字
for start_coord in start_coordinates:i, j = start_coordsubgrid_coordinates = []for x in range(hs):for y in range(hs):subgrid_coordinates.append((i + x, j + y))cell_coordinates.append(subgrid_coordinates)# 打印结果(元祖样式)
bg=[]
for coordinates in cell_coordinates:# print(coordinates)     # [(4, 8), (4, 9), (4, 10), (5, 8), (5, 9), (5, 10), (6, 8), (6, 9), (6, 10)]for c in  coordinates:print(c)        # 元组 (1, 2) 样式s = ''.join(str(num).zfill(2) for num in c)   # zfill将元组 (1, 2) 转换为字符串 '0102' 特别是(5,10)这种必须转成2个数字0510print(str(s))        #  '12'bg.append(s)  #  '0102'
print(bg)
# 3列4行12个3*3格子
# ['0000', '0001', '0002', '0100', '0101', '0102', '0200', '0201', '0202', 
# '0004', '0005', '0006', '0104', '0105', '0106', '0204', '0205', '0206', 
# '0008', '0009', '0010', '0108', '0109', '0110', '0208', '0209', '0210', 
# '0400', '0401', '0402', '0500', '0501', '0502', '0600', '0601', '0602', 
# '0404', '0405', '0406', '0504', '0505', '0506', '0604', '0605', '0606', 
# '0408', '0409', '0410', '0508', '0509', '0510', '0608', '0609', '0610', 
# '0800', '0801', '0802', '0900', '0901', '0902', '1000', '1001', '1002', 
# '0804', '0805', '0806', '0904', '0905', '0906', '1004', '1005', '1006', 
# '0808', '0809', '0810', '0908', '0909', '0910', '1008', '1009', '1010', 
# '1200', '1201', '1202', '1300', '1301', '1302', '1400', '1401', '1402', 
# '1204', '1205', '1206', '1304', '1305', '1306', '1404', '1405', '1406', 
# '1208', '1209', '1210', '1308', '1309', '1310', '1408', '1409', '1410']print('------第2步:制作3宫格的12套题的内容-------')# 制作3宫格的12套题目(没有空格,只有基础模板)
lst=[]
for b in range(1,hs+1):lst.append(b)
print(lst)permutations_list = list(permutations(lst))
numbers = [list(permutation) for permutation in permutations_list]
print(numbers)
# [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
# 6种组合# 互相组合成3组
import itertools# 计算排列数量并生成所有可能的排列
combinations2 = list(itertools.permutations(numbers, hs))
# 包含相似的# 输出排列数量
print(len(combinations2))
# 120# # 把所有数字都提取成元素
ll=[]
for o1 in combinations2:for o2 in o1:for o3 in o2:ll.append(o3)print(ll)
print(len(ll))
# 1080v=hs*hs
# 9个数字抽取一组
f=[]
for i in range(int(len(ll)/v)):f.append(ll[i*v:i*v+v])
# print(f)
# print(len(f))
#120条# # # 遍历表格,把0、5、10相同的内容删除,横向的数字1234都正确了,现在只要排除竖向不对的P=[]
z=[]
for k in f:  if int(k[0])!=int(k[3])!=int(k[6]) and int(k[0])+int(k[3])+int(k[6])==6 and\int(k[1])!=int(k[4])!=int(k[7]) and int(k[1])+int(k[4])+int(k[7])==6 and\int(k[2])!=int(k[5])!=int(k[8]) and int(k[2])+int(k[5])+int(k[8])==6 and\int(k[0])!=int(k[1])!=int(k[2]) and int(k[0])+int(k[1])+int(k[2])==6 and\int(k[3])!=int(k[4])!=int(k[5]) and int(k[3])+int(k[4])+int(k[5])==6 and\int(k[6])!=int(k[7])!=int(k[8]) and int(k[6])+int(k[7])+int(k[8])==6 :z.append(k)print(z)
print(len(z))# 12种基础样式
basis=[]
for hh in z:print(hh)basis.append(hh)
print(basis)
print(len(basis))    # 12种基础样式
# [1, 2, 3, 2, 3, 1, 3, 1, 2]
# [1, 2, 3, 3, 1, 2, 2, 3, 1]
# [1, 3, 2, 2, 1, 3, 3, 2, 1]
# [1, 3, 2, 3, 2, 1, 2, 1, 3]
# [2, 1, 3, 1, 3, 2, 3, 2, 1]
# [2, 1, 3, 3, 2, 1, 1, 3, 2]
# [2, 3, 1, 1, 2, 3, 3, 1, 2]
# [2, 3, 1, 3, 1, 2, 1, 2, 3]
# [3, 1, 2, 1, 2, 3, 2, 3, 1]
# [3, 1, 2, 2, 3, 1, 1, 2, 3]
# [3, 2, 1, 1, 3, 2, 2, 1, 3]
# [3, 2, 1, 2, 1, 3, 1, 3, 2]# # # 12道题目# print('---------第3步,原始列表生成样式1,了解数量和空格位置----------')
# 读取每一款,假设任意缺1空、任意缺2空,任意缺三空
# 原始列表
# import itertools
# m=1# for a in  basis[:sz]:#     # 做每种的样式模版一页
#     doc = Document(path+fr'\数独长方形({hs}宫格)合并版12标.docx'.format(hs))   #                 # 获取第一段
#     first_paragraph = doc.paragraphs[0]#     # 在段落中添加运行(run)
#     run = first_paragraph.add_run(f"{hs}宫格数独_样式A_标准答案")#     # 设置字体为黑体
#     # run.font.name = '等线 (中文正文)'
#     # 设置字号为32磅
#     run.font.size = Pt(20)
#     run.font.bold = True#     # 设置段落居中对齐
#     first_paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  
#     #    
#     table = doc.tables[0]          # 表0,表2 写标题用的
#     # 标题写入3、5单元格  
#     for t in range(0,hs*hs):             # 0-5是最下面一行,用来写卡片数字
#         pp=int(bg[t][0:2])     # 
#         qq=int(bg[t][2:4])
#         k=str(a[t])              # 提取list图案列表里面每个图形  t=索引数字
#         # print(pp,qq,k)#         # 图案符号的字体、大小参数
#         run=table.cell(pp,qq).paragraphs[0].add_run(k)    # 在单元格0,0(第1行第1列)输入第0个图图案
#         run.font.name = '黑体'#输入时默认华文彩云字体
#         # run.font.size = Pt(46)  #输入字体大小默认30号 换行(一页一份大卡片
#         run.font.size = Pt(130) #是否加粗
#         # run.font.color.rgb = RGBColor(150,150,150) #数字小,颜色深0-255
#         run.font.color.rgb = RGBColor(50,50,50) #数字小,颜色深0-255
#         run.bold=True
#         # paragraph.paragraph_format.line_spacing = Pt(180) #数字段间距#         r = run._element
#         r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
#         table.cell(pp,qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER#居中  #     doc.save(path+fr'\数独{hs}宫格数独_样式A_空00基本样式.docx')#保存为XX学号的电话号码word     
#     time.sleep(2)#     # 12张一页的样式
#     n=0
#     xx=0#     for x in range(start,hs*hs):
#         # 如果报错,就从相应的宫格数字继续生成
#         l1=[]
#         # 使用 combinations 生成所有不重复的组合
#         combinations = list(itertools.combinations(range(len(a)), x))
#         # 1有9次,2有36次,,3有84次,4有84次,3有84次,3有84次,3有84次,3有84次,3有84次,3有84次#         # 打印组合及其索引,并将索引位置的内容变成 ''
#         for comb in combinations:
#             # 创建副本以避免修改原始列表
#             modified_list = a[:]
#             # 将组合中的索引位置内容替换为 ''
#             for index in comb:
#                 modified_list[index] = ''#             # print(f"{modified_list}")
#             # print(f"Combination: {[modified_list[i] for i in comb]}, Indices: {comb}")
#             l1.append(modified_list)
#         # 输出组合的数量
#         # print(l)        
#         print(f"{x}空有{len(l1)}种")
#         # 1空有9种
#         # 2空有36种
#         # 3空有84种
#         # 4空有126种
#         # 5空有126种
#         # 6空有84种
#         # 7空有36种
#         # 8空有9种
#         # 9空有1种
#         n+=len(combinations)
#         # # 3宫格1套,511种,
#         print(n)    
#         # # 3宫格1套,12种图案,每种510,共6132种,
#         # print(n*len(basis))# #     print(n*576)#         # 将嵌套列表转换为扁平列表
#         flat_list = [item for sublist in l1 for item in sublist]
#         # print(flat_list)
#         print(len(flat_list))#             # 如果条数不满20条,只有一页
#         if len(l1) <=gz:
#             print(f"{len(l1)} 在范围 1页 内")
#             kong = gz - len(l1)
#             print(kong)
#             Y = 1
#             xx+=Y
#         # 判断多页情况下,最后一页是否能够凑满20行,凑不满,补空
#         else: 
#             for z in range(gz, gz*gz, gz):
#                 if z < len(l1) <= z + gz:
#                     # 出现过正好40条,只有两页,但出现了第3空页,少了小于等于z+2-
#                     print(f"{len(l1)} 在范围 {z}-{z+gz} 内")
#                     # 补多少的空格
#                     kong = z + gz - len(l1)
#                     print(kong)
#                     # 有几页
#                     Y = int((z + gz) / gz)
#                     xx+=Y
#          # 一个列表里面有7个空
#         w = [''] * hs*hs
#         # 需要14个这种7空的嵌套列表
#         v = [w] * kong
#         # print(v)#         #i 把实际的填写内容+补充的空格,凑满20的倍数页
#         l=l1+v
#         print(l)
#         print(len(l))
#         #  80  #         flat_list = [item for sublist in l for item in sublist]#         # 将扁平列表分割成每组12个元素的子列表
#         grouped_list = [flat_list[i:i + gz*hs*hs] for i in range(0, len(flat_list),  gz*hs*hs)]
#         print(grouped_list)    #         # 20:30-
#         print('------第4步:写入docx,word表格正好12格子,写入1页12个-------')
#         # 这里
#         for z in range(len(grouped_list)):
#             doc = Document(path+fr'\数独长方形({hs}宫格)合并版12.docx'.format(hs))   #                         # 获取第一段
#             first_paragraph = doc.paragraphs[0]#             # 在段落中添加运行(run)
#             run = first_paragraph.add_run(f"{hs}宫格数独_样式A_空{x:02}格{len(l1):03}种_第{z+1}/{len(grouped_list)}页")#             # 设置字体为黑体
#             run.font.name = '黑体'
#             # 设置字号为32磅
#             run.font.size = Pt(20)
#             run.font.bold = True#             # 设置段落居中对齐
#             first_paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  
#             #    
#             table = doc.tables[0]          # 表0,表2 写标题用的
#             # 标题写入3、5单元格  
#             for t in range(0,len(bg)):             # 0-5是最下面一行,用来写卡片数字
#                 pp=int(bg[t][0:2])     # 
#                 qq=int(bg[t][2:4])
#                 k=str(grouped_list[z][t])              # 提取list图案列表里面每个图形  t=索引数字
#                 # print(pp,qq,k)#                 # 图案符号的字体、大小参数
#                 run=table.cell(pp,qq).paragraphs[0].add_run(k)    # 在单元格0,0(第1行第1列)输入第0个图图案
#                 run.font.name = '黑体'#输入时默认华文彩云字体
#                 # run.font.size = Pt(46)  #输入字体大小默认30号 换行(一页一份大卡片
#                 run.font.size = Pt(size) #是否加粗
#                 # run.font.color.rgb = RGBColor(150,150,150) #数字小,颜色深0-255
#                 run.font.color.rgb = RGBColor(50,50,50) #数字小,颜色深0-255
#                 run.bold=True
#                 # paragraph.paragraph_format.line_spacing = Pt(180) #数字段间距#                 r = run._element
#                 r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
#                 table.cell(pp,qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER#居中  #             doc.save(tencent1+fr'\{hs}宫格数独_样式A_空{x:02}有{len(l1):03}种_{z+1:02}.docx')#保存为XX学号的电话号码word     
#             time.sleep(2)# print(f'共有{xx}张A4',f'共有{n}张小图')   
# 共有44张A4 共有510张小图 xx=44
n=510# print('---------第5步,将样式1的所有docx合并到一个docx内----------')import os
from win32com import client
from docx import Document# 设置路径
template_path = path+fr'\数独{hs}宫格数独_样式A_空00基本样式.docx'#保存为XX学号的电话号码word  
# template_path = path+r'\数独长方形(3宫格)合并版12空.docx'
# 添加在第一个基本样式文档里# 合并docx的路径
n1=f'02_{hs}宫格_样式模版_合并_{xx}张A4_{n}张小图'
tencent2=tencent+fr'\{n1}'
os.makedirs(tencent2,exist_ok=True)output_path = tencent2 + fr'\{n1}.docx' # 替换为你希望保存的文件路径word合并# # 打开Word应用程序
# word = client.Dispatch("Word.Application")
# word.Visible = False# # 打开模板文档
# doc = word.Documents.Open(template_path)# # 获取最后一个段落
# last_paragraph = doc.Paragraphs(doc.Paragraphs.Count)# # 遍历源文件夹中的所有Word文件
# # 遍历源文件夹中的所有文件
# # files = [f for f in os.listdir(tencent1) if f.endswith('.docx')]
# # for filename in files[1:]:  # 跳过第一个文件
# for filename in os.listdir(tencent1):
#     # if filename.endswith('.docx'):
#     file_path = os.path.join(tencent1, filename)
#     temp_doc = word.Documents.Open(file_path)#     # 复制每个文档的内容到模板的最后
#     first_para = temp_doc.Paragraphs(1)
#     new_para = doc.Content.InsertAfter(first_para.Range.Text + "\n")#     # 复制表格到模板的最后
#     for table in temp_doc.Tables:
#         table.Range.Copy()
#         last_paragraph.Range.Paste()
#         doc.Content.InsertParagraphAfter()
#         # 删除表格后的一个空行
#         last_paragraph.Range.Delete()#     temp_doc.Close()# # 保存修改后的文档
# doc.SaveAs(output_path)
# doc.Close()
# word.Quit()
# time.sleep(10)print('---------第6步,将样式1一个docx转为一个PDF----------')
from docx2pdf import convert
# docx 文件另存为PDF文件
inputFile = tencent2 + fr'\{n1}.docx' 
outputFile = tencent2 + fr'\{n1}.pdf' # # 先创建 不存在的 文件
f1 = open(outputFile, 'w')
f1.close()
# 再转换往PDF中写入内容
convert(inputFile, outputFile)
# 转换 .docx 文件为 PDFtime.sleep(5)print('---------第7步,读取样式1合并docx,将数字分别替换。----------')# 读取docx的表格数量,制作9*12和数字的列表,分别替换到0000-1520的坐标里,如果是空就不要写入
from docx import Document# 加载文档
doc1 = Document(output_path)
# 获取所有表格
tables1 = doc1.tables
# 打印表格数量
print(f'一共 {len(tables1)} 张表.')
# 1+44# li=['3','2','1','2','1','3','1','3','2']*12
# print(len(li))tencent3=tencent+fr'\03_{hs}宫格_样式{int(len(tables1)-1)}套_{xx}张A4_{n}张小图'
os.makedirs(tencent3,exist_ok=True)basisall=[]
for f in basis :    # 从12条基础里分别替换,乘以12次ff=f*int(len(tables1))basisall.append(ff)
print(basisall)
print(len(basisall))for g in range(len(basisall)):# 第一张基础样式表改数字table1 = doc1.tables[0]          # 从0+1表格开始# 标题写入3、5单元格  for t in range(len(bg[0:9])):             # 00,01,02,10,11,12,20,21,22pp=int(bg[0:9][t][0:2])     # qq=int(bg[0:9][t][2:4])cell_content =table1.cell( pp, qq).textif cell_content !='':     table1.cell(pp, qq).text = ''             # 清空单元格原来的数字,k1=str(basis[g][t])             # 换成新的数字print(pp,qq,k1)       # 图案符号的字体、大小参数run=table1.cell(pp,qq).paragraphs[0].add_run(k1)    # 在单元格0,0(第1行第1列)输入第0个图图案run.font.name = '黑体'#输入时默认华文彩云字体# run.font.size = Pt(46)  #输入字体大小默认30号 换行(一页一份大卡片run.font.size = Pt(130) #是否加粗# run.font.color.rgb = RGBColor(150,150,150) #数字小,颜色深0-255run.font.color.rgb = RGBColor(50,50,50) #数字小,颜色深0-255run.bold=True# paragraph.paragraph_format.line_spacing = Pt(180) #数字段间距r = run._elementr.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷table1.cell(pp,qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER#居中# 第二到N张表改数字for bb in range(1,len(tables1)):table1 = doc1.tables[bb]          # 从0+1表格开始# 标题写入3、5单元格  for t in range(len(bg)):             # 0-5是最下面一行,用来写卡片数字pp=int(bg[t][0:2])     # qq=int(bg[t][2:4])cell_content =table1.cell( pp, qq).textif cell_content !='':     table1.cell(pp, qq).text = ''             # 清空单元格原来的数字,k1=str(basisall[g][t])             # 换成新的数字print(pp,qq,k1)else: # 如果是空,就继续空,或者跳过k1=''            table1.cell(pp, qq).text = k1 print(pp,qq,k1)# 图案符号的字体、大小参数run=table1.cell(pp,qq).paragraphs[0].add_run(k1)    # 在单元格0,0(第1行第1列)输入第0个图图案run.font.name = '黑体'#输入时默认华文彩云字体# run.font.size = Pt(46)  #输入字体大小默认30号 换行(一页一份大卡片run.font.size = Pt(size) #是否加粗# run.font.color.rgb = RGBColor(150,150,150) #数字小,颜色深0-255run.font.color.rgb = RGBColor(50,50,50) #数字小,颜色深0-255run.bold=True# paragraph.paragraph_format.line_spacing = Pt(180) #数字段间距r = run._elementr.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷table1.cell(pp,qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER#居中# 把样式01替换成样式XX # # 遍历每个段落# for para in doc1.paragraphs:#     for run1 in para.runs: #         if g==0:           #             t1='样式A'#             t2=f'样式{g+1:02}'#             if t1 in run1.text:#                 # 替换文本但保留格式#                 run1.text = run1.text.replace(t1, t2)#         else:#             t1=f'样式{g:02}'#             # t1=f'样式A'#             t2=f'样式{g+1:02}'#             if t1 in run1.text:#                 # 替换文本但保留格式#                 run1.text = run1.text.replace(t1, t2)doc1.save(tencent3+fr'\{hs}宫格数独_样式{g+1:02}_{xx}张A4_{n}张小图.docx')time.sleep(2)# 把第一页的样式的X改成01】02doc2 = Document(tencent3+fr'\{hs}宫格数独_样式{g+1:02}_{xx}张A4_{n}张小图.docx')# 获取所有表格for para in doc2.paragraphs:for run1 in para.runs: # if g==0:           #     t1='样式A'#     t2=f'样式{g+1:02}'#     if t1 in run1.text:#         # 替换文本但保留格式#         run1.text = run1.text.replace(t1, t2)# else:t1='样式A'# t1=f'样式A't2=f'样式{g+1:02}'if t1 in run1.text:# 替换文本但保留格式run1.text = run1.text.replace(t1, t2)# for para in doc1.paragraphs:#     for run in para.runs: #         t1='样式A'#         t2=f'样式{g+1:02}'#         if t1 in run.text:#             # 替换文本但保留格式#             run.text = run.text.replace(t1, t2)doc2.save(tencent3+fr'\{hs}宫格数独_样式{g+1:02}_{xx}张A4_{n}张小图.docx')time.sleep(2)# print('---------第9步,把12个样式的docx转成12个PDF----------')
# from docx2pdf import convert
# for filename in os.listdir(tencent3):
#     if filename.endswith('.docx'):
#         docx_path = os.path.join(tencent3, filename)
#         pdf_path = os.path.join(tencent3, filename.replace('.docx', '.pdf'))#         # 先创建不存在的PDF文件
#         with open(pdf_path, 'wb') as f:
#             pass#         # 转换并写入内容到PDF中
#         convert(docx_path, pdf_path)
#         time.sleep(5)# # 这样,整个脚本就不需要使用 `def` 函数了。所有的操作都在全局范围内执行。# #     #         # from docx2pdf import convert
# #     #         # # docx 文件另存为PDF文件
# #     #         # inputFile = tencent+fr'\{hs}宫格数独_样式{m:02}_空{x:02}有{len(l1):03}种_{z+1:02}.docx'# 要转换的文件:已存在
# #     #         # outputFile =tencent+fr'\{hs}宫格数独_样式{m:02}_空{x:02}有{len(l1):03}种_{z+1:02}.pdf' # 要生成的文件:不存在
# #     #         # # 先创建 不存在的 文件
# #     #         # f1 = open(outputFile, 'w')
# #     #         # f1.close()
# #     #         # # 再转换往PDF中写入内容
# #     #         # convert(inputFile, outputFile)
# #     #         # time.sleep(1)
# #     # m+=1
# #     # n+=1
# #     # print(f'共{n}图,共{}张')# # #     print('----------第4步:把都有PDF合并为一个打印用PDF------------')# # #     # 多个PDF合并(CSDN博主「红色小小螃蟹」,https://blog.csdn.net/yangcunbiao/article/details/125248205)
# # #     import os
# # #     from PyPDF2 import PdfMerger
# # #     target_path =  tencent
# # #     pdf_lst = [f for f in os.listdir(target_path) if f.endswith('.pdf')]
# # #     pdf_lst = [os.path.join(target_path, filename) for filename in pdf_lst]
# # #     pdf_lst.sort()
# # #     file_merger = PdfMerger()
# # #     for pdf in pdf_lst:
# # #         print(pdf)
# # #         file_merger.append(pdf)
# # #     time.sleep(10) # # # file_merger.write(path+fr'\长方形{hs}宫格数独{gz}套基本形_每套{n}张_共{gz*n}小张.pdf')# # # file_merger.close()
# # # # doc.Close()# # # # # print('----------第5步:删除临时文件夹------------')    
# # # import shutil
# # # # shutil.rmtree(tencent) #递归删除文件夹,即:删除非空文件夹# # # time.sleep(3)    # 防止转换时报错,预留生成时间# # 记录程序结束时间
# end_time = datetime.now()# # 计算程序运行时间
# elapsed_time = end_time - start_time# print(f"动物数独{hs}宫格程序开始时间:{start_time}")
# print(f"动物数独{hs}宫格程序结束时间:{end_time}")# # 打印程序运行时间
# print("程序运行时间:", elapsed_time)

这样生成一套,只要

但是不稳定,继续调试代码

相关文章:

【教学类-43-25】20241203 数独3宫格的所有可能-使用模版替换(12套样式,空1格-空8格,每套510张,共6120小图)

前期做数独惨宫格的所有排列&#xff0c;共有12套样式&#xff0c;空1格-空8格&#xff0c;每套510张&#xff0c;共6120小图&#xff09; 【教学类-43-24】20241127 数独3宫格的所有可能&#xff08;12套样式&#xff0c;空1格-空8格&#xff0c;每套510张&#xff0c;共6120…...

组合问题变式——选数(dfs)

代码随想录听课笔记1——回溯算法-CSDN博客 这是从1&#xff0c;2&#xff0c;3...,n个数字中选出k个数的组合&#xff0c;输出组合的全部可能的代码 //组合&#xff1a;返回1-n中所有个数为k的组合 1,2,3,4 #include<bits/stdc.h> using namespace std; #define MAX 1…...

怎麼解決路由器IP地址衝突?

路由器IP地址衝突通常發生在網路中有兩個設備嘗試使用相同的IP地址時。這種衝突會導致網路連接問題&#xff0c;因為每個設備需要一個唯一的IP地址才能正常通信。 1. 重啟設備 重啟路由器和設備&#xff1a;有時候簡單的重啟可以解決問題&#xff0c;設備重新獲取一個新的IP地…...

【Flink】Flink 作业执行大致流程

Flink 作业执行流程 (Application 模式) 客户端通过 ClusterDescriptor 提交 Application 模式 Sql 任务到服务端&#xff0c;服务端调用作业时 StreamTableEnvironment 使用 FlinkSqlParser 将 SQL 转换为 Operation , StreamTableEnvironment 转换 SQL 过程中使用 CatalogSou…...

mdf文件数据处理之画图(subplots多信号展示同一张图中)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

python基础知识(一)

文章目录 基础语法注释多行语句数字(Number)类型字符串(String)字符串常用方法字符串格式化 import与from...import 基本数据类型多个变量赋值标准数据类型 运算符算术运算符赋值运算符逻辑运算符成员运算符身份运算符 基础语法 注释 python注释可以使用#&#xff0c;或者三个…...

解决 Flutter Dio合并请求多个接口,如果一个接口500,那么导致其他请求不在执行

Flutter Dio如何自定义拦截异常 应用场景 我们一般会统一拦截DioExceptionType 如400&#xff0c;403&#xff0c;500 等错误 但有时候&#xff0c;有个地方合并请求多个接口&#xff0c;如果一个接口500&#xff0c;那么导致其他请求不在执行&#xff0c;因为统一拦截了500&…...

RPC一分钟

概述 微服务治理&#xff1a;Springcloud、Dubbo服务通信&#xff1a;Grpc、Trift Dubbo 参考 Dubbo核心功能&#xff0c;主要提供了&#xff1a;远程方法调用、智能容错和负载均衡、提供服务自动注册、自动发现等高效服务治理功能。 Dubbo协议Dubbo支持dubbo、rmi、http、…...

CentOS 7 docker部署jar包

1、创建Dockerfile vim Dockerfile2、编辑内容 # 基础镜像 FROM openjdk:8 # 作者或联系方式 MAINTAINER wq # test为别名 ADD erp-1.0.jar /test.jar # 容器暴露端口 EXPOSE 8081 ENTRYPOINT ["java","-jar","test.jar"]3、生成镜像 docker …...

高性能mysql 1

高性能mysql 1 参考&#xff1a; 博客 https://segmentfault.com/a/1190000040374142书籍&#x1f4da;’High performance mysql’ ​ I note some hard part ,translating it into Chinese for a better comprehensionsometimes when I have some trouble with reading En…...

QT发布ArcGIS QML项目时遇到的问题

在打包 ArcGIS Runtime SDK for Qt 项目时&#xff0c;如果项目中没有正确显示地图或者图层&#xff0c;且在项目的 DLL 依赖中没有找到与 ArcGIS SDK 相关的依赖&#xff0c;可能是由于以下几种原因导致的&#xff1a; 1. 未正确配置 ArcGIS SDK 的依赖 ArcGIS Runtime SDK …...

高校数字化运营平台解决方案:构建统一的服务大厅、业务平台、办公平台,助力打造智慧校园

教育数字化是建设教育强国的重要基础&#xff0c;利用技术和数据助推高校管理转型&#xff0c;从而更好地支撑教学业务开展。 近年来&#xff0c;国家多次发布政策&#xff0c;驱动教育行业的数字化转型。《“十四五”国家信息化规划》&#xff0c;推进信息技术、智能技术与教育…...

cocotb value cocotb—基础语法对照篇

cocotb—基础语法对照篇 import cocotb from cocotb.triggers import Timer from adder_model import adder_model from cocotb.clock import Clock from cocotb.triggers import RisingEdge import randomcocotb.test() async def adder_basic_test(dut):"""Te…...

LLM与动态符号执行生成测试用例的比较

LLM与动态符号执行生成测试用例的比较 在软件测试领域&#xff0c;生成有效的测试用例是确保软件质量和可靠性的关键步骤。近年来&#xff0c;大型语言模型&#xff08;Large Language Models&#xff0c;LLM&#xff09;和动态符号执行&#xff08;Dynamic Symbolic Executio…...

torchvison.models中包含的哪些模型?

1.模型 Alexnet AlexNet 是一个具有 8 层的深度卷积神经网络&#xff0c;结构上比早期的卷积神经网络&#xff08;如 LeNet&#xff09;要深得多。它由 5 个卷积层&#xff08;conv layers&#xff09;和 3 个全连接层&#xff08;fully connected layers&#xff09;组成。Al…...

安装v2x,使用docker安装deepstream,安装v2x步骤,并使用tritonServer进行推理步骤,以及避坑问题

1,安装步骤 大致分为下面的安装过程: a 安装docker,b 本地安装环境,c 拉取docker镜像,d,本地下载数据 e,移动数据到docker下目录,f,docker下解压数据,g,docker下engine化数据,h,docker下编译v2x并运行离线数据,r,rtsp数据流替换并运行 To install these packages…...

2022 年 6 月青少年软编等考 C 语言三级真题解析

目录 T1. 制作蛋糕思路分析T2. 找和最接近但不超过K的两个元素思路分析T3. 数根思路分析T4. 迷信的病人思路分析T5. 算 24思路分析T1. 制作蛋糕 小 A 擅长制作香蕉蛋糕和巧克力蛋糕。制作一个香蕉蛋糕需要 2 2 2 个单位的香蕉, 250 250 250 个单位的面粉, 75 75 75 个单位的…...

java opcua server服务端开发 设置用户密码访问

前言 关于使用milo开源库,开发opc ua服务器,之前的教程中,都是使用的匿名访问,有网友咨询如何设置服务端使用用户密码访问,于是我完善了这部分的空缺整理整了这篇教程,希望能解决有同样需求,但是遇到困难的网友!因为milo没有官方文档的教程且网上详细的教程很少,本人…...

SQLite:DDL(数据定义语言)的基本用法

SQLite&#xff1a;DDL&#xff08;数据定义语言&#xff09;的基本用法 1 主要内容说明2 相关内容说明2.1 创建表格&#xff08;create table&#xff09;2.1.1 SQLite常见的数据类型2.1.1.1 integer&#xff08;整型&#xff09;2.1.1.2 text&#xff08;文本型&#xff09;2…...

Spring-Smart-DI !动态切换实现类框架

背景 一般我们系统同一个功能可能会对接多个服务商&#xff0c;防止某个服务商的服务不可用快速切换或者收费不同需要切换&#xff0c;那我们一般做快速切换逻辑传统无非就是先将每个服务商实现&#xff0c;然后在配置点&#xff08;数据库或者nacos&#xff09;配置当前正在使…...

【SCT71401】3V-40V Vin, 150mA, 2.5uA IQ,低压稳压器,替代SGM2203

SCT71401 3V-40V Vin, 150mA, 2.5uA IQ&#xff0c;低压稳压器&#xff0c;替代SGM2203 描述 SCT71401系列产品是一款低压差线性稳压器&#xff0c;设计用于3 V至40 V &#xff08;45V瞬态输入电压&#xff09;的宽输入电压范围和150mA输出电流。SCT71401系列产品使用3.3uF…...

浅谈网络 | 应用层之流媒体与P2P协议

目录 流媒体名词系列视频的本质视频压缩编码过程如何在直播中看到帅哥美女&#xff1f;RTMP 协议 P2PP2P 文件下载种子文件 (.torrent)去中心化网络&#xff08;DHT&#xff09;哈希值与 DHT 网络DHT 网络是如何查找 流媒体 直播系统组成与协议 近几年直播比较火&#xff0c;…...

Brain.js(六):构建FNN神经网络实战教程 - 用户喜好预测

在前文不同的神经网络类型和对比 针对不同的神经网络类型做了对比&#xff0c;本章将对FNN稍作展开 测试环境&#xff1a; chrome 版本 131.0.6778.86&#xff08;正式版本&#xff09; &#xff08;64 位&#xff09; 一、引言 Brain.js 是一个简单易用的 JavaScript 神经网…...

重学设计模式-建造者模式

本文介绍一下建造者模式&#xff0c;相对于工厂模式来说&#xff0c;建造者模式更为简单&#xff0c;且用的更少 定义 建造者模式是一种创建型设计模式&#xff0c;它使用多个简单的对象一步一步构建成一个复杂的对象。这种模式的主要目的是将一个复杂对象的构建过程与其表示…...

linux下c++调用opencv3.4.16实战技巧

目录 参考:在图像上绘框在图像上绘圆在图像上绘文字在图像上绘制线灰度图rgb转yuvOpenCV 读取视频,设置起始帧、结束帧及帧率获取(1.1)简介(1.2)Mat类型(1.3)IplImage类型将OpenCV抓拍的图片进行x264编码并保存到文件c++调用opencv,读取rtsp视频流参考: https://blog…...

记录css模糊程度的属性

记录需要模糊以及透明化图片需求&#xff1a; opacity: &#xff08;0到1之间数字&#xff0c;dom透明程度&#xff09;。 filter: blur() 括号里需数字&#xff0c;单位为px&#xff0c;值越大模糊程度越大。 关于css中filter属性记录 filter 滤镜属性&#xff1a; blur&…...

K8S的监控与告警配置有哪些最佳实践

在 Kubernetes (K8s) 集群中实现有效的监控与告警是确保集群稳定性、性能以及及时响应潜在问题的关键。以下是 K8s 监控与告警配置的最佳实践&#xff0c;涵盖了监控工具的选择、告警规则的配置、数据存储与可视化等方面。 1. 选择合适的监控工具 Kubernetes 生态系统有多种监…...

如何在Ubuntu 20.04上安装和使用PostgreSQL:一步步指南

如何在Ubuntu 20.04上安装和使用PostgreSQL&#xff1a;一步步指南 在Ubuntu 20.04上安装和使用PostgreSQL数据库包括几个明确的步骤&#xff1a;安装、配置、创建用户和数据库、以及基本的数据库操作。下面&#xff0c;我将详细解释每个步骤&#xff0c;并提供具体的命令行示…...

PostGis学习笔记

– 文本方式查看几何数据 SELECT ST_AsText(geom)FROM nyc_streets WHERE name ‘Avenue O’; – 计算紧邻的街区 SELECT name,ST_GeometryType(geom) FROM nyc_streets WHERE ST_DWithin( geom,ST_GeomFromText(‘LINESTRING(586782 4504202,586864 4504216)’,26918),0.1); …...

JDK17 线程池 ThreadPoolExecutor

文章目录 线程池ThreadPoolExecutor状态向线程池添加任务 executeWorker线程池新建工作线程 addWorker 拒绝策略 线程池 线程池将创建线程和使用线程解耦。优点是 避免重复创建和销毁线程&#xff0c;降低资源消耗。任务不用等待创建线程的时间&#xff0c;提高响应速度。统一…...

Dify+Docker

1. 获取代码 直接下载 &#xff08;1&#xff09;访问 langgenius/dify: Dify is an open-source LLM app development platform. Difys intuitive interface combines AI workflow, RAG pipeline, agent capabilities, model management, observability features and more, …...

分布式会话 详解

分布式会话详解 在分布式系统中&#xff0c;用户的会话状态需要在多个服务器或节点之间共享或存储。分布式会话指的是在这种场景下如何管理和存储会话&#xff0c;以便在多个节点上都能正确识别用户状态&#xff0c;从而保证用户体验的一致性。 1. 为什么需要分布式会话 在单…...

Java进阶

Java进阶 java注解 java中注解(Annotation),又称为java标注,是一种特殊的注释,可以添加在包,类,成员变量,方法,参数等内容上面.注解会随同代码编译到字节码文件中,在运行时,可以通过反射机制获取到类中的注解,然后根据不同的注解进行相应的解析. 内置注解 Java 语言中已经定…...

Qt/C++实现帧同步播放器/硬解码GPU绘制/超低资源占用/支持8K16K/支持win/linux/mac/嵌入式/国产OS等

一、前言 首先泼一盆冷水&#xff0c;在不同的电脑上实现完完全全的帧同步理论上是不可能的&#xff0c;市面上所有号称帧同步的播放器&#xff0c;同一台电脑不同拼接视频可以通过合并成一张图片来绘制实现完完全全的帧同步&#xff0c;不同电脑&#xff0c;受限于网络的延迟…...

hhdb数据库介绍(10-33)

管理 数据归档 归档记录查询 功能入口&#xff1a;“管理->数据归档->归档记录查询” 需要确保配置的归档用户对数据归档规则所在的逻辑库具备CREATE权限&#xff0c;以及对原数据表具有所有权限。 清理归档数据 &#xff08;一&#xff09;功能入口&#xff1a;“…...

UE4_材质节点_有关距离的_流体模拟

一、材质节点介绍&#xff1a; 特别注意&#xff1a;距离场需要独立显卡支持。 1、什么是距离场&#xff1f; 想象一下空间中只有两个实体, 一个球,一个圆柱. 空间由无数个点组成, 取其中任何一个点, 比如,它跟球面的最近距离是3, 跟圆柱面的最近距离是2, 那么这个点的值就…...

SpringBoot集成 SpringDoc (SpringFox 和 Swagger 的升级版)

阅读 SpringDoc 官网 - Migrating from SpringFox 只需要导入以下一个依赖即可&#xff1a; <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.7.0</version>…...

分布式推理框架 xDit

1. xDiT 简介 xDiT 是一个为大规模多 GPU 集群上的 Diffusion Transformers&#xff08;DiTs&#xff09;设计的可扩展推理引擎。它提供了一套高效的并行方法和 GPU 内核加速技术&#xff0c;以满足实时推理需求。 1.1 DiT 和 LLM DiT&#xff08;Diffusion Transformers&am…...

《Vue零基础入门教程》第十七课:侦听器

往期内容 《Vue零基础入门教程》第九课&#xff1a;插值语法细节 《Vue零基础入门教程》第十课&#xff1a;属性绑定指令 《Vue零基础入门教程》第十一课&#xff1a;事件绑定指令 《Vue零基础入门教程》第十二课&#xff1a;双向绑定指令 《Vue零基础入门教程》第十三课&…...

【人工智能-基础】SVM中的核函数到底是什么

文章目录 支持向量机(SVM)中的核函数详解1. 什么是核函数?核函数的作用:2. 核技巧:从低维到高维的映射3. 常见的核函数类型3.1 线性核函数3.2 多项式核函数3.3 高斯径向基函数(RBF核)4. 总结支持向量机(SVM)中的核函数详解 支持向量机(SVM,Support Vector Machine)…...

RoBERTa- 稳健优化的 BERT 预训练模型详解

一、引言 自 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;问世&#xff0c;预训练语言模型在自然语言处理&#xff08;NLP&#xff09;领域掀起革命浪潮&#xff0c;凭卓越表现大幅刷新诸多任务成绩。RoBERTa 承继 BERT 架构&#x…...

20.(开发工具篇github)Git上次超过100M单文件

1:安装lfs git lfs install 2: 撤销所有更改&#xff08;包括未暂存的更改&#xff09; git reset --hard 3:查找大于100M的文件 find ./ -size 100M 4:加入到 track git lfs track “./data/geo_tif_zzjg/2023年_种植结构影像.tif” git lfs track “./data/geo_tif_zz…...

Redis使用场景-缓存-缓存击穿

前言 之前在针对实习面试的博文中讲到Redis在实际开发中的生产问题&#xff0c;其中缓存穿透、击穿、雪崩在面试中问的最频繁&#xff0c;本文加了图解&#xff0c;希望帮助你更直观的了解缓存击穿&#x1f600; &#xff08;放出之前写的针对实习面试的关于Redis生产问题的博…...

uniapp Electron打包生成桌面应用exe文件

1.uniapp Electron打包生成桌面应用exe文件 随着跨平台开发的需求日益增长,UniApp 成为了开发者们的首选之一。通过 UniApp,你可以使用 Vue.js 的语法结构和组件系统来构建原生应用、Web 应用甚至是桌面应用。本文将详细介绍如何使用 UniApp 将你的项目打包成 Windows 桌面端…...

【机器学习】Sigmoid函数在深层神经网络中存在梯度消失问题,如何设计一种改进的Sigmoid激活函数,既能保持其概率预测优势,又能避免梯度消失?

为了解决 Sigmoid 函数在深层神经网络中的梯度消失问题&#xff0c;可以设计一种改进的 Sigmoid 激活函数&#xff0c;使其同时具备以下特性&#xff1a; 减缓梯度消失问题&#xff1a;避免在输入值远离零时梯度趋于零的问题。保持概率预测能力&#xff1a;保留 Sigmoid 的单调…...

SpringBoot中实现EasyExcel实现动态表头导入(完整版)

前言 最近在写项目的时候有一个需求&#xff0c;就是实现动态表头的导入&#xff0c;那时候我自己也不知道动态表头导入是什么&#xff0c;查询了大量的网站和资料&#xff0c;终于了解了动态表头导入是什么。 一、准备工作 确保项目中引入了处理 Excel 文件的相关库&#xff…...

前端用到的一些框架

拖拽框架&#xff1a;Vue.Draggable Vue.Draggable是一款基于Sortable.js拖拽插件 官网&#xff1a;https://github.com/SortableJS/Vue.Draggable 分屏插件&#xff1a;fullPage.js fullPage.js 是一个基于 jQuery 的插件&#xff0c;它能够很方便、很轻松的制作出全屏网站…...

“量子跃迁与数据织网:深入探索K最近邻算法在高维空间中的优化路径、神经网络融合技术及未来机器学习生态系统的构建“

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…...

10个Word自动化办公脚本

在日常工作和学习中&#xff0c;我们常常需要处理Word文档&#xff08;.docx&#xff09;。 Python提供了强大的库&#xff0c;如python-docx&#xff0c;使我们能够轻松地进行文档创建、编辑和格式化等操作。本文将分享10个使用Python编写的Word自动化脚本&#xff0c;帮助新…...

【青牛科技】D35摄氏温度传感器芯片,低功耗,静态工作电流小于60 μA

概述&#xff1a; D35是基于模拟电路的一种基本摄氏温度传感器&#xff0c;其作用是将感测的环境温度/物体温度精确的以电压的形式输出&#xff0c;且输出电压与摄氏温度成线性正比关系&#xff0c;转换公式为Vo0 10 mV / ℃*T&#xff08;℃&#xff09;&#xff0c;0C时输出为…...