『大侠救命』用VC调用WORD的问题!(急!!!!)

时间:2022-12-31 06:21:21
是这样的:用VC做一个程序,实现在程序中输入文档可以直接调用Word,并按照Word中早先既定的格式生成文档(其中输入的文档要生成在Word中固定的位置)!
现在我只完成了调用!
希望大侠帮助解决:
    1。程序中的文档写进Word。(使用Range里的SetText吗?那Range
怎么得到!)
    2。编排文档到固定位置!(需要哪些类)!
急!!分不够在给!

9 个解决方案

#1


问题1:
先得到Document对象,此对象下有一个content属性,它就是range对象。

问题2:
我不太明白你到底想做什么,建议用bookmark书签,要么用表格,这都好确定位置。要精确到某行某列就没有什么办法了。

#2


void CWebOfficeCtrl::SetSign(LPCTSTR strRule, LPCTSTR strSign)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());

// TODO: 在此添加调度处理程序代码
LPDISPATCH lpDisp;
lpDisp=m_pWebOfficeFrame->m_pWebOfficeView->m_pSelection->GetIDispatch();

_Application_Word m_WordApp;
_Document_Word m_WordDoc;
Documents_Word m_WordDocs;
Range_Word m_WordRange;
Tables_Word m_WordTables;
Table_Word m_WordTable;
Columns_Word m_WordColumns;
Cell_Word m_WordCell;

m_WordDoc.AttachDispatch(lpDisp,TRUE);
//m_WordDoc.Activate();
m_WordApp=m_WordDoc.GetApplication();
m_WordTables=m_WordDoc.GetTables();

DataPosition Position;
int iBeginPos,iEndPos,iBeginPos_,iEndPos_;
BOOL bInit,bAction,bInit_,bAction_;
bInit=TRUE;
bAction=FALSE;
CString m_RuleNode;
int iSerial;
iSerial=0;
int iSerialPos,iSerialPos_;
iSerialPos=0;
iSerialPos_=0;
BOOL bInit__,bAction__;

char pResult[5];
memset(pResult,0,5);

CString strRule_;
strRule_.Format("%s",strRule);
for(int iIndex=0;iIndex<strRule_.GetLength();iIndex++)
{
if(strRule_.GetAt(iIndex)=='#')
{
if(bInit)
{
iBeginPos=iIndex;
iEndPos=iIndex;
bInit=FALSE;
}
else
{
iBeginPos=iEndPos;
iEndPos=iIndex;
bAction=TRUE;
}
if(bAction)
{
m_RuleNode=strRule_.Mid(iBeginPos+1,iEndPos-iBeginPos-1);
bInit_=TRUE;
bAction_=FALSE;
for(int tIndex=0;tIndex<m_RuleNode.GetLength();tIndex++)
{
if(m_RuleNode.GetAt(tIndex)==',')
{
if(bInit_)
{
iBeginPos_=tIndex;
iEndPos_=tIndex;
bInit_=FALSE;
}
else
{
iBeginPos_=iEndPos_;
iEndPos_=tIndex;
bAction_=TRUE;
}
if(bAction_)
{
sprintf(pResult,"%s",m_RuleNode.Mid(iBeginPos_+1,iEndPos_-iBeginPos_-1));
if(iSerial==3)
{
iSerial=0;
}
switch(iSerial)
{
case 0:
Position.iTableSerial=atoi(pResult);
break;
case 1:
Position.iRow=atoi(pResult);
break;
case 2:
Position.iCol=atoi(pResult);
m_WordTable=m_WordTables.Item(Position.iTableSerial);
m_WordCell=m_WordTable.Cell(Position.iRow,Position.iCol);
m_WordRange=m_WordCell.GetRange();
iSerialPos++;
bInit__=TRUE;
bAction__=FALSE;
iSerialPos_=0;
m_WordRange.SetText(strSign);
m_WordTable.ReleaseDispatch();
m_WordRange.ReleaseDispatch();
m_WordCell.ReleaseDispatch();
break;
default:
break;
}
iSerial++;
bAction_=FALSE;
}
}
}
bAction=FALSE;
}
}
}

m_WordTables.ReleaseDispatch();
m_WordDoc.ReleaseDispatch();
m_WordApp.ReleaseDispatch();
}

#3


To 大侠: gjd111686(数字金刚)
      DataPosition 是什么??是MSWORD9。odl中的吗?怎么得到啊?

#4


对不起,是我自己定义的一个结构.
struct DataPosition
{
int iTableSerial;
int iRow;
int iCol;
};

#5


我估计也是!谢谢了,我再试试:)

#6


发信给我,我这有些关于这方面的例子。

