VC操作MPP文件
1.背景简介
因需要对Office系列进行程序操作,特需要使用COM编程。
Microsoft Project生成进度计划,office家族软件,文件后缀为.mpp。
具体信息见维基百科http://zh.wikipedia.org/wiki/Microsoft_Project。
读取MPP文件,网络上示例基本为C#,因为我所使用的是VC,C#代码只能做参考了。
因为COM组件是通用的,跨语言的(微软系),既然C#能做,那么VC也能做。
开发环境:
Project版本:Microsoft Project 2010。
VS版本:VS2005。
源码下载。
2.VC示例程序
1、 创建MFC工程,工程名为MyMPP。
创建一个对话框工程。
2、 增加COM接口包装类。
COM接口的调用,可以通过MFC添加进来。
右键Add->Class
选择MFC Class From TypeLib
选择MS Project COM组件,并生成包装类。
Microsoft Project 14.0 Object Library:本机安装的project 2010所提供的com组件。
Generated classes:为所需要用到的包装类,包装Interfaces中的接口。
最后,会生成五个头文件。
CIProjectDoc.h、CMSProject.h、CProjects.h、CTask.h、CTasks.h。
3、 COM头文件调整。
将(CIProjectDoc.h、CMSProject.h、CProjects.h、CTask.h、CTasks.h)
头文件中代码替换。
#import "C:\\Program Files\\MicrosoftOffice\\Office14\\MSPRJ.OLB" no_namespace替换为#pragma once
CIProjectDoc.h、CMSProject.h中使用了很多没有生成的类,会导致编译不通过。
解决方法:将出现T*的地方替换为LPDISPATCH。
例:
Application* GetApplication()
{
Application* result;
GetProperty(0xfff4, VT_DISPATCH, (void*)&result);
return result;
}
调整为:
LPDISPATCH GetApplication()
{
LPDISPATCH result;
GetProperty(0xfff4, VT_DISPATCH, (void*)&result);
return result;
}
4、 MPP读取代码。
添加一个按钮,按钮响应代码如下。
#include "comdef.h"
#include "CMSProject.h"
#include "CProjects.h"
#include "CIProjectDoc.h"
#include "CTasks.h"
#include "CTask.h" void CMyMPPDlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
CString strFilter = _T("");
strFilter += _T("MS Project文件(*.mpp)|*.mpp||");
CFileDialog fileDlg(TRUE, _T("*.mpp"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, strFilter);
if (fileDlg.DoModal() != IDOK )
{
return;
} CString strFilePath = fileDlg.GetPathName(); ::CoInitialize(NULL);
ReadMppInfo(strFilePath);
::CoUninitialize();
} void CMyMPPDlg::ReadMppInfo(const CString& strFilePath)
{
CString strTipInfo = _T("");
try
{
CMSProject app;
if (!app.CreateDispatch(_T("MSProject.Application")))
{
MessageBox(_T("Office Project未安装"));
return;
} app.SetVisible(FALSE);
BOOL openRes = app.FileOpen(_variant_t(strFilePath),
_variant_t(true), vtMissing, vtMissing,
vtMissing, vtMissing, vtMissing,
vtMissing, vtMissing, vtMissing, vtMissing,
1, vtMissing, vtMissing,
vtMissing, vtMissing);
if (!openRes)
{
MessageBox(_T("Office Project打开失败!"));
return;
} CProjects projs;
projs = app.GetProjects();
int nProjCount = projs.get_Count();
for (int i = 1; i <= nProjCount; i++)
{
CIProjectDoc projDoc;
projDoc = projs.get_Item(_variant_t(i)); CTasks tasks;
tasks = projDoc.get_Tasks();
long nTaskCount = tasks.get_Count();
for (int j = 1; j <= nTaskCount; j++)
{
CTask task;
task = tasks.get_Item(_variant_t(j)); CString strLevel = IntToCString(task.get_OutlineLevel());
CString strName = task.get_Name();
CString strStart = OleDateToStr(task.get_Start().date);
CString strFinish = OleDateToStr(task.get_Finish().date);
int nDays = GetTimeSpan(task.get_Start().date, task.get_Finish().date);
CString strDays = IntToCString(nDays); strTipInfo += strLevel;
strTipInfo += _T("|");
strTipInfo += strName;
strTipInfo += _T("|");
strTipInfo += strDays;
strTipInfo += _T("|");
strTipInfo += strStart;
strTipInfo += _T("|");
strTipInfo += strFinish;
strTipInfo += _T("\r\n");
}
} app.FileClose(0, _variant_t(false));
}
catch(_com_error &e)
{
MessageBox((LPWSTR)e.Description());
} if (!strTipInfo.IsEmpty())
{
MessageBox(strTipInfo);
}
} int CMyMPPDlg::GetTimeSpan(const COleDateTime& dtStart, const COleDateTime& dtFinish)
{
COleDateTimeSpan timeSpan = dtFinish - dtStart;
int nDays = timeSpan.GetDays();
if (nDays < 0)
{
nDays -= 1;
}
else
{
nDays += 1;
} return nDays;
} CString CMyMPPDlg::OleDateToStr(COleDateTime oleDate)
{
return oleDate.Format(_T("%Y-%m-%d"));
} CString CMyMPPDlg::IntToCString(int nInput)
{
CString strInput = _T("");
strInput.Format(_T("%d"), nInput);
return strInput;
}
5、 运行结果。
VC操作MPP文件的更多相关文章
- c#操作.mpp文件
原文地址:http://mjm13.iteye.com/blog/532404 所需设置 在工程中增加引用Microsoft Project 11.0 Object Library,该引用在co ...
- 基于VC的声音文件操作(二)
(二)VC的声音操作 操作声音文件,也就是将WAVE文件打开获取其中的声音数据,根据所需要的声音数据处理算法,进行相应的数学运算,然后将结果重新存储与WAVE格式的文件中去:可以使用CFILE类来实现 ...
- vc++实现avi文件的操作
为了对avi进行读写,微软提供了一套API,总共50个函数,他们的用途主要有两类,一个是avi文件的操作,一类是数据流streams的操作. 1.打开和关闭文件 AVIFileOpen ,AVIFil ...
- VS c# 操作 Microsoft Project mpp 文件 并遍历边关系
网上找到资料提供了遍历.mpp文件中任务的功能: http://blog.csdn.net/gxf36/article/details/5253792 ======================== ...
- VC操作excel
http://www.cnblogs.com/witxjp/archive/2010/06/05/1752181.html 最近在做个数据库程序,因为有些数据用户要求导出到Excel文件显示(需要 ...
- VC+++ 操作word
最近完成了一个使用VC++ 操作word生成扫描报告的功能,在这里将过程记录下来,开发环境为visual studio 2008 导入接口 首先在创建的MFC项目中引入word相关组件 右键点击 项目 ...
- [转]VC++中对文件的写入和读取
本文转自:http://blog.csdn.net/fanghb_1984/article/details/7425705 本文介绍两种方法对文件进行读取和写入操作:1.采用fstream类:2.采用 ...
- VC操作Excel之基本操作(颜色等)【转载】
文章出处https://blog.csdn.net/form88/article/details/78566390 EXCEL里如何知道某种颜色的ColorIndex的值 ===fag::====== ...
- Asp.Net 操作XML文件的增删改查 利用GridView
不废话,直接上如何利用Asp.NET操作XML文件,并对其属性进行修改,刚开始的时候,是打算使用JS来控制生成XML文件的,但是最后却是无法创建文件,读取文件则没有使用了 index.aspx 文件 ...
随机推荐
- Android 性能监控系列一(原理篇)
欢迎关注微信公众号:BaronTalk,获取更多精彩好文! 一. 前言 性能问题是导致 App 用户流失的罪魁祸首之一,如果用户在使用我们 App 的时候遇到诸如页面卡顿.响应速度慢.发热严重.流量电 ...
- empireCMS 帝国cms功能总结
上1 系统 对应左菜单为 系统设置 系统参数设置 基本属性 站点名称,网站地址,关键字,简介,首页模式,php时间, 前台功能,操作时间,来源地址,验证码 用户属性 后台验证码开启,次数限制,时间限制 ...
- 关于ClickOnce的一些技术文章
程序自动升级是我们经常遇到的需求,对于.Net程序来说,一个简单易用的方案是它内置的ClickOnce技术.ClickOnce出现的比较早,网上相应的教程还是比较丰富的,我这里就简单的整理一下相关的文 ...
- 1588: [HNOI2002]营业额统计 (splay tree)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 5783 Solved: 1859[Submit][Stat ...
- Android MMC/EMMC/MTD Partition Layout
Android devices have a couple of partitions to store different data. The common ones are the recover ...
- 配置NGINX支持中文URL 中文文件名称或文件夹404无法訪问的解决方法
NGINX不须要象apache那样要单独载入支持中文模块. # cat /etc/sysconfig/i18n LANG="en_US.UTF-8" SYSFONT=" ...
- FT项目开发技术点(四)
1.jsp页面form传递过来的值是在后台ishi通过name获得的而非ID.上传文字要用input type=text属性 <tr> <th>品牌:</th> & ...
- C#编程(一)
第一个简单的C#程序 using System; using System.Collections.Generic; using System.Linq; using System.Text; usi ...
- Appium+python自动化5-Appium Inspector
前言 appium Inspector从入门到放弃!反正你都打开了,那就看下为什么要放弃吧! Appium Inspector是appium自带的一个元素定位工具,上一篇介绍了如何使用uiaut ...
- go语言 defer 高级
go语言defer语句的用法 defer的语法 defer后面必须是函数调用语句,不能是其他语句,否则编译器会出错. package main import "log" func ...