使用 Python 自动化 Word 文档样式复制与内容生成
在办公自动化领域,如何高效地处理 Word 文档的样式和内容复制是一个常见需求。本文将通过一个完整的代码示例,展示如何利用 Python 的 python-docx
库实现 Word 文档样式的深度复制 和 动态内容生成,并结合知识库中的最佳实践优化文档处理流程。
一、为什么需要自动化 Word 文档处理?
手动处理 Word 文档(如复制样式、插入表格/图片)不仅耗时且容易出错。Python 提供了多种库(如 python-docx
、pywin32
、Spire.Doc
)来自动化这些任务。例如,python-docx
可以直接操作 .docx
文件的段落、表格和样式,而无需依赖 Microsoft Office 软件。
二、核心功能实现:样式与表格的深度复制
1. 表格复制(含样式与内容)
以下函数 clone_table
实现了表格的 结构、样式和内容 的完整复制:
def clone_table(old_table, new_doc):"""根据旧表格创建新表格"""# 创建新表格(行列数与原表一致)new_table = new_doc.add_table(rows=len(old_table.rows), cols=len(old_table.columns))# 复制表格样式(如边框、背景色)if old_table.style:new_table.style = old_table.style# 遍历单元格内容与样式for i, old_row in enumerate(old_table.rows):for j, old_cell in enumerate(old_row.cells):new_cell = new_table.cell(i, j)# 清空新单元格默认段落for paragraph in new_cell.paragraphs:new_cell._element.remove(paragraph._element)# 复制段落与样式for old_paragraph in old_cell.paragraphs:new_paragraph = new_cell.add_paragraph()for old_run in old_paragraph.runs:new_run = new_paragraph.add_run(old_run.text)copy_paragraph_style(old_run, new_run) # 自定义样式复制函数new_paragraph.alignment = old_paragraph.alignmentcopy_cell_borders(old_cell, new_cell) # 复制单元格边框# 复制列宽for i, col in enumerate(old_table.columns):if col.width is not None:new_table.columns[i].width = col.widthreturn new_table
关键点解析:
- 表格样式保留:通过
new_table.style = old_table.style
直接继承原表格的样式。 - 单元格内容与格式分离处理:先清空新单元格的默认段落,再逐行复制文本和样式。
- 边框与列宽:通过
copy_cell_borders
和列宽设置确保视觉一致性。
2. 文档整体样式复制与内容生成
以下函数 clone_document
实现了从模板文档提取样式,并动态填充内容:
def clone_document(old_s, old_p, old_ws, new_doc_path):new_doc = Document() # 创建新文档# 动态填充内容for para in old_p:k, v = para["sn"], para["ct"] # 假设 old_p 包含样式名(sn)和内容(ct)if "image" in v:# 插入图片(需实现 copy_inline_shapes 函数)copy_inline_shapes(new_doc, k, [i for i in old_s if v in i][0][v])elif "table" == k:# 插入表格(需实现 html_table_to_docx 函数)html_table_to_docx(new_doc, v)else:# 段落处理style = [i for i in old_s if i["style"]["sn"] == k]style_ws = [i for i in old_ws if i["style"]["sn"] == k]clone_paragraph(style[0], v, new_doc, style_ws[0]) # 克隆段落样式new_doc.save(new_doc_path) # 保存新文档
数据结构说明:
old_s
:模板文档的样式定义(如字体、段落对齐方式)。old_p
:内容数据(含样式标签与实际内容)。old_ws
:工作表上下文(如表格所在位置)。
三、完整流程演示
1. 依赖准备
首先安装 python-docx
:
pip install python-docx
2. 辅助函数实现
以下函数需额外实现(代码未展示完整):
copy_paragraph_style
:复制段落样式(如字体、颜色)。copy_cell_borders
:复制单元格边框样式。get_para_style
:从模板文档提取样式。html_table_to_docx
:将 HTML 表格转换为 Word 表格。
3. 主程序调用
if __name__ == "__main__":# 从模板提取样式与工作表body_ws, _ = get_para_style('demo_template.docx')body_s, body_p = get_para_style("1.docx")# 从 JSON 文件加载内容with open("1.json", "r", encoding="utf-8") as f:body_p = json.loads(f.read())# 生成新文档clone_document(body_s, body_p, body_ws, 'cloned_example.docx')
四、实际应用场景
-
报告自动生成
结合模板样式,动态填充数据库数据生成标准化报告。 -
批量文档处理
将多个 Excel 表格批量转换为 Word 文档(参考知识库中的pywin32
与python-docx
联合使用)。 -
博客内容迁移
将 Word 文档保存为 HTML 后,按知识库中的步骤导入 ZBlog 或 WordPress(见知识库 [2] 和 [5])。
五、常见问题与优化建议
1. 样式丢失问题
- 原因:Word 文档的样式可能依赖隐式继承。
- 解决方案:使用
python-docx
的style
属性显式设置样式,或参考知识库 [7] 使用Spire.Doc
进行更复杂的样式处理。
2. 图片与表格嵌入异常
- 原因:路径错误或资源未正确加载。
- 解决方案:确保图片路径绝对化,或使用
docx.shared.Inches
显式指定尺寸。
3. 性能优化
- 大文档处理:避免频繁调用
add_paragraph
,改用批量操作。 - 内存管理:及时释放
Document
对象(如doc = None
)。
六、总结
通过本文的代码示例和解析,您已掌握如何使用 Python 实现 Word 文档的 样式深度复制 和 动态内容生成。结合知识库中的其他技术(如 ZBlog 导入、Office 自动化),可进一步扩展至完整的文档工作流自动化。
希望这篇博客能帮助您高效实现文档自动化!如需进一步优化或功能扩展,欢迎留言讨论。
from docx.enum.text import WD_BREAKfrom docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml import OxmlElement
from bs4 import BeautifulSoupfrom docx.oxml.ns import qndef docx_table_to_html(word_table):soup = BeautifulSoup(features='html.parser')html_table = soup.new_tag('table', style="border-collapse: collapse;")# 记录哪些单元格已经被合并merged_cells = [[False for _ in range(len(word_table.columns))] for _ in range(len(word_table.rows))]for row_idx, row in enumerate(word_table.rows):html_tr = soup.new_tag('tr')col_idx = 0while col_idx < len(row.cells):cell = row.cells[col_idx]# 如果该单元格已经被合并(被前面的 colspan 或 rowspan 占用),跳过if merged_cells[row_idx][col_idx]:col_idx += 1continue# 跳过纵向合并中被“continue”的单元格v_merge = cell._element.tcPr and cell._element.tcPr.find(qn('w:vMerge'))if v_merge is not None and v_merge.get(qn('w:val')) == 'continue':col_idx += 1continuetd = soup.new_tag('td')# 设置文本内容td.string = cell.text.strip()# 初始化样式字符串td_style = ''# 获取单元格样式if cell._element.tcPr:tc_pr = cell._element.tcPr# 处理背景颜色shd = tc_pr.find(qn('w:shd'))if shd is not None:bg_color = shd.get(qn('w:fill'))if bg_color:td_style += f'background-color:#{bg_color};'# 处理对齐方式jc = tc_pr.find(qn('w:jc'))if jc is not None:align = jc.get(qn('w:val'))if align == 'center':td_style += 'text-align:center;'elif align == 'right':td_style += 'text-align:right;'else:td_style += 'text-align:left;'# 处理边框borders = tc_pr.find(qn('w:tcBorders'))if borders is not None:for border_type in ['top', 'left', 'bottom', 'right']:border = borders.find(qn(f'w:{border_type}'))if border is not None:color = border.get(qn('w:color'), '000000')size = int(border.get(qn('w:sz'), '4')) # 半点单位,1pt = 2szstyle = border.get(qn('w:val'), 'single')td_style += f'border-{border_type}:{size // 2}px {style} #{color};'# 处理横向合并(colspan)grid_span = tc_pr.find(qn('w:gridSpan'))if grid_span is not None:colspan = int(grid_span.get(qn('w:val'), '1'))if colspan > 1:td['colspan'] = colspan# 标记后面被合并的单元格for c in range(col_idx + 1, col_idx + colspan):if c < len(row.cells):merged_cells[row_idx][c] = True# 处理纵向合并(rowspan)v_merge = tc_pr.find(qn('w:vMerge'))if v_merge is not None and v_merge.get(qn('w:val')) != 'continue':rowspan = 1next_row_idx = row_idx + 1while next_row_idx < len(word_table.rows):next_cell = word_table.rows[next_row_idx].cells[col_idx]next_v_merge = next_cell._element.tcPr and next_cell._element.tcPr.find(qn('w:vMerge'))if next_v_merge is not None and next_v_merge.get(qn('w:val')) == 'continue':rowspan += 1next_row_idx += 1else:breakif rowspan > 1:td['rowspan'] = rowspan# 标记后面被合并的行for r in range(row_idx + 1, row_idx + rowspan):if r < len(word_table.rows):merged_cells[r][col_idx] = True# 设置样式和默认边距td['style'] = td_style + "padding: 5px;"html_tr.append(td)# 更新列索引if 'colspan' in td.attrs:col_idx += int(td['colspan'])else:col_idx += 1html_table.append(html_tr)soup.append(html_table)return str(soup)def set_cell_background(cell, color_hex):"""设置单元格背景色"""color_hex = color_hex.lstrip('#')shading_elm = OxmlElement('w:shd')shading_elm.set(qn('w:fill'), color_hex)cell._tc.get_or_add_tcPr().append(shading_elm)def html_table_to_docx(doc, html_content):"""将 HTML 中的表格转换为 Word 文档中的表格:param html_content: HTML 字符串:param doc: python-docx Document 实例"""soup = BeautifulSoup(html_content, 'html.parser')tables = soup.find_all('table')for html_table in tables:# 获取表格行数trs = html_table.find_all('tr')rows = len(trs)# 估算最大列数(考虑 colspan)cols = 0for tr in trs:col_count = 0for cell in tr.find_all(['td', 'th']):col_count += int(cell.get('colspan', 1))cols = max(cols, col_count)# 创建 Word 表格table = doc.add_table(rows=rows, cols=cols)table.style = 'Table Grid'# 记录已处理的单元格(用于处理合并)used_cells = [[False for _ in range(cols)] for _ in range(rows)]for row_idx, tr in enumerate(trs):cells = tr.find_all(['td', 'th'])col_idx = 0for cell in cells:while col_idx < cols and used_cells[row_idx][col_idx]:col_idx += 1if col_idx >= cols:break # 避免越界# 获取 colspan 和 rowspancolspan = int(cell.get('colspan', 1))rowspan = int(cell.get('rowspan', 1))# 获取文本内容text = cell.get_text(strip=True)# 获取对齐方式align = cell.get('align')align_map = {'left': WD_ALIGN_PARAGRAPH.LEFT,'center': WD_ALIGN_PARAGRAPH.CENTER,'right': WD_ALIGN_PARAGRAPH.RIGHT}# 获取背景颜色style = cell.get('style', '')bg_color = Nonefor s in style.split(';'):if 'background-color' in s or 'background' in s:bg_color = s.split(':')[1].strip()break# 获取 Word 单元格word_cell = table.cell(row_idx, col_idx)# 合并单元格if colspan > 1 or rowspan > 1:end_row = min(row_idx + rowspan - 1, rows - 1)end_col = min(col_idx + colspan - 1, cols - 1)merged_cell = table.cell(row_idx, col_idx).merge(table.cell(end_row, end_col))word_cell = merged_cell# 设置文本内容para = word_cell.paragraphs[0]para.text = text# 设置对齐方式if align in align_map:para.alignment = align_map[align]# 设置背景颜色if bg_color:try:set_cell_background(word_cell, bg_color)except:pass # 忽略无效颜色格式# 标记已使用的单元格for r in range(row_idx, min(row_idx + rowspan, rows)):for c in range(col_idx, min(col_idx + colspan, cols)):used_cells[r][c] = True# 移动到下一个可用列col_idx += colspan# 添加空段落分隔doc.add_paragraph()return docdef copy_inline_shapes(old_paragraph):"""复制段落中的所有内嵌形状(通常是图片)"""images = []for shape in old_paragraph._element.xpath('.//w:drawing'):blip = shape.find('.//a:blip', namespaces={'a': 'http://schemas.openxmlformats.org/drawingml/2006/main'})if blip is not None:rId = blip.attrib['{http://schemas.openxmlformats.org/officeDocument/2006/relationships}embed']image_part = old_paragraph.part.related_parts[rId]image_bytes = image_part.image.blobimage_name=image_part.filename+";"+image_part.partnameimages.append([image_bytes,image_name, image_part.image.width, image_part.image.height])return imagesdef is_page_break(element):"""判断元素是否为分页符(段落或表格后)"""if element.tag.endswith('p'):for child in element:if child.tag.endswith('br') and child.get(qn('type')) == 'page':return Trueelif element.tag.endswith('tbl'):# 表格后可能有分页符(通过下一个元素判断)if element.getnext() is not None:next_element = element.getnext()if next_element.tag.endswith('p'):for child in next_element:if child.tag.endswith('br') and child.get(qn('type')) == 'page':return Truereturn Falsedef clone_paragraph(old_para):"""根据旧段落创建新段落"""style = {"run_style": []}if old_para.style:# 这里保存style 主要通过字体识别 是 几级标题style_name_to_style_obj = {"sn":old_para.style.name + "_" + str(old_para.alignment).split()[0], "ct": old_para.style}style["style"] = style_name_to_style_objparas = []for old_run in old_para.runs:text_to_style_name = {"ct":old_run.text, "sn":old_para.style.name + "_" + str(old_para.alignment).split()[0]}style["run_style"].append(old_run)paras.append(text_to_style_name)style_name_to_alignment = {"sn":old_para.style.name + "_" + str(old_para.alignment).split()[0],"ct":old_para.alignment}style["alignment"] = style_name_to_alignmentimages = copy_inline_shapes(old_para)if len(images):for image_bytes,image_name, image_width, image_height in images:style[image_name.split(";")[-1]] = imagesparas.append({"sn":image_name.split(";")[0],"ct":image_name.split(";")[-1]})return style, parasdef clone_document(old_doc_path):try:old_doc = Document(old_doc_path)new_doc = Document()# 复制主体内容elements = old_doc.element.bodypara_index = 0table_index = 0index = 0body_style = []body_paras = []while index < len(elements):element = elements[index]if element.tag.endswith('p'):old_para = old_doc.paragraphs[para_index]style, paras = clone_paragraph(old_para)body_style.append(style)body_paras += paraspara_index += 1index += 1elif element.tag.endswith('tbl'):old_table = old_doc.tables[table_index]body_paras += [{"sn":"table","ct":docx_table_to_html(old_table)}]table_index += 1index += 1elif element.tag.endswith('br') and element.get(qn('type')) == 'page':if index > 0:body_paras.append("br")new_doc.add_paragraph().add_run().add_break(WD_BREAK.PAGE)index += 1else:index += 1# 检查分页符if index < len(elements) and is_page_break(elements[index]):if index > 0:new_doc.add_paragraph().add_run().add_break(WD_BREAK.PAGE)body_paras.append("br")index += 1else:return body_style, body_parasexcept Exception as e:print(f"复制文档时发生错误:{e}")# 使用示例
if __name__ == "__main__":# 示例HTML表格body_s, body_p = clone_document('1.docx')print()
import jsonfrom docx import Document
from docx.oxml import OxmlElement
from docx.oxml.shared import qn
from wan_neng_copy_word import clone_document as get_para_style,html_table_to_docx
import io
# 剩余部分保持不变...def copy_inline_shapes(new_doc,image_name, img):"""复制段落中的所有内嵌形状(通常是图片)"""new_para = new_doc.add_paragraph()for image_bytes_src,_, w, h in img:try:with open(image_name, 'rb') as f:image_bytes = f.read()except:image_bytes = image_bytes_src# 添加图片到新段落new_para.add_run().add_picture(io.BytesIO(image_bytes), width=w, height=h) # 设置宽度为1.25英寸或其他合适的值def copy_paragraph_style(run_from, run_to):"""复制 run 的样式"""run_to.bold = run_from.boldrun_to.italic = run_from.italicrun_to.underline = run_from.underlinerun_to.font.size = run_from.font.sizerun_to.font.color.rgb = run_from.font.color.rgbrun_to.font.name = run_from.font.namerun_to.font.all_caps = run_from.font.all_capsrun_to.font.strike = run_from.font.strikerun_to.font.shadow = run_from.font.shadowdef is_page_break(element):"""判断元素是否为分页符(段落或表格后)"""if element.tag.endswith('p'):for child in element:if child.tag.endswith('br') and child.get(qn('type')) == 'page':return Trueelif element.tag.endswith('tbl'):# 表格后可能有分页符(通过下一个元素判断)if element.getnext() is not None:next_element = element.getnext()if next_element.tag.endswith('p'):for child in next_element:if child.tag.endswith('br') and child.get(qn('type')) == 'page':return Truereturn Falsedef clone_paragraph(para_style, text, new_doc, para_style_ws):"""根据旧段落创建新段落"""new_para = new_doc.add_paragraph()para_style_ws = para_style_ws["style"]["ct"]para_style_data = para_style["style"]["ct"]para_style_ws.font.size = para_style_data.font.sizenew_para.style = para_style_wsnew_run = new_para.add_run(text)copy_paragraph_style(para_style["run_style"][0], new_run)new_para.alignment = para_style["alignment"]["ct"]return new_paradef copy_cell_borders(old_cell, new_cell):"""复制单元格的边框样式"""old_tc = old_cell._tcnew_tc = new_cell._tcold_borders = old_tc.xpath('.//w:tcBorders')if old_borders:old_border = old_borders[0]new_border = OxmlElement('w:tcBorders')border_types = ['top', 'left', 'bottom', 'right', 'insideH', 'insideV']for border_type in border_types:old_element = old_border.find(f'.//w:{border_type}', namespaces={'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'})if old_element is not None:new_element = OxmlElement(f'w:{border_type}')for attr, value in old_element.attrib.items():new_element.set(attr, value)new_border.append(new_element)tc_pr = new_tc.get_or_add_tcPr()tc_pr.append(new_border)def clone_table(old_table, new_doc):"""根据旧表格创建新表格"""new_table = new_doc.add_table(rows=len(old_table.rows), cols=len(old_table.columns))if old_table.style:new_table.style = old_table.stylefor i, old_row in enumerate(old_table.rows):for j, old_cell in enumerate(old_row.cells):new_cell = new_table.cell(i, j)for paragraph in new_cell.paragraphs:new_cell._element.remove(paragraph._element)for old_paragraph in old_cell.paragraphs:new_paragraph = new_cell.add_paragraph()for old_run in old_paragraph.runs:new_run = new_paragraph.add_run(old_run.text)copy_paragraph_style(old_run, new_run)new_paragraph.alignment = old_paragraph.alignmentcopy_cell_borders(old_cell, new_cell)for i, col in enumerate(old_table.columns):if col.width is not None:new_table.columns[i].width = col.widthreturn new_tabledef clone_document(old_s, old_p, old_ws, new_doc_path):new_doc = Document()# 复制主体内容for para in old_p:k, v =para["sn"],para["ct"]if "image" in v:copy_inline_shapes(new_doc,k, [i for i in old_s if v in i ][0][v])elif "table" == k:html_table_to_docx(new_doc,v)else:style = [i for i in old_s if i["style"]["sn"]==k ]style_ws = [i for i in old_ws if i["style"]["sn"]==k ]clone_paragraph(style[0], v, new_doc, style_ws[0])new_doc.save(new_doc_path)# 使用示例
if __name__ == "__main__":body_ws, _ = get_para_style('demo_template.docx')body_s, body_p = get_para_style("1.docx")# 将body_p 或者是压缩后的内容 给llm 如果希望llm 只是参考模版样式,可以压缩如果需要内容或者修改不可压缩# 而后得到json 1.json 进行word生成with open("1.json", "r", encoding="utf-8") as f:body_p=json.loads(f.read())print("获取样式完成",body_p)clone_document(body_s, body_p, body_ws, 'cloned_example.docx')
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH# 创建一个新的Word文档
doc = Document()
for align in [WD_ALIGN_PARAGRAPH.LEFT, WD_ALIGN_PARAGRAPH.RIGHT, WD_ALIGN_PARAGRAPH.CENTER, None]:for blod_flag in [True, False]:# 获取所有可用的段落样式名(只保留段落样式)paragraph_styles = [style for style in doc.styles if style.type == 1 # type == 1 表示段落样式]# 输出样式数量print(f"共找到 {len(paragraph_styles)} 种段落样式:")for style in paragraph_styles:print(f"- {style.name}")# 在文档中添加每个样式对应的段落for style in paragraph_styles:heading = doc.add_paragraph()run = heading.add_run(f"样式名称: {style.name}")run.bold = blod_flagpara = doc.add_paragraph(f"这是一个应用了 '{style.name}' 样式的段落示例。", style=style)para.alignment = align# 添加分隔线(可选)doc.add_paragraph("-" * 40)# 保存为 demo_template.docx
doc.save("demo_template.docx")
print("\n✅ 已生成包含所有段落样式的模板文件:demo_template.docx")
相关文章:
使用 Python 自动化 Word 文档样式复制与内容生成
在办公自动化领域,如何高效地处理 Word 文档的样式和内容复制是一个常见需求。本文将通过一个完整的代码示例,展示如何利用 Python 的 python-docx 库实现 Word 文档样式的深度复制 和 动态内容生成,并结合知识库中的最佳实践优化文档处理流程…...
Kafka 核心架构与消息模型深度解析(二)
案例实战:Kafka 在实际场景中的应用 (一)案例背景与需求介绍 假设我们正在为一个大型电商平台构建数据处理系统。该电商平台拥有庞大的用户群体,每天会产生海量的订单数据、用户行为数据(如浏览、点击、收藏等&#…...
4G网络中频段的分配
国内三大运营商使用的4G网络频段及对应关系如下: 📶 一、中国移动(以TD-LTE为主) 主力频段 Band 38(2570-2620MHz):室内覆盖Band 39(1880-1920MHz):广覆盖&am…...
SQL进阶之旅 Day 19:统计信息与优化器提示
【SQL进阶之旅 Day 19】统计信息与优化器提示 文章简述 在数据库性能调优中,统计信息和优化器提示是两个至关重要的工具。统计信息帮助数据库优化器评估查询成本并选择最佳执行计划,而优化器提示则允许开发人员对优化器的行为进行微调。本文深入探讨了…...
数据结构之LinkedList
系列文章目录 数据结构之ArrayList-CSDN博客 目录 系列文章目录 前言 一、模拟实现链表 1. 遍历链表 2. 插入节点 3. 删除节点 4. 清空链表 二、链表的常见操作 1. 反转链表 2. 返回链表的中间节点 3. 链表倒数第 k 个节点 4. 合并两个有序链表 5. 分割链表 6. 判…...

摆脱硬件依赖:SkyEye在轨道交通中的仿真应用
在城市轨道交通系统中,信号系统承担着确保列车安全、高效运行的关键任务。从排列进路、信号开放,到终点折返与接发车,几乎每一个调度动作背后都依赖于信号系统的精密控制与实时响应。作为信号系统的重要组成部分,目标控制器&#…...

使用变异系数增强 CFD 收敛标准
将描述性统计整合到 CFD 中,以评估可变性和收敛性。 挑战 在工程设计中,尤其是在进行仿真时,我们经常处理描述流体、温度、应力或浓度行为的大型数据集。以有意义的方式解释这些值需要的不仅仅是原始数字;它需要对统计的理解。 统计学在工程…...
解决获取视频第一帧黑屏问题
文章目录 解决获取视频第一帧黑屏问题核心代码 解决获取视频第一帧黑屏问题 废话不多说,直接上代码: <script setup> const status ref(请点击“添加视频”按钮添加视频) const videoElement ref(document.createElement(video)) const curren…...

物联网通信技术全景指南(2025)之如何挑选合适的物联网模块
物联网通信技术全景指南(2025)之 如何挑选合适的物联网模块 物联网通信技术全景指南(2025)一、技术代际演进与退网背景二、5G 物联网技术体系(Sub-6 GHz 核心)1. 技术分层架构2. 蜂窝技术性能矩阵3. Sub-6 …...

影楼精修-AI衣服祛褶皱算法解析
注:为避免侵权,本文所用图像均为AIGC生成或无版权网站提供; 衣服祛褶皱功能,目前在像素蛋糕、美图云修、百度网盘AI修图、阿里云都有相关的功能支持,它的价值就是将不平整的衣服图像,变得整齐平整…...

Day46 Python打卡训练营
知识点回顾: 1. 不同CNN层的特征图:不同通道的特征图 2. 什么是注意力:注意力家族,类似于动物园,都是不同的模块,好不好试了才知道。 3. 通道注意力:模型的定义和插入的位置 4. 通道注意力后…...
信号电压高,传输稳定性变强,但是传输速率下降?
信号电压高,传输稳定性变强,但是传输速率下降? 一、信号电压升高,传输稳定性变强 1.信号幅度更大,抗噪声能力增强 2.噪声,比如干扰电磁波,串扰等相对于信号幅度比例变小,误码率降低 …...

linux安全加固(非常详细)
安全加固方案原则 1.版本升级 对于系统和应用在使用过程中暴露的安全缺陷,系统或应用厂商会及时发布解决问题的升级补丁包。升级系统或应用版本,可有效解决旧版本存在的安全风险。2.关闭端口服务 在不影响业务系统正常运行情况下,停止或禁用承…...
关于事务的简介
一、引言 在数据处理与存储的领域中,事务(Transaction)是确保数据完整性和一致性的关键概念。无论是金融系统的资金转账、电商平台的订单处理,还是企业资源规划(ERP)系统的业务流程操作,事务都…...
qt控制台程序与qt窗口程序在读取数据库中文字段的差异!!巨坑
问题:最近在自己编写一个类,这个类需要对mysql数据库进行插入和查询。因为最后是以一个类文件的形式拿来单独使用,所以在创建项目的时候就创建了一个qt的控制台程序。但是在对数据库的内容进行查询时,出现了中文乱码。参考了之前的…...
动手学深度学习12.7. 参数服务器-笔记练习(PyTorch)
以下内容为结合李沐老师的课程和教材补充的学习笔记,以及对课后练习的一些思考,自留回顾,也供同学之人交流参考。 本节课程地址:35 分布式训练【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址:12.7. 参数服务器…...

告别数据泥沼,拥抱智能中枢:King’s四位一体重塑科研生产力
在现代科研的战场上,数据堪称科研人员手中的“弹药”。然而,许多实验室却深陷数据管理的泥沼:硬盘里堆满了不同年份的实验记录,U盘里塞着各种格式的谱图,Excel表格里还留着手动计算的痕迹……,当科研人员想…...

智绅科技 —— 智慧养老 + 数字健康,构筑银发时代安全防护网
在老龄化率突破 21.3% 的当下,智绅科技以 "科技适老" 为核心理念,构建 "监测 - 预警 - 干预 - 照护" 的智慧养老闭环。 其自主研发的七彩喜智慧康养平台,通过物联网、AI 和边缘计算技术,实现对老年人健康与安…...

Code Composer Studio CCS 工程设置,如何设置h文件查找路径?
右键工程,选Properties,在Build>MSP430 Compiler>Optinizution Include Options 设置头文件的搜索路径。 比如我设置了这些: ${CCS_BASE_ROOT}/msp430/include ${PROJECT_ROOT} ${CG_TOOL_ROOT}/include "${workspace_loc:/${ProjName}/F5xx_F6xx_Core_Lib}&quo…...

Qt生成日志与以及捕获崩溃文件(mingw64位,winDbg)————附带详细解说
文章目录 Qt生成日志与以及报错文件(mingw64位,winDbg)0 背景与结果0.1 背景0.2 结果1 WinDbg1.1 安装1.2 使用 2 编写代码2.1 ccrashstack类2.2 编写输出捕获异常的dmp文件2.2 编写输出日志文件2.3 调用生成日志和dmp文件 参考 Qt生成日志与以及报错文件(mingw64位…...
web前端开发如何适配各分辨率
在开发Web应用时,适配不同的显示器分辨率是确保用户体验一致性的关键。以下是一些常见的显示器分辨率。 常见的显示器分辨率 PC屏幕分辨率 1366 x 768:普通液晶显示器 1920 x 1080:高清液晶显示器 2560 x 1440:2K高清显示器 4096…...
本机无法远程别的计算机的方法
在本地计算机上修改组策略 按下 Win R 组合键打开运行窗口,输入 gpedit.msc 并回车,打开组策略编辑器。依次展开路径:计算机配置 > 管理模板 > 系统 > 凭据分配。在右侧找到并双击 加密 Oracle 修正 策略。选择 已启用,…...

智能手表健康监测系统的PSRAM存储芯片CSS6404LS-LI—高带宽、耐高温、微尺寸的三重突破
一、直击智能手表三大核心痛点 痛点场景风险传统方案缺陷连续生物数据流存储100Hz PPG信号产生82MB/s数据洪峰SPI NOR Flash带宽不足(≤50MB/s)高温环境稳定性腕表表面温度达50℃(烈日/运动场景)商用级存储器件(85℃)易触发数据错误极限空间约束PCB面积…...

蓝桥杯国赛题2022
首先这个题应该是一个01背包,背包容量为2022,有2022个物品,第i个物品的体积为i,只不过这里有两个限制条件,一个限制条件是和为2022,另一个限制条件为10个数,两个限制条件那就把加一维࿰…...
Pycharm中添加不了新建的Conda环境(此篇专门给Daidai写的)
安装好了Conda之后,在系统终端也创建好Conda环境,一切显示正常,但在Pycharm中添加不了新建的Conda环境,显示“Conda executable is not found” 解决“Conda executable is not found” conda环境新建如下 D:/Programs/anacond…...
如何选择专业数据可视化开发工具?为您拆解捷码全功能和落地指南!
分享大纲: 1、捷码核心功能:4维能力支撑大屏开发 2、3步上手:可视化大屏开发操作路径 3、适配场景:8大行业已验证方案 在各行各业要求数字化转型时代,数据可视化大屏已成为众多企业数据驱动的核心工具。面对市场上繁杂…...

关于如何使用VScode编译下载keil工程的步骤演示
1、vscode的插件市场下载keil Assistant 2 、点设置 3、复制keil的地址 4、粘贴到第…...
微信小程序动态效果实战指南:从悬浮云朵到丝滑列表加载
小红书爆款交互设计解析,附完整代码! 🔥 一、为什么动态效果是小程序的关键竞争力? 用户留存提升:数据显示,86.3%的微商从业者依赖微信小程序,而动态效果能显著降低跳出率。技术赋能体验&#…...

Redis底层数据结构之深入理解跳表(2)
上一篇文章中我们详细讲述了跳表的增添、查找和修改的操作,这篇文章我们来讲解一下跳表在多线程并发时的安全问题。在Redis中,除了网络IO部分和大文件的后台复制涉及到多线程外,其余任务执行时全部都是单线程,这也就意味着在Redis…...
大模型编程助手-Cline
官网: https://cline.bot/ Cline 是一款深度集成在 Visual Studio Code(VSCode) 中的开源 AI 编程助手插件,旨在通过结合大语言模型(如 Claude 3.5 Sonnet、DeepSeek V3、Google Gemini 等)和工具链&#…...