xjliu_ustc@tom.com

#7


首先要知道文档的格式,然后再编程的。知道了文档的格式,就好做了。

#8


怎么最近大家都做这个?呵呵,我来学习!

#9


做完了给我个例子,兄弟!
caiyfcnln@hotmail.com

#1


问题1:
先得到Document对象,此对象下有一个content属性,它就是range对象。

问题2:
我不太明白你到底想做什么,建议用bookmark书签,要么用表格,这都好确定位置。要精确到某行某列就没有什么办法了。

#2


void CWebOfficeCtrl::SetSign(LPCTSTR strRule, LPCTSTR strSign)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());

// TODO: 在此添加调度处理程序代码
LPDISPATCH lpDisp;
lpDisp=m_pWebOfficeFrame->m_pWebOfficeView->m_pSelection->GetIDispatch();

_Application_Word m_WordApp;
_Document_Word m_WordDoc;
Documents_Word m_WordDocs;
Range_Word m_WordRange;
Tables_Word m_WordTables;
Table_Word m_WordTable;
Columns_Word m_WordColumns;
Cell_Word m_WordCell;

m_WordDoc.AttachDispatch(lpDisp,TRUE);
//m_WordDoc.Activate();
m_WordApp=m_WordDoc.GetApplication();
m_WordTables=m_WordDoc.GetTables();

DataPosition Position;
int iBeginPos,iEndPos,iBeginPos_,iEndPos_;
BOOL bInit,bAction,bInit_,bAction_;
bInit=TRUE;
bAction=FALSE;
CString m_RuleNode;
int iSerial;
iSerial=0;
int iSerialPos,iSerialPos_;
iSerialPos=0;
iSerialPos_=0;
BOOL bInit__,bAction__;

char pResult[5];
memset(pResult,0,5);

CString strRule_;
strRule_.Format("%s",strRule);
for(int iIndex=0;iIndex<strRule_.GetLength();iIndex++)
{
if(strRule_.GetAt(iIndex)=='#')
{
if(bInit)
{
iBeginPos=iIndex;
iEndPos=iIndex;
bInit=FALSE;
}
else
{
iBeginPos=iEndPos;
iEndPos=iIndex;
bAction=TRUE;
}
if(bAction)
{
m_RuleNode=strRule_.Mid(iBeginPos+1,iEndPos-iBeginPos-1);
bInit_=TRUE;
bAction_=FALSE;
for(int tIndex=0;tIndex<m_RuleNode.GetLength();tIndex++)
{
if(m_RuleNode.GetAt(tIndex)==',')
{
if(bInit_)
{
iBeginPos_=tIndex;
iEndPos_=tIndex;
bInit_=FALSE;
}
else
{
iBeginPos_=iEndPos_;
iEndPos_=tIndex;
bAction_=TRUE;
}
if(bAction_)
{
sprintf(pResult,"%s",m_RuleNode.Mid(iBeginPos_+1,iEndPos_-iBeginPos_-1));
if(iSerial==3)
{
iSerial=0;
}
switch(iSerial)
{
case 0:
Position.iTableSerial=atoi(pResult);
break;
case 1:
Position.iRow=atoi(pResult);
break;
case 2:
Position.iCol=atoi(pResult);
m_WordTable=m_WordTables.Item(Position.iTableSerial);
m_WordCell=m_WordTable.Cell(Position.iRow,Position.iCol);
m_WordRange=m_WordCell.GetRange();
iSerialPos++;
bInit__=TRUE;
bAction__=FALSE;
iSerialPos_=0;
m_WordRange.SetText(strSign);
m_WordTable.ReleaseDispatch();
m_WordRange.ReleaseDispatch();
m_WordCell.ReleaseDispatch();
break;
default:
break;
}
iSerial++;
bAction_=FALSE;
}
}
}
bAction=FALSE;
}
}
}

m_WordTables.ReleaseDispatch();
m_WordDoc.ReleaseDispatch();
m_WordApp.ReleaseDispatch();
}

#3


To 大侠: gjd111686(数字金刚)
      DataPosition 是什么??是MSWORD9。odl中的吗?怎么得到啊?

#4


对不起,是我自己定义的一个结构.
struct DataPosition
{
int iTableSerial;
int iRow;
int iCol;
};

#5


我估计也是!谢谢了,我再试试:)

#6


发信给我,我这有些关于这方面的例子。

xjliu_ustc@tom.com

#7


首先要知道文档的格式,然后再编程的。知道了文档的格式,就好做了。

#8


怎么最近大家都做这个?呵呵,我来学习!

#9


做完了给我个例子,兄弟!
caiyfcnln@hotmail.com