You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python脚本实现Excel自动更新/创建Jira工单技术求助

基于Excel的Jira工单自动创建与更新实现方案

准备工作

先安装所需依赖库:

pip install jira pandas python-dotenv
  • jira:用于和Jira API交互
  • pandas:高效读取、处理Excel数据
  • python-dotenv:安全存储Jira账号信息,避免硬编码敏感内容

配置Jira连接

创建.env文件存储敏感信息:

JIRA_SERVER=https://your-jira-domain.com
JIRA_USERNAME=your-email@example.com
JIRA_API_TOKEN=your-api-token

注:API令牌可在Jira个人设置中生成,不要直接用密码连接

编写连接Jira的代码:

from jira import JIRA
from dotenv import load_dotenv
import os

load_dotenv()

def get_jira_client():
    try:
        jira = JIRA(
            server=os.getenv("JIRA_SERVER"),
            basic_auth=(os.getenv("JIRA_USERNAME"), os.getenv("JIRA_API_TOKEN"))
        )
        return jira
    except Exception as e:
        print(f"Jira连接失败: {str(e)}")
        raise

读取Excel数据

假设Excel文件结构如下(可根据实际需求调整列名):

工单编号项目Key摘要描述优先级状态
PROJ1新增需求详情描述...高
PROJ1-123PROJ1更新需求修改内容...中进行中

读取Excel的代码:

import pandas as pd

def read_excel_data(file_path):
    try:
        df = pd.read_excel(file_path)
        # 处理空值,将空字符串转为None
        df = df.where(pd.notnull(df), None)
        return df.to_dict("records")
    except Exception as e:
        print(f"读取Excel失败: {str(e)}")
        raise

工单创建逻辑

编写创建工单的函数,将Excel行数据映射到Jira字段:

def create_jira_issue(jira_client, issue_data):
    try:
        # 构建Jira工单字段,字段名需与Jira系统一致
        fields = {
            "project": {"key": issue_data["项目Key"]},
            "summary": issue_data["摘要"],
            "description": issue_data["描述"],
            "priority": {"name": issue_data["优先级"]},
            # 可按需添加更多字段,如经办人、组件等
            # "assignee": {"name": issue_data["经办人"]},
            # "components": [{"name": issue_data["组件"]}]
        }
        issue = jira_client.create_issue(fields=fields)
        print(f"成功创建工单: {issue.key}")
        return issue.key
    except Exception as e:
        print(f"创建工单失败,数据: {issue_data}, 错误: {str(e)}")
        return None

工单更新逻辑

编写更新工单的函数,根据工单编号定位并更新指定字段:

def update_jira_issue(jira_client, issue_data):
    issue_key = issue_data["工单编号"]
    try:
        issue = jira_client.issue(issue_key)
        # 构建需要更新的字段,仅处理有内容的字段
        update_fields = {}
        if issue_data["摘要"]:
            update_fields["summary"] = issue_data["摘要"]
        if issue_data["描述"]:
            update_fields["description"] = issue_data["描述"]
        if issue_data["优先级"]:
            update_fields["priority"] = {"name": issue_data["优先级"]}
        if issue_data["状态"]:
            # 状态变更需通过工作流transition操作,不能直接修改字段
            transitions = jira_client.transitions(issue)
            transition_id = next(t["id"] for t in transitions if t["name"] == issue_data["状态"])
            jira_client.transition_issue(issue, transition_id)
        
        if update_fields:
            issue.update(fields=update_fields)
        
        print(f"成功更新工单: {issue_key}")
        return True
    except Exception as e:
        print(f"更新工单失败,编号: {issue_key}, 错误: {str(e)}")
        return False

主流程整合

将上述模块整合,批量处理Excel中的每一行数据:

def main(excel_file_path):
    jira_client = get_jira_client()
    issues_data = read_excel_data(excel_file_path)
    
    for data in issues_data:
        if not data["工单编号"]:
            # 无工单编号则创建新工单
            create_jira_issue(jira_client, data)
        else:
            # 有工单编号则更新已有工单
            update_jira_issue(jira_client, data)

if __name__ == "__main__":
    main("jira_issues.xlsx")

关键注意事项

  • 字段映射一致性:Jira字段名(如优先级、状态)必须与系统显示名称完全匹配,可通过Jira API或系统设置确认
  • 权限验证:确保使用的账号拥有创建、更新工单的权限,测试阶段建议用测试项目
  • 异常处理:可替换print为logging模块,方便后续排查问题
  • 数据校验:处理Excel前添加校验逻辑(如必填字段非空、项目Key存在),避免无效请求
  • 状态变更:Jira状态变更需通过工作流transition,不能直接修改status字段,需先获取可用的transition ID

内容的提问来源于stack exchange,提问作者Jacint

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 16:30:57