如何通过Python更新Confluence表格并在指定列附加文件?
解决Confluence表格自动更新及附件添加问题
一、修复表格更新失败的问题
你遇到的Object of type DataFrame is not JSON serializable错误,是因为conf.update_page需要的是Confluence支持的XHTML格式内容,而非直接传入DataFrame。正确的做法是把修改后的DataFrame转成符合Confluence样式的HTML,再替换页面中原有的表格内容(而非覆盖整个页面),步骤如下:
1. 依赖准备
先安装HTML解析库:
pip install beautifulsoup4
2. 完整更新表格代码
from atlassian import Confluence import pandas as pd from bs4 import BeautifulSoup # 配置信息 conf_site = 'https://confluence.company.com/' conf_user = "login" conf_pass = "password" page_id = 0000000000 # 初始化Confluence客户端 conf = Confluence(url=conf_site, username=conf_user, password=conf_pass) # 获取页面原始存储内容(必须用body.storage,而非view,这是可编辑的原始格式) page = conf.get_page_by_id(page_id, expand='body.storage') page_storage = page['body']['storage']['value'] page_title = page['title'] # 解析页面HTML,定位目标表格 soup = BeautifulSoup(page_storage, 'html.parser') target_table = soup.find('table', class_='confluenceTable') # Confluence表格默认带这个类 # 读取原有表格为DataFrame,执行你的新增行操作 table = pd.read_html(str(target_table))[0] # 示例:新增一行数据(替换成你的实际逻辑) table.loc[len(table)] = ["新增内容1", "新增内容2", "", ""] # 最后一列留空,后续插入附件链接 # 将修改后的DataFrame转为Confluence格式的HTML表格 new_table_html = table.to_html( classes='confluenceTable', # 保留Confluence表格样式 index=False, # 不显示DataFrame索引 border=0 # 去掉默认边框,匹配Confluence样式 ) # 替换页面中的旧表格 target_table.replace_with(BeautifulSoup(new_table_html, 'html.parser')) new_page_content = str(soup) # 更新Confluence页面 conf.update_page(page_id=page_id, title=page_title, body=new_page_content)
二、实现表格最后一列添加附件
附件需要先上传到Confluence页面,再把附件的下载链接插入到表格对应单元格中,流程如下:
1. 上传附件并获取链接
# 上传目标文件 file_path = '/path/to/your/target/file.pdf' file_display_name = '月度报告.pdf' # 在Confluence显示的文件名 # 上传附件到指定页面,overwrite=True表示覆盖同名文件 attachment_info = conf.attach_file( file_path, name=file_display_name, page_id=page_id, overwrite=True ) # 构造附件的直接下载链接 attachment_url = f"{conf_site}download/attachments/{page_id}/{file_display_name}?api=v2"
2. 将链接插入表格并更新页面
在你新增行之后,把链接插入到最后一行的最后一列:
# 假设表格最后一列的列名为"附件",或者直接用索引定位 table.iloc[-1, -1] = f"<a href='{attachment_url}'>{file_display_name}</a>" # 后续重复表格替换和页面更新的步骤(即前面代码中生成new_table_html到update_page的部分)
注意事项
- 必须使用
body.storage获取页面内容:body.view是渲染后的展示用HTML,无法用于编辑更新 - 表格定位要准确:如果页面有多个表格,需要调整
find方法的参数(比如通过id或其他属性)来定位目标表格 - 链接格式用HTML的
<a>标签:Confluence存储内容支持标准HTML标签,这样插入的链接可以直接在页面中点击
内容的提问来源于stack exchange,提问作者Anastasia
相关产品推荐
相关产品推荐

