背景
我们有一个现有的应用程序,可以将数据加载到 Microsoft Project 中,以便 MS Project 对其进行操作。
原来的应用是针对MS Project 2003/2007的VB6编写的老式COM Project插件,现在我们计划将它们迁移到针对MS Project 2013/2016的VSTO插件。
问题
对于他们的 COM 插件解决方案,我们遇到了性能问题:
Testing project has 4414 activities (av_activity table) and 8330 relationships (av_reln table).
Performance issues were reported during Load operation:
Load time on MSP 2003 template for above project is apprx: 30-35 mins.
Load time on MSP 2007 & 2010 template is > 3hrs
对于 VSTO 解决方案,它变得更好,但我们仍然希望可以通过某种方式提高加载性能。
到目前为止我们尝试了什么
我们尝试了几种技巧,但没有取得太大效果......
添加数据时禁用自动计算
_application.Calculation = PjCalculation.pjManual;
添加数据时禁用屏幕更新
_application.ScreenUpdating = false;
禁用更改突出显示
_application.EnableChangeHighlighting = false;
禁用状态栏
_application.DisplayStatusBar = false;
将撤消值设置为 1
- 将默认 View 设置为“任务 TableView ”(而不是“甘特图 View ”,后者在加载期间会产生更多开销)。
寻求帮助
我正在寻求有关在使用 VSTO 插件和 C# 将数据加载到 MS Project 时提高性能的任何解决方案的帮助。
提前致谢!
最佳答案
是的,使用 TaskDependencies.Add创建关系的方法极其缓慢。
这很不幸,因为这是合乎逻辑的使用方法。 唯一的解决方法是提前构建 Predecessor 列表。获得该列表后,您可以通过两种方式创建关系:
- 添加到现有时间表
- 通过导入包含前任列表的任务数据来创建新计划
由于您的数据已经是表格形式,因此使用项目导入向导从 csv 或 Excel 文件导入数据效果非常好。 要使用项目导入向导,请选择要从 MS Project 中打开的 csv 或 Excel 文件(文件 -> 打开)。该向导将引导您完成创建导入映射的步骤,您可以将其保存以供以后自动化使用。 在您的导入数据中包含 Predecessors 列,向导将在几秒钟内为您创建关系。
任务Predecessors field包含以逗号分隔的前任列表。每个前导的格式如下:
- 任务编号
- 关系类型(FS、FF、SS、SF)
- 延迟(+/- #d)
具有 FS 类型且没有滞后的前置任务仅显示任务 ID。以下是前置字段值的一些示例:
- 14,126,127
- 73,92SS
- 144FS+3d,145
如何从关系表创建前置字段值
假设一个关系表,其中包含前任和继任者的任务 ID:
- 创建一个包含整数键(后续任务 ID)和字符串值(前置任务)的字典。
- 遍历关系表,将继任者的任务ID及其前任添加到字典中;如果它已经存在,更新值以附加一个逗号和前导。
- 遍历字典并 A) 更新 csv 文件中的前任列或 B) 在计划中的后续任务上设置前任字段。
关于c# - 使用 VSTO 将数据加载到 Microsoft Project 时如何提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43829652/