我的RTF文件内容如下:(RTF文件名:start.rtf。word打开它,是普通模式显示的。内容中#是小的且在左上角,是注脚,拷贝过来的时候就变大了)#ページ数
ドキュメントのページ数が表示されます。#所有者
プリントを送信した所有者名が表示されます。
所有者名は、クライアントからのプリント方法により異なります。
#ファイルタイプ
ドキュメントのファイルフォーマットが表示されます。ファイルタイプには、次の種類があります。
・ PS (PostScript)
・ PDF
・ EPS
・ TIFF
・ JPEG
・ BJ (ビルドジョブ)
・ PPML
・ 不明#受信日時
サーバーがドキュメントを受信した日時が表示されます。////////////////////////下面是我的问题//////////////////////////////////////////////////////////VS2005下,建一个MFC基于对话框的工程,选上automation,我要读写RTF文件,但是不改变它的段落格式,该怎么办?具体点说就是,我要读出每一行的日文文本,将我翻译好的对应的中文文本写到对应的行里,但是写入的时候不改变行的格式只要替换掉文本即可,有什么好的办法吗?////////////////////////下面是我的代码,能读取段落及字体,但是得不到格式///////////////////////////////////////////////////////void CVCreadwriteRTFDlg::OnBnClickedButton1()
{
// 变量的声明
COleVariant vTrue((short)TRUE),
vFalse((short)FALSE),
vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);// 缺省对象 CComVariant tpl(_T("e:\\start.rtf")), NewTemplate(false), DocType(0), Visble; // BuildJobEdit.rtf
CApplication oWordApp ;
CSelection oSel ;
CDocuments oDocs ;
CDocument0 oDoc ;
CParagraphs paragraphs ;
CParagraph paragraph ;
CRange range ; CStringArray aryText;
long paCounst ;
long lc ;// long paCounst;
//int lc ;
// 首先建立一个word实例对象
if (!oWordApp.CreateDispatch(TEXT("Word.Application")) ){ AfxMessageBox( TEXT( "CreateDispatch failed." ) , MB_OK|MB_SETFOREGROUND);
return; // 一定要返回,否则程序崩溃
} // 显示此对象文件 ,您也可以不调用此句,不显示对象文件
oWordApp.Set_Visible(TRUE);
// 创建文档
oDocs = oWordApp.get_Documents(); // 打开一个新文档,将e:\\BuildJobEdit.rtf文件的内容添加到新文档中
oDoc = oDocs.Add(&tpl,&NewTemplate,&DocType,&Visble);
// 选中文档中的所有内容
oSel = oWordApp.get_Selection();
oSel.WholeStory();// 此句必须有,否则后续代码无效。 // 选中文档中的所有内容
oSel = oWordApp.get_Selection();
oSel.WholeStory();// 此句必须有,否则后续代码无效。 // 得到所有段
paragraphs = oSel.get_Paragraphs();
paCounst = paragraphs.get_Count();
// 将所有段中的每一段都存在数组里
for( lc = 1 ; lc < paCounst+1 ; lc++ ){ // 得到一段
paragraph = paragraphs.Item( (long)lc ); // 得到一段的文本
range = paragraph.get_Range();
CString strRangeText = range.get_Text();
// 保存到数组里
aryText.Add( strRangeText );
}
paragraph = paragraphs.Item( (long)3);// 拿第3行做实验
range = paragraph.get_Range();
CString strRangeText = TEXT("AAAA" ) ; //= range.get_Text();
CFont0 font = range.get_Font();//先得到字体
range.put_Font( font );// 再设置 // 将数组写到word里面 if ( '#' == strRangeText[1] ){ // ?????这里写得不好,扩展性不强,该怎么办呢?
range.SetRange( range.get_Start() , range.get_End()); } range.put_Text( strRangeText ); //写word的第3行
//将当前文档保存到新的文档中
oDoc.SaveAs(COleVariant( TEXT("E:\\new.rtf") ),
COleVariant((short)0),
vFalse, COleVariant( TEXT("") ), vTrue, COleVariant( TEXT("") ),//COleVariant( TEXT("")为缺省值
vFalse, vFalse , vFalse, vFalse , vFalse,
vFalse, vFalse , vFalse, vFalse , vFalse
); // 释放各种对象 oSel.ReleaseDispatch();
range.ReleaseDispatch();
paragraph.ReleaseDispatch();
paragraphs.ReleaseDispatch();
oDocs.ReleaseDispatch();
oDoc.ReleaseDispatch();
//CComVariant SaveChanges(false), OriginalFormat, RouteDocument;
//oWordApp.Quit( &SaveChanges,&OriginalFormat,&RouteDocument );
oWordApp.ReleaseDispatch();}
ドキュメントのページ数が表示されます。#所有者
プリントを送信した所有者名が表示されます。
所有者名は、クライアントからのプリント方法により異なります。
#ファイルタイプ
ドキュメントのファイルフォーマットが表示されます。ファイルタイプには、次の種類があります。
・ PS (PostScript)
・ EPS
・ TIFF
・ JPEG
・ BJ (ビルドジョブ)
・ PPML
・ 不明#受信日時
サーバーがドキュメントを受信した日時が表示されます。////////////////////////下面是我的问题//////////////////////////////////////////////////////////VS2005下,建一个MFC基于对话框的工程,选上automation,我要读写RTF文件,但是不改变它的段落格式,该怎么办?具体点说就是,我要读出每一行的日文文本,将我翻译好的对应的中文文本写到对应的行里,但是写入的时候不改变行的格式只要替换掉文本即可,有什么好的办法吗?////////////////////////下面是我的代码,能读取段落及字体,但是得不到格式///////////////////////////////////////////////////////void CVCreadwriteRTFDlg::OnBnClickedButton1()
{
// 变量的声明
COleVariant vTrue((short)TRUE),
vFalse((short)FALSE),
vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);// 缺省对象 CComVariant tpl(_T("e:\\start.rtf")), NewTemplate(false), DocType(0), Visble; // BuildJobEdit.rtf
CApplication oWordApp ;
CSelection oSel ;
CDocuments oDocs ;
CDocument0 oDoc ;
CParagraphs paragraphs ;
CParagraph paragraph ;
CRange range ; CStringArray aryText;
long paCounst ;
long lc ;// long paCounst;
//int lc ;
// 首先建立一个word实例对象
if (!oWordApp.CreateDispatch(TEXT("Word.Application")) ){ AfxMessageBox( TEXT( "CreateDispatch failed." ) , MB_OK|MB_SETFOREGROUND);
return; // 一定要返回,否则程序崩溃
} // 显示此对象文件 ,您也可以不调用此句,不显示对象文件
oWordApp.Set_Visible(TRUE);
// 创建文档
oDocs = oWordApp.get_Documents(); // 打开一个新文档,将e:\\BuildJobEdit.rtf文件的内容添加到新文档中
oDoc = oDocs.Add(&tpl,&NewTemplate,&DocType,&Visble);
// 选中文档中的所有内容
oSel = oWordApp.get_Selection();
oSel.WholeStory();// 此句必须有,否则后续代码无效。 // 选中文档中的所有内容
oSel = oWordApp.get_Selection();
oSel.WholeStory();// 此句必须有,否则后续代码无效。 // 得到所有段
paragraphs = oSel.get_Paragraphs();
paCounst = paragraphs.get_Count();
// 将所有段中的每一段都存在数组里
for( lc = 1 ; lc < paCounst+1 ; lc++ ){ // 得到一段
paragraph = paragraphs.Item( (long)lc ); // 得到一段的文本
range = paragraph.get_Range();
CString strRangeText = range.get_Text();
// 保存到数组里
aryText.Add( strRangeText );
}
paragraph = paragraphs.Item( (long)3);// 拿第3行做实验
range = paragraph.get_Range();
CString strRangeText = TEXT("AAAA" ) ; //= range.get_Text();
CFont0 font = range.get_Font();//先得到字体
range.put_Font( font );// 再设置 // 将数组写到word里面 if ( '#' == strRangeText[1] ){ // ?????这里写得不好,扩展性不强,该怎么办呢?
range.SetRange( range.get_Start() , range.get_End()); } range.put_Text( strRangeText ); //写word的第3行
//将当前文档保存到新的文档中
oDoc.SaveAs(COleVariant( TEXT("E:\\new.rtf") ),
COleVariant((short)0),
vFalse, COleVariant( TEXT("") ), vTrue, COleVariant( TEXT("") ),//COleVariant( TEXT("")为缺省值
vFalse, vFalse , vFalse, vFalse , vFalse,
vFalse, vFalse , vFalse, vFalse , vFalse
); // 释放各种对象 oSel.ReleaseDispatch();
range.ReleaseDispatch();
paragraph.ReleaseDispatch();
paragraphs.ReleaseDispatch();
oDocs.ReleaseDispatch();
oDoc.ReleaseDispatch();
//CComVariant SaveChanges(false), OriginalFormat, RouteDocument;
//oWordApp.Quit( &SaveChanges,&OriginalFormat,&RouteDocument );
oWordApp.ReleaseDispatch();}
?
range = paragraph.get_Range() ; CString strRangeText = range.get_Text() ;
CString strNewText = TEXT("AAA") ;
strNewText += TEXT("\n") ;
CFont0 font = range.get_Font();//先得到字体
range.put_Font( font );// 再设置 long iStart = range.get_Start();
long iEnd = range.get_End(); // 如果是页眉,就从第三个字符处写入新的字符串
if ( '#' == strRangeText[1] ){
oSel.SetRange( iStart + 2 , iEnd );
}
else { oSel.SetRange( iStart , iEnd );
} oSel.put_Text( strNewText );//写word的第3行