使用 Python 自动化 Word 文档样式复制与内容生成

news2025/6/7 16:40:24

在办公自动化领域,如何高效地处理 Word 文档的样式和内容复制是一个常见需求。本文将通过一个完整的代码示例,展示如何利用 Python 的 python-docx 库实现 Word 文档样式的深度复制动态内容生成,并结合知识库中的最佳实践优化文档处理流程。


一、为什么需要自动化 Word 文档处理?

手动处理 Word 文档(如复制样式、插入表格/图片)不仅耗时且容易出错。Python 提供了多种库(如 python-docxpywin32Spire.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.alignment
            copy_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.width

    return 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')

四、实际应用场景

  1. 报告自动生成
    结合模板样式,动态填充数据库数据生成标准化报告。

  2. 批量文档处理
    将多个 Excel 表格批量转换为 Word 文档(参考知识库中的 pywin32python-docx 联合使用)。

  3. 博客内容迁移
    将 Word 文档保存为 HTML 后,按知识库中的步骤导入 ZBlog 或 WordPress(见知识库 [2] 和 [5])。


五、常见问题与优化建议

1. 样式丢失问题

  • 原因:Word 文档的样式可能依赖隐式继承。
  • 解决方案:使用 python-docxstyle 属性显式设置样式,或参考知识库 [7] 使用 Spire.Doc 进行更复杂的样式处理。

2. 图片与表格嵌入异常

  • 原因:路径错误或资源未正确加载。
  • 解决方案:确保图片路径绝对化,或使用 docx.shared.Inches 显式指定尺寸。

3. 性能优化

  • 大文档处理:避免频繁调用 add_paragraph,改用批量操作。
  • 内存管理:及时释放 Document 对象(如 doc = None)。

六、总结

通过本文的代码示例和解析,您已掌握如何使用 Python 实现 Word 文档的 样式深度复制动态内容生成。结合知识库中的其他技术(如 ZBlog 导入、Office 自动化),可进一步扩展至完整的文档工作流自动化。

希望这篇博客能帮助您高效实现文档自动化!如需进一步优化或功能扩展,欢迎留言讨论。



from docx.enum.text import WD_BREAK

from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml import OxmlElement
from bs4 import BeautifulSoup

from docx.oxml.ns import qn


def 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 = 0
        while col_idx < len(row.cells):
            cell = row.cells[col_idx]

            # 如果该单元格已经被合并(被前面的 colspan 或 rowspan 占用),跳过
            if merged_cells[row_idx][col_idx]:
                col_idx += 1
                continue

            # 跳过纵向合并中被“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 += 1
                continue

            td = 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 = 2sz
                            style = 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 = 1
                    next_row_idx = row_idx + 1
                    while 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 += 1
                            next_row_idx += 1
                        else:
                            break
                    if 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 += 1

        html_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 = 0
        for tr in trs:
            col_count = 0
            for 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 = 0

            for cell in cells:
                while col_idx < cols and used_cells[row_idx][col_idx]:
                    col_idx += 1

                if col_idx >= cols:
                    break  # 避免越界

                # 获取 colspan 和 rowspan
                colspan = 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 = None
                for 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 doc


def 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.blob
            image_name=image_part.filename+";"+image_part.partname
            images.append([image_bytes,image_name, image_part.image.width, image_part.image.height])
    return images


def 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 True
    elif 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 True
    return False


def 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_obj
    paras = []
    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_alignment

    images = copy_inline_shapes(old_para)
    if len(images):
        for  image_bytes,image_name, image_width, image_height in images:
            style[image_name.split(";")[-1]] = images
            paras.append({"sn":image_name.split(";")[0],"ct":image_name.split(";")[-1]})
    return style, paras


def clone_document(old_doc_path):
    try:
        old_doc = Document(old_doc_path)
        new_doc = Document()
        # 复制主体内容
        elements = old_doc.element.body
        para_index = 0
        table_index = 0
        index = 0

        body_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 += paras
                para_index += 1
                index += 1
            elif element.tag.endswith('tbl'):
                old_table = old_doc.tables[table_index]
                body_paras += [{"sn":"table","ct":docx_table_to_html(old_table)}]
                table_index += 1
                index += 1
            elif 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 += 1
            else:
                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 += 1

        else:
            return body_style, body_paras
    except Exception as e:
        print(f"复制文档时发生错误:{e}")


# 使用示例
if __name__ == "__main__":
    # 示例HTML表格
    body_s, body_p = clone_document('1.docx')
    print()

import json

from 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.bold
    run_to.italic = run_from.italic
    run_to.underline = run_from.underline
    run_to.font.size = run_from.font.size
    run_to.font.color.rgb = run_from.font.color.rgb
    run_to.font.name = run_from.font.name
    run_to.font.all_caps = run_from.font.all_caps
    run_to.font.strike = run_from.font.strike
    run_to.font.shadow = run_from.font.shadow


def 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 True
    elif 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 True
    return False


def 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.size

    new_para.style = para_style_ws

    new_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_para


def copy_cell_borders(old_cell, new_cell):
    """复制单元格的边框样式"""
    old_tc = old_cell._tc
    new_tc = new_cell._tc

    old_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.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.alignment
            copy_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.width

    return new_table


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"]

        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_flag
            para = 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")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2403120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

摆脱硬件依赖:SkyEye在轨道交通中的仿真应用

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

使用变异系数增强 CFD 收敛标准

将描述性统计整合到 CFD 中&#xff0c;以评估可变性和收敛性。 挑战 在工程设计中&#xff0c;尤其是在进行仿真时&#xff0c;我们经常处理描述流体、温度、应力或浓度行为的大型数据集。以有意义的方式解释这些值需要的不仅仅是原始数字;它需要对统计的理解。 统计学在工程…

物联网通信技术全景指南(2025)之如何挑选合适的物联网模块

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

影楼精修-AI衣服祛褶皱算法解析

注&#xff1a;为避免侵权&#xff0c;本文所用图像均为AIGC生成或无版权网站提供&#xff1b; 衣服祛褶皱功能&#xff0c;目前在像素蛋糕、美图云修、百度网盘AI修图、阿里云都有相关的功能支持&#xff0c;它的价值就是将不平整的衣服图像&#xff0c;变得整齐平整&#xf…

Day46 Python打卡训练营

知识点回顾&#xff1a; 1. 不同CNN层的特征图&#xff1a;不同通道的特征图 2. 什么是注意力&#xff1a;注意力家族&#xff0c;类似于动物园&#xff0c;都是不同的模块&#xff0c;好不好试了才知道。 3. 通道注意力&#xff1a;模型的定义和插入的位置 4. 通道注意力后…

linux安全加固(非常详细)

安全加固方案原则 1.版本升级 对于系统和应用在使用过程中暴露的安全缺陷&#xff0c;系统或应用厂商会及时发布解决问题的升级补丁包。升级系统或应用版本&#xff0c;可有效解决旧版本存在的安全风险。2.关闭端口服务 在不影响业务系统正常运行情况下&#xff0c;停止或禁用承…

动手学深度学习12.7. 参数服务器-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;35 分布式训练【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址&#xff1a;12.7. 参数服务器…

告别数据泥沼,拥抱智能中枢:King’s四位一体重塑科研生产力

在现代科研的战场上&#xff0c;数据堪称科研人员手中的“弹药”。然而&#xff0c;许多实验室却深陷数据管理的泥沼&#xff1a;硬盘里堆满了不同年份的实验记录&#xff0c;U盘里塞着各种格式的谱图&#xff0c;Excel表格里还留着手动计算的痕迹……&#xff0c;当科研人员想…

智绅科技 —— 智慧养老 + 数字健康,构筑银发时代安全防护网

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

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位&#xff0c;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位…

智能手表健康监测系统的PSRAM存储芯片CSS6404LS-LI—高带宽、耐高温、微尺寸的三重突破

一、直击智能手表三大核心痛点 痛点场景风险传统方案缺陷连续生物数据流存储100Hz PPG信号产生82MB/s数据洪峰SPI NOR Flash带宽不足(≤50MB/s)高温环境稳定性腕表表面温度达50℃&#xff08;烈日/运动场景&#xff09;商用级存储器件(85℃)易触发数据错误极限空间约束PCB面积…

蓝桥杯国赛题2022

首先这个题应该是一个01背包&#xff0c;背包容量为2022&#xff0c;有2022个物品&#xff0c;第i个物品的体积为i&#xff0c;只不过这里有两个限制条件&#xff0c;一个限制条件是和为2022&#xff0c;另一个限制条件为10个数&#xff0c;两个限制条件那就把加一维&#xff0…

关于如何使用VScode编译下载keil工程的步骤演示

1、vscode的插件市场下载keil Assistant 2 、点设置 3、复制keil的地址 4、粘贴到第…

Redis底层数据结构之深入理解跳表(2)

上一篇文章中我们详细讲述了跳表的增添、查找和修改的操作&#xff0c;这篇文章我们来讲解一下跳表在多线程并发时的安全问题。在Redis中&#xff0c;除了网络IO部分和大文件的后台复制涉及到多线程外&#xff0c;其余任务执行时全部都是单线程&#xff0c;这也就意味着在Redis…

[蓝桥杯]兰顿蚂蚁

兰顿蚂蚁 题目描述 兰顿蚂蚁&#xff0c;是于 1986 年&#xff0c;由克里斯兰顿提出来的&#xff0c;属于细胞自动机的一种。 平面上的正方形格子被填上黑色或白色。在其中一格正方形内有一只"蚂蚁"。 蚂蚁的头部朝向为&#xff1a;上下左右其中一方。 蚂蚁的移…

使用 Python 构建并调用 ComfyUI 图像生成 API:完整实战指南

快速打造你自己的本地 AI 图像生成服务&#xff0c;支持 Web 前端一键调用&#xff01; &#x1f4cc; 前言 在 AIGC 快速发展的今天&#xff0c;ComfyUI 作为一款模块化、节点式的图像生成界面&#xff0c;备受开发者青睐。但默认情况下&#xff0c;ComfyUI 主要通过界面交互…

嵌入式学习笔记-freeRTOS taskENTER_CRITICAL(_FROM_ISR)跟taskEXIT_CRITICAL(_FROM_ISR)函数解析

一 函数taskENTER_CRITICAL&#xff0c;taskEXIT_CRITICAL 函数taskENTER_CRITICAL最终实现如下&#xff1a; 第①处按照系统设定的configMAX_SYSCALL_INTERRUPT_PRIORITY值对中断进行屏蔽 第②处调用一次自增一次 第③处检查中断状态寄存器位&#xff0c;如果有任何中断位置…

1panel面板中部署SpringBoot和Vue前后端分离系统 【图文教程】

1panel面板中部署SpringBoot和Vue前后端分离系统 一&#xff0c;1panel面板部署二&#xff0c;安装OpenResty三&#xff0c;安装MySQL&#xff0c;Redis等Spring boot 运行依赖环境四&#xff0c;SpringBoot 应用配置及打包部署配置打包部署 五 &#xff0c;前端VUE应用配置打包…

【Android基础回顾】二:handler消息机制

Android 的 Handler 机制 是 Android 应用中实现线程间通信、任务调度、消息分发的核心机制之一&#xff0c;它基于 消息队列&#xff08;MessageQueue&#xff09; 消息循环&#xff08;Looper&#xff09; 消息处理器&#xff08;Handler&#xff09; 组成。 1 handler的使用…