我的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();}

解决方案 »

  1.   

    使用xslt样式处理加进去,把word当xml处理就有格式了
      

  2.   

    干嘛调用word, 用Rich Edit不行么?
      

  3.   

    richedit我试过了,格式也变了,颜色也没了,等我再试试吧,谢谢
      

  4.   

    richedit我试过了,格式也变了,颜色也没了,等我再试试吧,谢谢
      

  5.   

    richedit也得不到页眉页脚的内容吧
      

  6.   

    汗……还有页眉页脚啊…… 不知道了PS: rtf 是文本格式,你要是不嫌麻烦,用纯文本方式打开,然后 跳过所有的控制字符,可以直接替换正文。单字节文本是直接写出来的,\'xx 那种是多字节文本,每个代表一个字节。(正文在后半部分)~
      

  7.   

    http://www.poptool.net/software/p353/A35343371.shtml
    ?
      

  8.   

    弄明白点事情,对页眉和普通文本的处理完成了,下面是代码        paragraph = paragraphs.Item( (long)3) ;// 拿第3行做实验
    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行