如何用C#代码更新Microsoft Project 2019的资源费率?
基于Microsoft Project 2019的资源费率更新C#实现
前提准备
- 确保运行代码的机器已安装Microsoft Project 2019
- 在C#项目中添加引用:
Microsoft.Office.Interop.MSProject(版本16.0对应Project 2019)
C#代码示例
以下示例实现从ERP获取资源费率数据,批量更新Project文件中的员工资源费率:
using Microsoft.Office.Interop.MSProject; using System; using System.Collections.Generic; namespace ProjectRateUpdater { class Program { static void Main(string[] args) { // 初始化Project应用实例 Application projectApp = new Application(); projectApp.Visible = false; // 后台运行,不显示界面 try { // 打开目标Project文件(替换为你的文件路径) Project targetProject = projectApp.Projects.Open(@"C:\Path\To\Your\ProjectFile.mpp"); // 从ERP获取资源费率数据(此处为模拟逻辑,替换为实际ERP数据获取代码) var erpResourceRates = GetResourceRatesFromERP(); // 遍历资源,匹配并更新费率 foreach (Resource res in targetProject.Resources) { // 跳过空资源 if (res.Name == null) continue; // 匹配ERP中的资源(此处按资源名称匹配,可根据实际调整为工号等唯一标识) if (erpResourceRates.TryGetValue(res.Name, out decimal newRate)) { // 设置标准费率(默认生效日期为当前时间,如需指定时间段可调整RateTables) res.StandardRate = newRate.ToString("0.00") + "/h"; // Project需要带单位格式,如"50.00/h" Console.WriteLine($"已更新资源 {res.Name} 的费率为 {newRate}/小时"); } } // 保存并关闭项目 targetProject.Save(); targetProject.Close(); Console.WriteLine("费率更新完成"); } catch (Exception ex) { Console.WriteLine($"更新失败:{ex.Message}"); } finally { // 释放COM对象,避免内存泄漏 if (projectApp != null) { projectApp.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(projectApp); } } } /// <summary> /// 模拟从ERP获取资源费率数据的方法 /// </summary> /// <returns>资源名称-费率的字典</returns> private static Dictionary<string, decimal> GetResourceRatesFromERP() { // 实际场景中,此处应调用ERP的API、数据库查询等逻辑获取数据 return new Dictionary<string, decimal> { { "张三", 85.50m }, { "李四", 92.00m }, { "王五", 78.00m } }; } } }
关键注意事项
- 资源匹配逻辑:示例中按资源名称匹配,实际建议使用唯一标识(如员工工号)进行匹配,避免名称重复导致错误
- 费率格式:Project的费率字段需要带单位后缀,如
"85.50/h"(小时费率)、"1500/week"(周费率)等 - 费率时间段:如需设置不同生效时间段的费率,可通过
Resource.RateTables属性操作,例如添加新的费率周期 - COM对象释放:必须确保Project应用实例被正确释放,否则会导致进程残留占用内存
- 权限问题:运行代码的账号需要有目标Project文件的读写权限,以及ERP数据的访问权限
内容的提问来源于stack exchange,提问作者Igor Kozlitin
相关产品推荐
相关产品推荐

