shaohua,你好。你说的没有资料是什么意思?MSDN里面就有关于Office的资料。我原来也是什么都不知道。在看了你的问题之后,我想到了WORD中的宏,它们实际上就是那些自动化的接中,MSDN中有资料。我已经从一个录制的宏改造出一个可以显示字体信息的宏。我正在试着将它用VC实现。也许我的这个思路对你会有所帮助。

解决方案 »

  1.   

    我知道,你可去研究一下MSDN里的写字板原程序
      

  2.   

    WORD文档和EXCEL文档的文件格式在MSDN的1999年的April版中有专门的说明!
    WORD和EXCEL的文档主要都是复合文档的标准化存储格式,有各种文档流控制,如果你要读取各种文档内的属性,只能利用OLE的一些接口将数据流读取出来,然后根据文档的描述将各个流内部的数据属性一个一个读出,这个程序还是相当麻烦的!
      

  3.   

        你上msdn.microsoft.com 用ole,office,word作为关键字组合查询,将得到几篇关于你要的问题的答案。我也写过类似的程序用来读取Word,Excel,Outlook中的数据,也是在msdn.microsoft.com上找到的。具体的vc代码已经找不到了,只有vb的代码,两者的实现原理一模一样,如果需要请Email我([email protected])。
        我保证你的问题能得到解答!
      

  4.   

      好了,我建议你看一下(VC++技术内幕5)中的例子,关于自动化的。我已经做出一个小的例子,可以显示当前的打开的WORD文档中被选中的文字的字体信息。其它你要的功能就是你自己努力了。不过用VC做这种事,好累啊!
      
      

  5.   

    for wqpaul: 我也用VB实现过,但我发现VB和VC实现上大有区别,不知老兄用的是哪种方法,
    我很想要您的代码,能否EMail给我?谢谢.我的EMail: [email protected][email protected]
    多谢多谢.
    for Holly: 我的思路和你正是一样,也同样觉得颇为麻烦,但不知您能否提供一点帮助?多谢多
    谢!
    for RedFire: 我想用宏也许不太可行,不过我还没太懂您的思路,不知您能否进一步指点,或讲
    明您的思路?多谢多谢!
    感谢和期盼大家的讨论。
      

  6.   

    我有一个自己写的在VC中调用WORD2000的引擎来控制WORD文档的例程。
    如有需要,请E_Mail给我:[email protected]
      

  7.   

    呵呵,用delphi吧,dephi 5.0可提供了现成的Office接口,Inprise的程序员们已经把最烦琐的事情为我们封装好了,用VC做太累了。 C++ Buider也不错。你何不在C++ Builder下利用OFFICE部件写一个完成你的所有处理的COM组件呢?是COM的话,VC也可以调用的,我没有试过,但我想这是一个好的思路吧,我会试着在Delphi下或C++ Builder下做一个Demo,等我的好消息吧:)
      

  8.   

    简单,你先Save as ...成Html文件,然后分析Html文件,Html文件结构是公开的!!!
    怎么样,是不是够简单,要驱动word作一下Save As操作是很简单的,分析html结构也是很简单的,一个复杂的问题,分成两个简单的问题,是不是OK了。
    什么时候代码写好了能不能给我共享一下,我会很感激的,先吹一下牛,我的Vc水平还是很高的,不过如果让我去写这个东西现在没有时间,但如果让我去看我还是愿意的。
      

  9.   

    我认为用VC来写这种程序太累了,你完全可以利用宏或者VBA(VB)来写一段非常简单的程序,而且vba的语法很简单,看一看help就成了。
      

  10.   

    正如Holly老兄说的:“WORD和EXCEL的文档主要都是复合文档的标准化存储格式”,它们都是通过标准的OLE接口实现的,而OLE的基础又是COM/DCOM,因此,你想彻底搞清楚你的问题,那就仔细去瞧瞧COM/DCOM的实现原理吧,清华刚出的一本书叫《COM/DCOM编程指南》,讲了它的实现原理,而且着重讲述如何用VC++来实现COM/DCOM。的确,用VC++来实现这些东西很麻烦,(至少弄掉你100根头发:))因为COM/DCOM编程是一种全新的编程方式。
      

  11.   

    大家说了这么多,我还想问shaohua一下!你是想读整个文件的内容还是只是某个特定的内容?要通用化还是专用?
    能否说一下你的应用是什么,这也在相当的程度上决定了使用的方案!
      

  12.   

    我想你的想法是不是与XML有关?研究一下XML可能对这个有帮助
      

  13.   

    要想对Word或Excel等进行控制,首先必须清楚Word或Excel的编程模型,其次在VC中引入Word的类型库的定义(通过#import指令),创建Word实例,通过查询相关接口,调用其函数即可。如果你对浏览器的编程模型很熟,并编写过有关浏览器的控件,那么编写对Word的完全控制也不难,因为它们的原理完全一样。关键在于熟悉Word或Excel的编程模型。
      

  14.   

    for Holly:我在做一个基于Windows平台的考试系统,因为要考Word97和Excel97,涉及到
    Word97和Excel97的评分,所以要做一个评分程序,希望能读取到Word97文档中的任意指定
    一段文字的字体,字型,字号,背景,以及制表处理中的表格的行列,行列中的内容等等。
    不知您能否给予我一点指点?谢谢。
    For dyw: 您老兄说的可能错不了,我也正是您这么想,但问题就是如何熟悉Word和Excel的
    编程模型。请您多多指点。
    For mastercat等:我不仅想到过VB,而且也用VB实现了,现在用delphi也基本实现,但考虑
    到由于对多个考生同时评分,要讲效率和时间,所以我还是想用VC实现。再说我整个考试系统
    都用VC实现,我也想用VC来做评分程序。
    For Oldworm: 我自己也想到过老兄这种方法,也相信它一定可以实现,但有以下几点顾虑:
      1. 用html方式会不会显得不太地道?是否会有个别地方不便考查?(我没试过,也没太多
    小想,不知是否应该考虑)
      2. 会不会影响执行时间和效率。
      3. 学生的错误答案(比如多写空格和回车或空白)会不会增加评分的难度?
      4. 标准答案将采用什么形式?--标准样本?如何使更换试题和标准答案方便快捷且安全性高,
    (难泄密)。
    但不管如何,oldworm兄确实提供了一种行之有效的方法。我在此表示诚挚感谢。
    欢迎大家继续展开讨论。期待大家的解答!谢谢大家。 
      

  15.   

       这是我写的办公自动化考试的一段代码。希望能对你有所帮组。用vc写也一样。只是代码太雍长了。去过 msdn.microsoft.com ? 那里有你想要的一切。
       1 用html的方式我个人认为不好,
       2 执行时间和效率主要消耗不在vb或vc的程序中,主要在ole时。
       3 这是个非常困难的问题。只能近似的完成。首先将过滤空白,回车,换行等非有效字符。再将两段文字进行模糊判断(分成若干段分别比较)。
       4 无法回答。
    Public Sub StartWord()
        Set w_App = CreateObject("Word.Application")
        With w_App
            .Visible = False
            Set w_Doc = .Documents.Add
            g_IsWordOpen = True
        End With
    End SubPublic Sub EndWord()
        If IsWordOpen() = True Then
            w_Doc.saved = True
            w_Doc.Close
            Set w_Doc = Nothing
            w_App.quit
            Set w_App = Nothing
        End If
        Unload FormSwitch
    End SubPublic Sub CheckWord1()
        On Error Resume Next
        Dim ob As Object
        Set w_Range = w_P2.range
        score = 0
        Set ob = w_P1
        Set ob = w_P2
        
        With w_P1
            If .Alignment = wdAlignParagraphcenter Then score = score + 1
            With .range.Font
                If .Bold = True Then score = score + 1
                If .colorIndex = wdColorBlue Then score = score + 1
                If .Name = "黑体" Then score = score + 1
                If .size = 16 Then score = score + 1
            End With
        End With
        
        With w_P2
            If .firstlineindent = 24.1 Then score = score + 2
            If .range.Font.size = 14 Then score = score + 1
        End With
        
        'C.将正文分成三栏,中间用分隔线分开。
        w_Range.End = 50
        w_Range.Start = 80
        With w_Range.Sections(1).PageSetup.TextColumns
            If .count = 3 Then score = score + 2
            If .LineBetween = True Then score = score + 2
        End With
        
        w_Range.End = w_P2.range.End
        w_Range.Start = w_P1.range.End
        scoreT = 0
        For i = 1 To 5
            w_Range.Find.Execute ("企业")
            With w_Range.Font
                If .Name = "黑体" Then scoreT = scoreT + 1
                If .colorIndex = wdColorRed Then scoreT = scoreT + 1
                If .Underline = wdUnderlineWavy Then scoreT = scoreT + 1
            End With
            w_Range.Start = w_Range.End + 1
            w_Range.End = w_P2.range.End
        Next i
        a = 8 - Abs(15 - scoreT)
        If a < 0 Then a = 0
        score = score + a
    End SubPublic Function CutBlank(ByVal s As String) As String
        Dim l As Long
        Dim s1, s2, s3 As String
        CutBlank = "": s2 = Chr(13): s3 = Chr(10)
        l = Len(s)
        For i = 1 To l
            s1 = Mid(s, i, 1)
            If s1 <> " " And s1 <> s2 And s1 <> s3 Then CutBlank = CutBlank + s1
        Next i
    End Function
      

  16.   

    原理不过是Com接口的一种实现,用#import或ClassWizard到入接口,学会使用包装类就可以了,如果还不会找一些VB的操作Word Execl的例子。都是调了接口,如果还不会装一个Delphi5
    直接用他,如果不想用delphi,看他的vcl相关组件的包装类(我vc中的一部分空间就是从delphi 抄的)。
      

  17.   

    to shaohua:
    你的问题是无法在帖子里直接解决的,我虽然有文件格式的资料(以前的MSDN),但我自己没有写过,虽然有朋友写过,但属于商业机密,我只能讲讲大概的方法!你需要自己看资料,别人不可能直接给你最后的答案,而且据我所知,这个过程不是几天的功夫,是要上月的时间!还要看你的有关OLE的基础和英文基础!
      

  18.   

    虽然你已经解决了,但我还是想说一下,不知道对你有没有帮助,实现这个功能主要用的是ole自动化技术,将word*.olb引入,然后调用CreatDispatch接口,CreatDispatch("word.application.9"),若想知道一些属性,直接调用get*方法即可