C++操作Word学习笔记(四)
【当前博文转自http://blog.sina.com.cn/s/blog_4aaac71b01000brk.html】
【本文有打印相关操作】
1、初始化COM库
2、利用COM接口提供的函数,打开默认的模版文档。对Word进行读写等操作,下面代码包括写入文本,在表格中写入文本,实现控制页数,查找特定字符、打印等操作。
3、小博开始常更新了,学了什么我就博上什么,欢迎大家光临。
void CWordDlg::OnBnClickedButtonCreate()
{
// TODO: Add your control notification handler code here
//初始化COM库
AfxOleInit();
//定义变量
COleVariant varstrNull("");
COleVariant varTrue(short(1),VT_BOOL);
COleVariant varFalse(short(0),VT_BOOL);
COleVariant vTure(SHORT(TRUE)), vFalse(SHORT(FALSE));
COleVariant vE(_T(""));
COleVariant v0(SHORT(0)), v1(SHORT(1)), v2(SHORT(2)), v5(SHORT(5)), v6(SHORT(6)), v12(SHORT(12)), v22(SHORT(22));
CString strPath = "..\\Perforation.tdt";
//根据模版创建Word文档
ExportMessage(1);
CApplication app;
app.CreateDispatch("Word.Application");
app.put_Visible(TRUE);
//word文档
CDocuments docs = app.get_Documents();
docs.AttachDispatch(app.get_Documents()); //将Documents类对象m_Docs和Idispatch接口关联起来;
//打开文档
docs.Open2000(COleVariant(strPath),varFalse,varFalse,varFalse,
varstrNull,varstrNull,varFalse,varstrNull,
varstrNull,varTrue,varTrue,varTrue);
ExportMessage(2);
CDocument0 doc0 = app.get_ActiveDocument();
CSelection select = app.get_Selection();
//写入文本
select.TypeText("The First Table!");
//选择表格
CTables0 tabs = doc0.get_Tables();
CTable0 tab1 = tabs.Item(1);
CTable0 tab2 = tabs.Item(2);
CCell0 cell = tab1.Cell(1,2);
cell.Select();
select.TypeText("12");
cell = tab1.Cell(1,6);
cell.Select();
select.TypeText("16");
cell = tab1.Cell(4,2);
cell.Select();
select.TypeText("42");
//获得当前页信息
COleVariant vAllPag(select.get_Information(4));
int nAllPag = vAllPag.intVal;
int nCurPag = nAllPag;
CString strData;
int i,j;
i=1;
while(nAllPag >= nCurPag)
{
for(j=1;j<=13;j++)
{
cell = tab2.Cell(i,j);
cell.Select();
strData.Format("%d",i);
select.TypeText(strData); //输入数据
select.MoveRight(v1,v1,v0); //右移
}
select.Collapse(v1); //换行
COleVariant vAllPagNew(select.get_Information(4));
nCurPag = vAllPagNew.intVal;
i++;
}
//查找END字符,删除行
COleVariant vEnd(_T("END")),vT(SHORT(TRUE)), vF(SHORT(FALSE));
CDocument0 Fnd(select.get_Find()); //Fnd和select相关联
Fnd.Exe(vEnd, vF, vF, vF, vF, vF, vT, v1, vF, COleVariant(""), vT, vF, vF, vF, vF);
select.MoveRight(v1,v1,v0);
select.TypeBackspace();
select.TypeBackspace();
//释放对象
cell.ReleaseDispatch();
tab1.ReleaseDispatch();
tab2.ReleaseDispatch();
tabs.ReleaseDispatch();
//保存word
ExportMessage(3);
CFile file;
CString strSaveFile;
BOOL bUse = TRUE;
while(bUse)
{
CFileDialog fileDialog(FALSE);
fileDialog.m_ofn.lpstrTitle = "保存Word文档";
fileDialog.m_ofn.lpstrFilter = "Word Document(*.doc)\0*.doc\0All Files(*.*)\0*.*\0\0";
fileDialog.m_ofn.lpstrDefExt = ".doc";
if(IDOK == fileDialog.DoModal())
{
strSaveFile = fileDialog.GetPathName();
if(file.Open(strSaveFile, CFile::modeWrite | CFile::modeCreate))
{
file.Close();
bUse = FALSE;
doc0.SaveAs(COleVariant(strSaveFile), v0, vF, vE, vF, vE, vF, vF, vF, vF, vF, vF, vF, vF, vF, vF);
}
else
{
bUse = TRUE;
AfxMessageBox("文件正在编辑,无法进行存储!");
}
}
else
{
bUse = FALSE;
AfxMessageBox("取消存储!如要使用数据,请再次输出!");
}
}
//打印
ExportMessage(4);
if(IsPrint())
{
ExportMessage(5);
ShellExecute(NULL,"print",strSaveFile,"","",SW_HIDE);
}
select.ReleaseDispatch();
doc0.ReleaseDispatch();
docs.ReleaseDispatch();
app.Quit(vFalse, vFalse, vFalse);
app.ReleaseDispatch();
ExportMessage(0);
}
void CWordDlg::ExportMessage(int nType)
{
CString strMessage;
switch(nType)
{
case 0:
strMessage = "就绪";
break;
case 1:
strMessage = "创建Word文档...";
break;
case 2:
strMessage = "写入数据...";
break;
case 3:
strMessage = "保存Word文档...";
break;
case 4:
strMessage = "正在检查当前打印机是否可用 ...";
break;
case 5:
strMessage = "打印Word文档...";
break;
default:
break;
}
GetDlgItem(IDC_MESSAGE)->SetWindowText(strMessage);
}
BOOL CWordDlg::IsPrint()
{
CApplication App;
COleVariant vF(SHORT(FALSE));
if(!App.CreateDispatch("Word.Application"))
{
AfxMessageBox("当前打印机安装有问题,无法打印!");
return FALSE;
}
CString strPrt(App.get_ActivePrinter());
strPrt = strPrt.Left(strPrt.ReverseFind('on')-1);
strPrt.TrimRight();
App.Quit( vF, vF, vF);
HANDLE hPrt;
if(!OpenPrinter(strPrt.GetBuffer(), &hPrt, NULL))
{
AfxMessageBox("当前打印机安装有问题,无法打印!");
return FALSE;
}
return ClosePrinter(hPrt);
}