vc++ word文档内容,标书格式验证程序的例子,愿愿。

本文所描述的Word文档格式验证,程序可以进行标书的文档格式验证。由于本人编写仓促,可能有不完善的地方,作为一个例子,让大家参考下吧,毕竟,程序在我手里发霉了。

先是word操作类文件WordWriter.cpp。

// WordOffice.cpp: implementation of the CWordWriter class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "WordWriter.h"
//#include "cstringt.h"
#define wdWithInTable  12
#define wdStartOfRangeRowNumber  13
#define wdEndOfRangeRowNumber  14
#define wdMaximumNumberOfRows  15
#define wdStartOfRangeColumnNumber  16
#define wdEndOfRangeColumnNumber  17
#define wdMaximumNumberOfColumns  18
#define wdHorizontalPositionRelativeToPage 5
#define wdVerticalPositionRelativeToPage  6
#define wdActiveEndPageNumber 3

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CWordWriter::CWordWriter()
{
    m_bIsNewApp = FALSE;
}

CWordWriter::~CWordWriter()
{
    CloseApp();
}

//操作
BOOL CWordWriter::CreateApp()
{
    CLSID clsid;
    HRESULT hr;

    hr=::CLSIDFromProgID(L"Word.Application",&clsid);    //通过ProgID取得CLSID
    if(FAILED(hr))
    {
        AfxMessageBox(_T("没有安装OFFICE"));
        return FALSE;
    }
    
    IUnknown *pUnknown=NULL;
    IDispatch *pDispatch=NULL;

    hr=::GetActiveObject(clsid,NULL,&pUnknown);    //查找是否有WORD程序在运行
    if(FAILED(hr))                                // 没有正在运行的,则启动新应用
    {
        if(m_wdApp.m_lpDispatch==NULL)
        {
            if (FALSE == m_wdApp.CreateDispatch(L"Word.Application"))
            {
                /*DWORD nErrorNo = get_LastError ( ); // 得到错误代码
                LPSTR lpBuffer;    
                FormatMessage ( FORMAT_MESSAGE_ALLOCATE_BUFFER  |
                FORMAT_MESSAGE_IGNORE_INSERTS  |
                FORMAT_MESSAGE_FROM_SYSTEM,
                NULL,
                nErrorNo, // 此乃错误代码,通常在程序中可由 get_LastError()得之
                LANG_NEUTRAL,
                (LPTSTR) & lpBuffer,
                0 ,
                NULL );
                CString strErrorCause  =  lpBuffer  ?  _T(lpBuffer) : _T( " Sorry, cannot find this error info. " );
                AfxMessageBox(strErrorCause);*/
                AfxMessageBox(_T("Application创建失败,请确保安装了word 2000或以上版本!"), MB_OK|MB_ICONWARNING);
                return FALSE;
            }
            m_bIsNewApp = TRUE;
            return TRUE;
        }
    }
    // 否则,获得当前程序
    try
    {
        hr=pUnknown->QueryInterface(IID_IDispatch,(LPVOID *)&m_wdApp);
        if(FAILED(hr))    throw(_T("没有取得IDispatchPtr"));
        pUnknown->Release();    pUnknown=NULL;
        m_bIsNewApp = FALSE;
    }
    catch(LPCTSTR lpErr)
    {
        AfxMessageBox(lpErr);
    }

    return TRUE;
}

BOOL CWordWriter::CreateDocuments()
{
    if (FALSE == CreateApp())
    {
        return FALSE;
    }

    m_wdDocs.AttachDispatch(m_wdApp.get_Documents());
    if (!m_wdDocs.m_lpDispatch)
    {
        AfxMessageBox(_T("Documents创建失败!"), MB_OK|MB_ICONWARNING);
        return FALSE;
    }

    return TRUE;
}

BOOL CWordWriter::InitVariabels()
{
    /*COleVariant vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    //得到selection变量
    selectDocument();
    m_wdSel = m_wdApp.get_Selection();
    if (!m_wdSel.m_lpDispatch)
    {
        AfxMessageBox(_T("Select获取失败!"), MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    //得到全部DOC的Range变量
    m_wdRange = m_wdDoc.Range(vOptional,vOptional);
    if(!m_wdRange.m_lpDispatch)
    {
        AfxMessageBox(_T("Range获取失败!"), MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    m_wdTable = m_wdDoc.get_Tables();
    if(!m_wdTable.m_lpDispatch)
    {
        AfxMessageBox(_T("Table获取失败!"), MB_OK|MB_ICONWARNING);
        return FALSE;
    }*/
    return TRUE;
}

BOOL CWordWriter::CreateDocument()
{
    if (!m_wdDocs.m_lpDispatch)
    {
        AfxMessageBox(_T("Documents为空!"), MB_OK|MB_ICONWARNING);
        return FALSE;
    }

    COleVariant varTrue(short(1),VT_BOOL),vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    CComVariant Template(_T(""));    //没有使用WORD的文档模板
    CComVariant NewTemplate(false),DocumentType(0),Visible(true);
    this->m_preDocsCount=m_wdDocs.get_Count();
    m_wdDocs.Add(&Template,&NewTemplate,&DocumentType,&Visible);    
    this->m_afterDocsCount=m_wdDocs.get_Count();
    //得到document变量
    m_wdDoc = m_wdApp.get_ActiveDocument();
    if (!m_wdDoc.m_lpDispatch)
    {
        AfxMessageBox(_T("Document获取失败!"), MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    
    InitVariabels();

    return TRUE;
}
BOOL CWordWriter::CreateDocument(const CString& modelFile)
{
    if (!m_wdDocs.m_lpDispatch)
    {
        AfxMessageBox(_T("Documents为空!"), MB_OK|MB_ICONWARNING);
        return FALSE;
    }

    COleVariant varTrue(short(1),VT_BOOL),vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    COleVariant vFalse((short)FALSE);

    CComVariant Template(modelFile);    //没有使用WORD的文档模板
    CComVariant NewTemplate(false),DocumentType(0),Visible(false);
    this->m_preDocsCount=m_wdDocs.get_Count();
    m_wdDoc=m_wdDocs.Add(&Template,&NewTemplate,&DocumentType,&Visible);
    this->m_afterDocsCount=m_wdDocs.get_Count();
    //得到document变量
    //m_wdDoc = m_wdApp.get_ActiveDocument();
    //Window tmpWnd=m_wdDoc.get_ActiveWindow();
    //tmpWnd.SetVisible(false);
    if (!m_wdDoc.m_lpDispatch)
    {
        AfxMessageBox(_T("Document获取失败!"), MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    
    InitVariabels();

    return TRUE;
}
BOOL CWordWriter::Create()
{
    if (FALSE == CreateDocuments())
    {
        return FALSE;
    }
    return CreateDocument();
}

void CWordWriter::ShowApp()
{
    m_wdApp.put_Visible(TRUE);
}

void CWordWriter::HideApp()
{
    m_wdApp.put_Visible(FALSE);
}

BOOL CWordWriter::OpenDocument(const CString& fileName)
{
     if (!m_wdDocs.m_lpDispatch)
    {
        AfxMessageBox(_T("Documents为空!"), MB_OK|MB_ICONWARNING);
        return FALSE;
    }
CComVariant ConfirmConversions(FALSE), ReadOnly(FALSE);
CComVariant AddToRecentFiles(FALSE), PasswordDocument(_T(""));
CComVariant PasswordTemplate(_T("")), Revert(FALSE);
CComVariant WritePasswordDocument(_T("")), WritePasswordTemplate(_T(""));
CComVariant Format(0), XMLTransform(_T("")),Visible(FALSE); //true才可以读出内容来
    COleVariant vTrue((short)TRUE),    
                vFalse((short)FALSE),
                vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR),
                vZ((short)0);
    COleVariant     vFileName=COleVariant(fileName,VT_BSTRT);
    IDispatch *dispatch=NULL;
    //得到document变量
    long docsCount;
//    try{
    try
    {
        docsCount=m_wdDocs.get_Count();
    this->m_preDocsCount=docsCount;
dispatch=m_wdDocs.Open(vFileName,&ConfirmConversions,
&ReadOnly,&AddToRecentFiles,
&PasswordDocument,&PasswordTemplate,
&Revert,&WritePasswordDocument,
&WritePasswordTemplate,&Format,vOptional,&Visible,vFalse,          // OpenAndRepair
                                vZ,                  // DocumentDirection wdDocumentDirection LeftToRight
                                vFalse,          // NoEncodingDialog
                                &XMLTransform);

    /*dispatch=m_wdDocs.Open(
                                vFileName,        // FileName
                                vTrue,            // Confirm Conversion.
                                vFalse,            // ReadOnly.
                                vFalse,            // AddToRecentFiles.
                                vOptional,        // PasswordDocument.
                                vOptional,        // PasswordTemplate.
                                vOptional,        // Revert.
                                vOptional,        // WritePasswordDocument.
                                vOptional,        // WritePasswordTemplate.
                                vOptional,        // Format. // Last argument for Word 97
                                vOptional,        // Encoding // New for Word 2000/2002
                                vFalse,        // Visible
                                vOptional,          // OpenAndRepair
                                vZ,                  // DocumentDirection wdDocumentDirection LeftToRight
                                vOptional,          // NoEncodingDialog
                                vOptional
                                ) ;               // Close Open parameters;    */
            this->m_afterDocsCount=m_wdDocs.get_Count();
    }
    catch (COleDispatchException* e)
    {
        unsigned short code=e->m_wCode;
        if(code==0)
        {
            COleVariant vTrue((short)TRUE),    
                vFalse((short)FALSE);
            long i=m_wdDocs.get_Count();
                COleVariant i1((long)1);
                CString fileName2;
                m_wdDoc.AttachDispatch(m_wdDocs.Item(i1));
                fileName2=m_wdDoc.get_FullName();
            if((i==docsCount+1)&&(fileName2==fileName))
            {

                    m_wdDoc.Close(vFalse,vTrue,vFalse);
                    m_wdDoc.ReleaseDispatch();
                    e->ReportError();
                    e->Delete();
                    return FALSE;
            }
            else{
                throw(e);
                return FALSE;
            }
        }
        else{
            throw(e);
            return FALSE;
        }
    }

        if(dispatch!=NULL)
        {
            m_wdDoc.AttachDispatch(dispatch);
        }      
        else return FALSE;
    if (!m_wdDoc.m_lpDispatch)
    {
        AfxMessageBox(_T("Document获取失败!"), MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    InitVariabels();

    return TRUE;
}

BOOL CWordWriter::Open(const CString& fileName)
{
    if (FALSE == CreateDocuments())
    {
        return FALSE;
    }
    return OpenDocument(fileName);
}

BOOL CWordWriter::SetActiveDocument(short i)
{
    COleVariant     vIndex((short)(i)),vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

    m_wdDoc.AttachDispatch(m_wdDocs.Item(vIndex));
    m_wdDoc.Activate();
    if (!m_wdDoc.m_lpDispatch)
    {
        AfxMessageBox(_T("Document获取失败!"), MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    InitVariabels();

    //HideApp();
    return TRUE;
}

BOOL CWordWriter::SaveDocument()
{
    if (!m_wdDoc.m_lpDispatch)
    {
        AfxMessageBox(_T("Document获取失败!"), MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    m_wdDoc.Save();
    return TRUE;
}

BOOL CWordWriter::SaveDocumentAs(const CString& fileName)
{
    if (!m_wdDoc.m_lpDispatch)
    {
        AfxMessageBox(_T("Document获取失败!"), MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    COleVariant vTrue((short)TRUE),    
                vFalse((short)FALSE),
                vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR),
                vFileFormat((long)0);
                
    COleVariant vFileName(fileName);

    m_wdDoc.SaveAs(
                vFileName,    //VARIANT* FileName
                //Word.WdSaveFormat.wdFormatDocument,    //VARIANT* FileFormat
                vFileFormat,
                vOptional,    //VARIANT* LockComments
                vOptional,    //VARIANT* Password
                vOptional,    //VARIANT* AddToRecentFiles
                vOptional,    //VARIANT* WritePassword
                vOptional,    //VARIANT* ReadOnlyRecommended
                vOptional,    //VARIANT* EmbedTrueTypeFonts
                vOptional,    //VARIANT* SaveNativePictureFormat
                vOptional,    //VARIANT* SaveFormsData
                vOptional,    //VARIANT* SaveAsAOCELetter
                vOptional,      //VARIANT* Encoding
                vOptional,      //VARIANT* InsertLineBreaks
                vOptional,      //VARIANT* AllowSubstitutions
                vOptional,    //VARIANT* LineEnding
                vOptional      //VARIANT* AddBiDiMarks
                );

    return    TRUE;
}

BOOL CWordWriter::CloseDocument()
{
//    HRESULT hr;
    COleVariant vTrue((short)TRUE),    
                vFalse((short)FALSE),
                vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    m_wdDoc.Close(vFalse,    // SaveChanges.
             vTrue,            // OriginalFormat.
             vFalse            // RouteDocument.
             );
    m_wdDoc.AttachDispatch(m_wdApp.get_ActiveDocument());
/*    hr=m_wdDoc.m_lpDispatch->QueryInterface(IID_IDispatch,(LPVOID *)&m_wdApp);
    if(FAILED(hr)){    
        m_wdDoc.m_lpDispatch->Release();
        m_wdDoc.m_lpDispatch=NULL;
    }*/
    if (!m_wdDoc.m_lpDispatch)
    {
        AfxMessageBox(_T("Document获取失败!"), MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    InitVariabels();

    return TRUE;
}
BOOL CWordWriter::CloseDocument2()
{
    COleVariant vTrue((short)TRUE),    
                vFalse((short)FALSE),
                vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    if (!m_wdDoc.m_lpDispatch)
    {
        AfxMessageBox(_T("Document获取失败!"), MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    if(this->m_afterDocsCount==this->m_preDocsCount+1)
    {
    m_wdDoc.Close(vFalse,    // SaveChanges.
             vTrue,            // OriginalFormat.
             vFalse            // RouteDocument.
             );
    }
   /* m_wdDoc.AttachDispatch(m_wdApp.get_ActiveDocument());
    if (!m_wdDoc.m_lpDispatch)
    {
        AfxMessageBox("Document获取失败!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    InitVariabels();*/

    return TRUE;
}

void CWordWriter::CloseApp()
{
    COleVariant vTrue((short)TRUE),    
                vFalse((short)FALSE),
                vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
//    m_wdDoc.Save();


    /*m_wdApp.Quit(vFalse,    // SaveChanges.
             vTrue,            // OriginalFormat.
             vFalse            // RouteDocument.
             );*/
    //释放内存申请资源
    //m_wdInlineShape.ReleaseDispatch();
    //m_wdInlineShapes.ReleaseDispatch();
    //m_wdTb.ReleaseDispatch();
    m_wdfndInDoc.ReleaseDispatch();
    m_wdrpInDoc.ReleaseDispatch();
    m_wdCol.ReleaseDispatch();
    m_wdRow.ReleaseDispatch();
    m_wdCols.ReleaseDispatch();
    m_wdRows.ReleaseDispatch();
    m_wdStyle.ReleaseDispatch();

    m_wdCell.ReleaseDispatch();
    m_wdCells.ReleaseDispatch();
    m_wdTable.ReleaseDispatch();
    m_wdTableSingle.ReleaseDispatch();
    m_wdRange.ReleaseDispatch();
    m_wdSel.ReleaseDispatch();
    //m_wdFt.ReleaseDispatch();
    m_wdParagraphs.ReleaseDispatch();
    m_wdParagraph.ReleaseDispatch();
    m_wdFont0.ReleaseDispatch();

    m_wdDoc.ReleaseDispatch();
    m_wdDocs.ReleaseDispatch();

    if (m_bIsNewApp == TRUE&&m_wdApp.m_lpDispatch!=NULL)
    {

        m_wdApp.Quit(vFalse,    // SaveChanges.
            vTrue,            // OriginalFormat.
            vFalse            // RouteDocument.
            );
        m_wdApp.ReleaseDispatch();
    }
    else
    {
        m_wdApp.ReleaseDispatch();
    }
    //::CoUninitialize();
}

void CWordWriter::WriteText(const CString& szText)
{
    m_wdSel.TypeText(szText);
}

void CWordWriter::WriteNewLineText(const CString& szText, int nLineCount /**//* = 1 */)
{
    int i;
    if (nLineCount <= 0)
    {
        nLineCount = 0;
    }
    for (i = 0; i < nLineCount; i++)
    {
        m_wdSel.TypeParagraph();
    }
    WriteText(szText);
}

void CWordWriter::WriteEndLine(const CString& szText)
{
    m_wdRange.InsertAfter(szText);
}

void CWordWriter::WholeStory()
{
    m_wdRange.WholeStory();
}

void CWordWriter::Copy()
{
    m_wdRange.CopyAsPicture();
}

void CWordWriter::InsertFile(const CString& fileName)
{
    COleVariant     vFileName(fileName),
                 vTrue((short)TRUE),
                 vFalse((short)FALSE),
                 vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR),
                 vNull(_T(""));
    /**//*
    void InsertFile(LPCTSTR FileName, VARIANT* Range, VARIANT* ConfirmConversions, VARIANT* Link, VARIANT* Attachment);
    */
    m_wdSel.InsertFile(
                    fileName,
                    vNull,
                    vFalse,
                    vFalse,
                    vFalse
                    );
}

void CWordWriter::InsertShapes(const CString& fileName)
{
  /*  COleVariant vTrue((short)TRUE),    
                vFalse((short)FALSE),
                vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);*/
   // m_wdInlineShapes=m_wdSel.get__InlineShapes();
   // m_wdInlineShape=m_wdInlineShapes.AddPicture(fileName,vFalse,vTrue,vOptional);
}

/*void CWordWriter::InsertHyperlink(const CString& fileLink)
{
    COleVariant     vAddress(fileLink),vSubAddress(_T(""));
    CRange aRange = m_wdSel.get_Range();
    Hyperlinks vHyperlinks(aRange.get_Hyperlinks());

    vHyperlinks.Add(
                    aRange,            //Object,必需。转换为超链接的文本或图形。
                    vAddress,         //Variant 类型,可选。指定的链接的地址。此地址可以是电子邮件地址、Internet 地址或文件名。请注意,Microsoft Word 不检查该地址的正确性。
                    vSubAddress,     //Variant 类型,可选。目标文件内的位置名,如书签、已命名的区域或幻灯片编号。
                    vAddress,         //Variant 类型,可选。当鼠标指针放在指定的超链接上时显示的可用作“屏幕提示”的文本。默认值为 Address。
                    vAddress,         //Variant 类型,可选。指定的超链接的显示文本。此参数的值将取代由 Anchor 指定的文本或图形。
                    vSubAddress        //Variant 类型,可选。要在其中打开指定的超链接的框架或窗口的名字。
                    );
    vHyperlinks.ReleaseDispatch();
}*/

void CWordWriter::InsertTable(int nRow, int nCol)
{
    CRange aRng = m_wdSel.get_Range();

    COleVariant vTrue((short)TRUE),
                vFalse((short)FALSE),
                vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    CTable0  Tbl = m_wdTable.Add(aRng, nRow, nCol, vOptional, vOptional);
}

void CWordWriter::MoveUp(int nCount)
{
    COleVariant vUnit((short)5),
                vCount((short)nCount),
                vExtend((short)0);
    m_wdSel.MoveUp(vUnit, vCount, vExtend);
}

void CWordWriter::MoveDown(int nCount)
{
    COleVariant vUnit((short)5),
                vCount((short)nCount),
                vExtend((short)0);
    m_wdSel.MoveDown(vUnit, vCount, vExtend);
}

void CWordWriter::MoveDownSelection(int nCount)
{
    COleVariant vUnit((short)5),
                vCount((short)nCount),
                vExtend((short)1);
    m_wdSel.MoveDown(vUnit, vCount, vExtend);
}

void CWordWriter::MoveLeft(int nCount)
{
    COleVariant vUnit((short)1),
                vCount((short)nCount),
                vExtend((short)0);
    m_wdSel.MoveLeft(vUnit, vCount, vExtend);
}

void CWordWriter::MoveRight(int nCount)
{
    COleVariant vUnit((short)1),
                vCount((short)nCount),
                vExtend((short)0);
    m_wdSel.MoveRight(vUnit, vCount, vExtend);
}


LPDISPATCH CreateOleFont(CFont   *pFont)   
{   
    IDispatch*   pDispatch   =   NULL;   
    USES_CONVERSION;   
    if   (pFont)   
    {   
        LOGFONT   LogFont;   
        if   (pFont->GetLogFont(&LogFont))   
        {   
            LOGFONT*   pLogFont   =   &LogFont;   
            FONTDESC   fd;   
            fd.cbSizeofstruct   =   sizeof(FONTDESC);   
            fd.lpstrName   =   T2OLE(pLogFont->lfFaceName);   
            fd.sWeight   =   (short)pLogFont->lfWeight;   
            fd.sCharset   =   pLogFont->lfCharSet;   
            fd.fItalic   =   pLogFont->lfItalic;   
            fd.fUnderline   =   pLogFont->lfUnderline;   
            fd.fStrikethrough   =   pLogFont->lfStrikeOut;   
            
            long   lfHeight   =   pLogFont->lfHeight;   
            if   (lfHeight   <   0)   
                lfHeight   =   -lfHeight;   
            
            fd.cySize.Lo   =   lfHeight   *   720000   /   96;   
            fd.cySize.Hi   =   0;   
            
            if   (FAILED(::OleCreateFontIndirect(&fd,   IID_IFontDisp,   (void**)&pDispatch)))   
                pDispatch   =   NULL;   
        }   
    }   
    
    return   pDispatch;   
}
void CWordWriter::SetFont(LPCTSTR strName, float fSize, COLORREF cColor, BOOL bBold, BOOL bItalic, BOOL bUnderline)
{
    CFont0   aFont = m_wdSel.get_Font();
     ASSERT(LPDISPATCH(aFont));
     aFont.put_Name(strName);
     aFont.put_Size(fSize);
     aFont.put_Bold(bBold);
     aFont.put_Color(cColor);
     aFont.put_Underline(bUnderline);
//     aFont.SetSubscript();
//     aFont.SetSuperscript();
}

void CWordWriter::SetAlignment(int nAlignment)
{
    CParagraphFormat pf = m_wdSel.get_ParagraphFormat();
    pf.put_Alignment(nAlignment);
    m_wdSel.put_ParagraphFormat(pf);
}

void CWordWriter::SetOutlineLevel(int nLevel)
{
    CParagraphFormat pf = m_wdSel.get_ParagraphFormat();
    COleVariant   vStyle((long)nLevel);
    pf.put_Style(vStyle);
    m_wdSel.put_ParagraphFormat(pf);
}
void CWordWriter::GetSingleTable(long index)
{
//    m_wdTableSingle.ReleaseDispatch();
//    m_wdRows.ReleaseDispatch();
//    m_wdCols.ReleaseDispatch();
    //    COleVariant vDirecton((short)0);
//    m_wdSel.Collapse(vDirecton);
    LPDISPATCH tmpPatch=m_wdTable.Item(index);
    m_wdTableSingle.AttachDispatch(tmpPatch);

    m_wdRows.AttachDispatch(m_wdTableSingle.get_Rows());
    m_wdCols.AttachDispatch(m_wdTableSingle.get_Columns());
    m_wdTableSingle.Select();

}
long CWordWriter::GetSingleTableRowCount(void)
{
    return m_wdRows.get_Count();
}
long CWordWriter::GetSingleTableColCount(void)
{
    return m_wdCols.get_Count();
}
void CWordWriter::SetCell(long row,long column)     //得到表格某个单元格
{
    dispatch=m_wdTableSingle.Cell(row,column);//获取单元格
    m_wdCell.AttachDispatch(dispatch);
}
void CWordWriter::SetCellText(const CString& content)   
{
    dispatch=m_wdCell.get_Range();
    m_wdRange.AttachDispatch(dispatch);
    m_wdRange.put_Text(content);
}
void CWordWriter::ReplaceText1(const CString& originalWord,const CString& postWord)
{
    m_wdRange=m_wdDoc.get_Content();
    m_wdfndInDoc=m_wdRange.get_Find();
    m_wdfndInDoc.ClearFormatting();     
    m_wdrpInDoc=m_wdfndInDoc.get_Replacement();
    m_wdrpInDoc.ClearFormatting();
    COleVariant Text(originalWord); //被替换
    COleVariant MatchCase((short)TRUE);
    COleVariant MatchWholeWord((short)FALSE);
    COleVariant MatchWildcards((short)FALSE);
    COleVariant MatchSoundsLike((short)FALSE);
    COleVariant MatchAllWordForms((short)FALSE);
    COleVariant Forward((short)TRUE);
    COleVariant Wrap((short)1);//用msgbox(wdFindContinue)得到
    COleVariant format((short)FALSE);
    COleVariant ReplaceWith=(postWord);//替换
    COleVariant Replace((short)2);//用msgbox(wdReplaceAll)得到
    COleVariant MatchKashida=((short)FALSE); //以下四个参数默认false
    COleVariant MatchDiacritics=((short)FALSE);
    COleVariant MatchAlefHamza=((short)FALSE);
    COleVariant MatchControl=((short)FALSE);
    
    m_wdfndInDoc.Execute(&Text, &MatchCase, &MatchWholeWord, &MatchWildcards,
        &MatchSoundsLike, &MatchAllWordForms, &Forward, &Wrap,
        &format, &ReplaceWith, &Replace, &MatchKashida,
        &MatchDiacritics, &MatchAlefHamza, &MatchControl);
}
void CWordWriter::ReplaceText2(const CString& originalWord,const CString& postWord)
{
    m_wdRange=m_wdDoc.get_Content();
    m_wdfndInDoc=m_wdRange.get_Find();
    m_wdfndInDoc.ClearFormatting();     
    m_wdrpInDoc=m_wdfndInDoc.get_Replacement();
    m_wdrpInDoc.ClearFormatting();
    COleVariant Text(originalWord); //被替换
    COleVariant MatchCase((short)TRUE);
    COleVariant MatchWholeWord((short)TRUE);// 不一样,必须匹配所有字符
    COleVariant MatchWildcards((short)FALSE);
    COleVariant MatchSoundsLike((short)FALSE);
    COleVariant MatchAllWordForms((short)FALSE);
    COleVariant Forward((short)TRUE);
    COleVariant Wrap((short)1);//用msgbox(wdFindContinue)得到
    COleVariant format((short)FALSE);
    COleVariant ReplaceWith=(postWord);//替换
    COleVariant Replace((short)2);//用msgbox(wdReplaceAll)得到
    COleVariant MatchKashida=((short)FALSE); //以下四个参数默认false
    COleVariant MatchDiacritics=((short)FALSE);
    COleVariant MatchAlefHamza=((short)FALSE);
    COleVariant MatchControl=((short)FALSE);
    
    m_wdfndInDoc.Execute(&Text, &MatchCase, &MatchWholeWord, &MatchWildcards,
        &MatchSoundsLike, &MatchAllWordForms, &Forward, &Wrap,
        &format, &ReplaceWith, &Replace, &MatchKashida,
        &MatchDiacritics, &MatchAlefHamza, &MatchControl);
}
BOOL CWordWriter::FindKeyWordText(const CString& KeyWord)
{
    //在整个文档内查找

    //m_wdSel=m_wdApp.get_Selection();
    m_wdfndInDoc=m_wdSel.get_Find();

    COleVariant Text(KeyWord); //被替换-
    COleVariant MatchCase((short)FALSE); //-
    COleVariant MatchWholeWord((short)TRUE); //-
    COleVariant MatchWildcards((short)FALSE); //-
    COleVariant MatchSoundsLike((short)FALSE); //-
    COleVariant MatchAllWordForms((short)FALSE);//-
    COleVariant Forward((short)TRUE); //-
    COleVariant Wrap((short)1);//-
    COleVariant format((short)FALSE); //-
    COleVariant ReplaceWith=(L"");//替换
    COleVariant Replace((short)0);//用msgbox(wdReplaceAll)得到
    COleVariant MatchKashida=((short)FALSE); //以下四个参数默认false
    COleVariant MatchDiacritics=((short)FALSE);
    COleVariant MatchAlefHamza=((short)FALSE);
    COleVariant MatchControl=((short)FALSE);
    return m_wdfndInDoc.Execute(&Text, &MatchCase, &MatchWholeWord, &MatchWildcards,
        &MatchSoundsLike, &MatchAllWordForms, &Forward, &Wrap,
        &format, &ReplaceWith, &Replace, &MatchKashida,
        &MatchDiacritics, &MatchAlefHamza, &MatchControl);

}
BOOL CWordWriter::FindKeyWordText2(const CString& KeyWord)
{
    //在所选区域内查找
//    m_wdSel=m_wdApp.get_Selection();
    m_wdfndInDoc=m_wdSel.get_Find();

    COleVariant Text(KeyWord); //被替换-
    COleVariant MatchCase((short)FALSE); //-
    COleVariant MatchWholeWord((short)TRUE); //-
    COleVariant MatchWildcards((short)FALSE); //-
    COleVariant MatchSoundsLike((short)FALSE); //-
    COleVariant MatchAllWordForms((short)FALSE);//-
    COleVariant Forward((short)TRUE); //-
    COleVariant Wrap((short)0);//-
    COleVariant format((short)FALSE); //-
    COleVariant ReplaceWith=(L"");//替换
    COleVariant Replace((short)0);//用msgbox(wdReplaceAll)得到
    COleVariant MatchKashida=((short)FALSE); //以下四个参数默认false
    COleVariant MatchDiacritics=((short)FALSE);
    COleVariant MatchAlefHamza=((short)FALSE);
    COleVariant MatchControl=((short)FALSE);
    return m_wdfndInDoc.Execute(&Text, &MatchCase, &MatchWholeWord, &MatchWildcards,
        &MatchSoundsLike, &MatchAllWordForms, &Forward, &Wrap,
        &format, &ReplaceWith, &Replace, &MatchKashida,
        &MatchDiacritics, &MatchAlefHamza, &MatchControl);

}
//定位到第几页的第几行,0为第一行,1为第二行
void CWordWriter::SetPageRow(const CString& Pageindex,long rowIndex)
{
    COleVariant PageWhat((short)1),
        PageWhich((short)1),PageCount((short)1),PageName(Pageindex);
    COleVariant LineWhat((short)3),
        LineWhich((short)2),LineCount((long)rowIndex),LineName(L"");
    COleVariant Unit((short)5),
        Count((short)1),Extend((short)1);
    m_wdSel.GoTo(PageWhat,PageWhich,PageCount,PageName);
    if(rowIndex!=0)
    {
        m_wdSel.GoTo(LineWhat,LineWhich,LineCount,LineName);
    }
}
//range定位到第几页的第几行,0为第一行,1为第二行
/*void CWordWriter::SetRangePageRow(const CString& Pageindex,long rowIndex)
{
    COleVariant PageWhat((short)1),
        PageWhich((short)1),PageCount((short)1),PageName(Pageindex);
    COleVariant LineWhat((short)3),
        LineWhich((short)2),LineCount((long)rowIndex),LineName(L"");
    COleVariant Unit((short)5),
        Count((short)1),Extend((short)1);
    this->m_wdRange.GoTo(PageWhat,PageWhich,PageCount,PageName);
    if(rowIndex!=0)
    {
        m_wdRange.GoTo(LineWhat,LineWhich,LineCount,LineName);
    }
}*/
CString CWordWriter::GetJSInfo(void)
{
    COleVariant Unit((short)1),Count((short)2),Extend((short)0);
    m_wdSel.MoveRight(Unit,Count,Extend);
    COleVariant Unit2((short)5),Extend2((short)1);
    m_wdSel.EndKey(Unit2,Extend2);

    CString strXMMC=m_wdSel.get_Text();
    
    return strXMMC;
}
long CWordWriter::GetSeletionStartRowNum(void)
{
    COleVariant oldVar = m_wdSel.get_Information(wdStartOfRangeRowNumber);
    long oldVarInt=oldVar.lVal;
    return oldVarInt;
}
long CWordWriter::GetSeletionStartColNum(void)
{
    COleVariant oldVar = m_wdSel.get_Information(wdStartOfRangeColumnNumber);
    long oldVarInt=oldVar.lVal;

    return oldVarInt;
}
long CWordWriter::GetSeletionTableNum(void)
{
    m_wdTable=m_wdSel.get_Tables();
    
    return m_wdTable.get_Count();

}
void CWordWriter::GetSeletionTables(void)
{
    m_wdTable=m_wdSel.get_Tables();
}
CString CWordWriter::GetCellText(void)   
{
    dispatch=m_wdCell.get_Range();
    m_wdRange.AttachDispatch(dispatch);
    return m_wdRange.get_Text();
}
void CWordWriter::SelectAllContent(void)
{
    m_wdSel = m_wdApp.get_Selection();
m_wdSel.WholeStory();
}

void CWordWriter::selectDocument()
{
    m_wdDoc.Select();
}

void CWordWriter::selectPage(int)
{

}

void CWordWriter::copySelection()
{
m_wdSel.Copy();
}

void CWordWriter::paste()
{
m_wdSel.Paste();
}

void CWordWriter::selectionCollapse()
{
    COleVariant wdCollapseEnd((short)0);
    m_wdSel.Collapse(wdCollapseEnd);
}

void CWordWriter::insertBreak()
{
COleVariant wdColumnBreak((short)8);
m_wdSel.InsertBreak(wdColumnBreak);
}
// 得到当前word文档中段落的总数
void  CWordWriter::GetParagraphs(void)
{
    m_wdParagraphs=m_wdDoc.get_Paragraphs();
}
void  CWordWriter::GetParagraph(long index)
{
    m_wdParagraph=m_wdParagraphs.Item(index);
    //m_wdParagraphs=m_wdDoc.get_Paragraphs();
}
long CWordWriter::GetDocParagraphsCount(void)
{
    return m_wdParagraphs.get_Count();
}
void  CWordWriter::GetParagraphStyle(void)
{
    //m_wdStyle=m_wdParagraph.get_st
    //m_wdParagraph=m_wdParagraphs.Item(index);
    //m_wdParagraphs=m_wdDoc.get_Paragraphs();
}
#define wdParagraph 4

void  CWordWriter::GetParagraphSelectionAndRange(void)
{
    //CRange m_wdRange2=m_wdParagraph.get_Range();
    m_wdRange=m_wdParagraph.get_Range();
    m_wdRange.Select();

    m_wdSel = m_wdApp.get_Selection();
/*    CParagraphs m_wdParagraphs2=m_wdSel.get_Paragraphs();
    long pCount=m_wdParagraphs2.get_Count();
    if(pCount>1)
    {
    //COleVariant wdParagraphVar((long)wdParagraph);
    //COleVariant wdCountVar((long)1);
    //    m_wdRange.Next(wdParagraphVar,wdCountVar);
    //m_wdRange.Select();
        m_wdParagraph=m_wdParagraphs2.Item(2);
        m_wdRange=m_wdParagraph.get_Range();
    COleVariant wdParagraphVar((long)wdParagraph);
    COleVariant wdCountVar((long)2);
        m_wdRange.Previous(wdParagraphVar,wdCountVar);
    m_wdRange.Select();
    //    m_wdParagraph=m_wdParagraphs2.Item(1);
    //    m_wdRange=m_wdParagraph.get_Range();
    //m_wdRange.Select();
    }
    else{
        m_wdRange.Select();
    }
    //m_wdParagraphs2=m_wdRange.get_Paragraphs();
    //long pCount2=m_wdParagraphs2.get_Count();
    m_wdSel = m_wdApp.get_Selection();*/
    //m_wdStyle=m_wdParagraph.get_st
    //m_wdParagraph=m_wdParagraphs.Item(index);
    //m_wdParagraphs=m_wdDoc.get_Paragraphs();
}
void  CWordWriter::GetParagraphFont(void)
{
    m_wdFont0=m_wdSel.get_Font();
    //m_wdParagraph=m_wdParagraphs.Item(index);
    //m_wdParagraphs=m_wdDoc.get_Paragraphs();
}
void  CWordWriter::GetParagraphFirstCharRange(void)
{

    //m_wdFirstRange
    m_wdChars=m_wdRange.get_Characters();
    m_wdFirstRange=m_wdChars.get_First();
   // CRange     m_wdLastRange;
    
    //m_wdFont0=m_wdSel.get_Font();
    //m_wdParagraph=m_wdParagraphs.Item(index);
    //m_wdParagraphs=m_wdDoc.get_Paragraphs();
}
void  CWordWriter::GetParagraphLastCharRange(void)
{
    m_wdChars=m_wdRange.get_Characters();
    m_wdLastRange=m_wdChars.get_Last();
    // CRange     m_wdLastRange;
    //m_wdFont0=m_wdSel.get_Font();
    //m_wdParagraph=m_wdParagraphs.Item(index);
    //m_wdParagraphs=m_wdDoc.get_Paragraphs();
}
#define wdWindowDocument 0
#define wdPrintView 3
#define wdMainTextStory  1
#define wdTextRectangle 0
//http://msdn.microsoft.com/en-us/library/Aa211923 常量定义
long  CWordWriter::GetLineCountOfAPage(long pageIndex)
{
    long lineCount=-1;
    /*    CString PageIndexStr=L"";
    PageIndexStr.Format(L"%ld",pageIndex);
    SetPageRow(PageIndexStr,0);
    for(int i=1;i<1000;i++)
    {
    MoveDown(1);
    COleVariant PageNumber_Var =m_wdSel.get_Information(wdActiveEndPageNumber);
    long PageNumber_Int=PageNumber_Var.lVal;
    if(PageNumber_Int>pageIndex)
    {
    return i;
    }
    }
    return 0;*/

    try{
        CString PageStr=L"";
        PageStr.Format(L"%ld",pageIndex);
        this->SetPageRow(PageStr,0);
        m_wdPage=m_wdPages.Item(pageIndex);

        m_wdRectangles=m_wdPage.get_Rectangles();
        long RectanglesCount=m_wdRectangles.get_Count();
        for(int j=1;j<=RectanglesCount;j++)
        {
            m_wdRectangle=m_wdRectangles.Item(j);
            if(m_wdRectangle.get_RectangleType()==wdTextRectangle)
            {
                m_wdLines=m_wdRectangle.get_Lines();
                lineCount=m_wdLines.get_Count();
            }
        }
    }catch (COleDispatchException* e)
    {
        unsigned short code=e->m_wCode;
        //m_scError = -2146822347
        CString str1;
        str1.Format(L"%s ---%s---%x",e->m_strDescription,e->m_strSource,e->m_scError);
        ::AfxMessageBox(str1);
        e->ReportError();
        e->Delete();
        return -1;
    }

    return lineCount;
}
void  CWordWriter::GetShapeRange(void)
{
    CRange tmpRange1;
    tmpRange1=this->m_wdParagraph.get_Range();
    m_wdShapeRange=tmpRange1.get_ShapeRange();
}
void  CWordWriter::GetPages(void)
{
m_wdDoc.Activate();
//m_wdDoc.Repaginate();
m_wdWindow0 = m_wdDoc.get_ActiveWindow();
m_wdPane = m_wdWindow0.get_ActivePane();
m_wdPages = m_wdPane.get_Pages();
/*    m_wdDoc.Repaginate();
    m_wdWindow0=m_wdDoc.get_ActiveWindow();
    //long WindowsCount=m_wdWindows.get_Count();

    //for(int i=1;i<=WindowsCount;i++)
    //{
        //COleVariant index((long)i);
        //m_wdWindow0=m_wdWindows.Item(index);
        if(m_wdWindow0.get_Type()==wdWindowDocument)
        {
            m_wdPane=m_wdWindow0.get_ActivePane();
            m_wdView0=m_wdWindow0.get_View();
            m_wdView0.put_Type(wdPrintView);
            //long PanesCount=m_wdPanes.get_Count();
            //if(PanesCount>=1)
            //{
                //m_wdPane=m_wdPanes.Item(1);
                //m_wdView0=m_wdPane.get_View();
                //m_wdView0.put_Type(wdPrintView);
                //m_wdPane.Activate();
                m_wdPages=m_wdPane.get_Pages();
            //}
        }
    //}*/

}
void  CWordWriter::GetSelection(void)
{
    m_wdSel = m_wdApp.get_Selection();
}
void  CWordWriter::GetParagraphRangeBorders(void)
{
    m_wdparagraphBorders=m_wdFont0.get_Borders();
    //m_wdparagraphBorders=m_wdRange.get_Borders();

}

void  CWordWriter::GetParagraphFormat(void)
{
    m_wdParagraphFormat=m_wdParagraph.get_Format();
}
long  CWordWriter::GetPageCount(void)
{

    COleVariant oldVar = m_wdSel.get_Information(4);
    long oldVarInt=oldVar.lVal;
    return oldVarInt;
}
void CWordWriter::VerifyParagraphStyle(void)
{


}

WordWriter.h头文件是:

// WordOffice.h: interface for the CWordWriter class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_WORDOFFICE_H__46EADF82_81AD_40D1_B795_D41ECD403863__INCLUDED_)
#define AFX_WORDOFFICE_H__46EADF82_81AD_40D1_B795_D41ECD403863__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

//#include "atlbase.h"
#include "..\CApplication.h"
#include "..\CColumn.h"
#include "..\CColumns0.h"
#include "..\CCell.h"
#include "..\CCells.h"
#include "..\CDocuments.h"
#include "..\CDocument0.h"
#include "..\CFind.h"
#include "..\CFont0.h"
#include "..\CRange.h"
#include "..\CParagraph.h"
#include "..\CParagraphs.h"
#include "..\CParagraphFormat.h"
#include "..\CReplacement.h"
#include "..\CRow.h"
#include "..\CRows.h"
#include "..\CSelection.h"
#include "..\CStyle.h"
#include "..\CStyles.h"
#include "..\CTable0.h"
#include "..\CTables0.h"
#include "..\CCharacters.h"
#include "..\CBorders.h"

#include "..\CWindows.h"
#include "..\CWindow0.h"
#include "..\CView0.h"
#include "..\CPanes.h"
#include "..\CPane.h"
#include "..\CPages.h"
#include "..\CPage.h"
#include "..\CLines.h"
#include "..\CRectangles.h"
#include "..\CRectangle.h"
#include "..\CShape.h"
#include "..\CShapeRange.h"
#include "..\CTextFrame.h"
#include "..\CShapes.h"
#include "..\CGroupShapes.h"
//using namespace Wordnamespace;//引用自己定义的命名空间
//#include "cstringt.h"

#include "d:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\afxstr.h"
//using namespace Wordnamespace;//引用自己定义的命名空间

class CWordWriter
{
public:
    CParagraphs m_wdParagraphs;
    CParagraph  m_wdParagraph;
    CStyle      m_wdStyle;
    CFont0      m_wdFont0;
    CSelection m_wdSel;
    CRange     m_wdRange;
    CRange     m_wdFirstRange;
    CRange     m_wdLastRange;

    CCharacters  m_wdChars;
    CParagraphFormat  m_wdParagraphFormat;
    CBorders   m_wdparagraphBorders;


    CWindows   m_wdWindows;
    CWindow0   m_wdWindow0;
    CView0     m_wdView0;
    CPanes     m_wdPanes;
    CPane      m_wdPane;
    CPages     m_wdPages;
    CApplication m_wdApp;
    CDocuments m_wdDocs;
    CDocument0 m_wdDoc;

    CPage      m_wdPage;
    CLines     m_wdLines;
    CRectangles  m_wdRectangles;
    CRectangle   m_wdRectangle;
    CRange     m_wdTmpRange;
    CShape     m_wdShape;
    CShapeRange m_wdShapeRange;
private:

    CReplacement m_wdrpInDoc;
    CFind m_wdfndInDoc;
    
    CTables0    m_wdTable;
    CTable0     m_wdTableSingle;
    CCell      m_wdCell;
    CCells     m_wdCells;
    CColumns0   m_wdCols;
    CRows      m_wdRows;
    CColumn    m_wdCol;
    CRow       m_wdRow;
//    CStyle     m_wdStyle;
    IDispatch *dispatch;

    //InlineShapes m_wdInlineShapes;
    //InlineShape m_wdInlineShape;

    BOOL        m_bIsNewApp;
    long        m_preDocsCount;
    long        m_afterDocsCount;
public:
    CWordWriter();
    virtual ~CWordWriter();

public:
    void MoveDownSelection(int nCount);
    void insertBreak(void);
    void selectionCollapse(void);
    void paste(void);
    void copySelection(void);
    void selectPage(int);
    void selectDocument(void);
    //操作
    //**********************创建新文档*******************************************
    BOOL CreateApp();                    //创建一个新的WORD应用程序
    BOOL CreateDocuments();                //创建一个新的Word文档集合
    BOOL CreateDocument();                //创建一个新的Word文档
    BOOL CreateDocument(const CString& modelFile);//dsfsdf
    BOOL Create();                        //创建新的WORD应用程序并创建一个新的文档
    void ShowApp();                        //显示WORD文档
    void HideApp();                        //隐藏word文档

    void GetSingleTable(long index);        //得到一个表格
    long GetSingleTableRowCount(void);
    long GetSingleTableColCount(void);
    void SetCell(long row,long column);     //得到表格某个单元格
    void SetCellText(const CString& content);

    void ReplaceText1(const CString& originalWord,const CString& postWord);
    void ReplaceText2(const CString& originalWord,const CString& postWord);
    BOOL FindKeyWordText(const CString& KeyWord);
    BOOL FindKeyWordText2(const CString& KeyWord);
    void SetPageRow(const CString& Pageindex,long rowIndex);//定位到第几页的第几行,0为第一行
    CString GetJSInfo(void);
    long GetSeletionStartRowNum(void);
    long GetSeletionStartColNum(void);
    long GetSeletionTableNum(void);
    CString GetCellText(void);  
    void SelectAllContent(void);
    void GetSeletionTables(void);
    //**********************打开文档*********************************************
    BOOL OpenDocument(const CString& fileName);//打开已经存在的文档。
    BOOL Open(const CString& fileName);        //创建新的WORD应用程序并打开一个已经存在的文档。
    BOOL SetActiveDocument(short i);    //设置当前激活的文档。

    //**********************保存文档*********************************************
    BOOL SaveDocument();                //文档是以打开形式,保存。
    BOOL SaveDocumentAs(const CString& fileName);//文档以创建形式,保存。
    BOOL CloseDocument();
    BOOL CloseDocument2();
    void CloseApp();

    //**********************文本书写操作*****************************************
    void WriteText(const CString& szText);        //当前光标处写文本
    void WriteNewLineText(const CString& szText, int nLineCount = 1); //换N行写字
    void WriteEndLine(const CString& szText);    //文档结尾处写文本
    void WholeStory();                    //全选文档内容
    void Copy();                        //复制文本内容到剪贴板
    void InsertFile(const CString& fileName);    //将本地的文件全部内容写入到当前文档的光标处。
    
    //**********************图片插入操作*****************************************
    void InsertShapes(const CString& fileName);//在当前光标的位置插入图片
    
    //**********************超链接插入操作*****************************************
    void InsertHyperlink(const CString& fileLink);//超级链接地址,可以是相对路径。

    //**********************表格插入操作*****************************************
    void InsertTable(int nRow, int nCol);    // 在当前位置插入一个大小为nRow*nCol的表格

    //**********************光标移动操作*****************************************
    void MoveUp(int nCount);
    void MoveDown(int nCount);
    void MoveLeft(int nCount);
    void MoveRight(int nCount);

    //**********************格式操作*********************************************
    void SetFont(LPCTSTR strName, float fSize, COLORREF cColor, BOOL bBold, BOOL bItalic, BOOL bUnderline);
    void SetAlignment(int nAlignment);
    void SetOutlineLevel(int nLevel);
    
    enum    {
        Align_Left,
        Align_Center,
        Align_Right
    };
    
    enum {
        Outline_Level1 = -2,
        Outline_Level2 = -3,
        Outline_Level3 = -4,
        Outline_Level4 = -5,
        Outline_Level5 = -6,
        Outline_Level6 = -7,
        Outline_Level7 = -8,
        Outline_Level8 = -9,
        Outline_Level9 = -10,
        Outline_Text = -67
    };

private:
    BOOL InitVariabels();
public:

    void GetParagraphs(void);
    // 得到当前word文档中段落的总数
    long GetDocParagraphsCount(void);
    void GetParagraph(long index);
    void VerifyParagraphStyle(void);
    void GetParagraphStyle(void);
    void GetParagraphFont(void);
    void GetParagraphSelectionAndRange(void);
    void GetParagraphFirstCharRange(void);
    void GetParagraphLastCharRange(void);
    void GetParagraphFormat(void);
    void GetParagraphSingleCharRange(int index);

    void GetParagraphRangeBorders(void);
    long GetPageCount(void);
    long GetLineCountOfAPage(long pageIndex);
    void GetPages(void);
    void GetSelection(void);
    void GetShapeRange(void);
};

#endif // !defined(AFX_WORDOFFICE_H__46EADF82_81AD_40D1_B795_D41ECD403863__INCLUDED_)

验证程序的主文件:

// FormView_JSBVerify.cpp : 实现文件
//

#include "stdafx.h"
#include "JSBVerification.h"
#include "FormView_JSBVerify.h"
#include "Shlwapi.h"
#pragma   comment(lib,"shlwapi.lib")

// CFormView_JSBVerify

IMPLEMENT_DYNCREATE(CFormView_JSBVerify, CFormView)

CFormView_JSBVerify::CFormView_JSBVerify()
    : CFormView(CFormView_JSBVerify::IDD)
{
    m_pDialogProgress=new CDialog_JSB_Progress(this);
}

CFormView_JSBVerify::~CFormView_JSBVerify()
{
    delete m_pDialogProgress;
    m_pDialogProgress=NULL;
}

void CFormView_JSBVerify::DoDataExchange(CDataExchange* pDX)
{
    CFormView::DoDataExchange(pDX);
    DDX_FileEditCtrl(pDX, IDC_EDIT_JSBS_File, m_fileeditctrl, FEC_FILE);
    DDX_Control(pDX, IDC_EDIT_Verify_Output, m_Cedit_Output);
}

BEGIN_MESSAGE_MAP(CFormView_JSBVerify, CFormView)
    ON_BN_CLICKED(IDOK, &CFormView_JSBVerify::OnBnClickedOk)
    ON_MESSAGE(WM_USER_THREAD_FINISHED, OnThreadFinished)
END_MESSAGE_MAP()


// CFormView_JSBVerify 诊断

#ifdef _DEBUG
void CFormView_JSBVerify::AssertValid() const
{
    CFormView::AssertValid();
}

#ifndef _WIN32_WCE
void CFormView_JSBVerify::Dump(CDumpContext& dc) const
{
    CFormView::Dump(dc);
}
#endif
#endif //_DEBUG

UINT CFormView_JSBVerify::MyThreadFunc(LPVOID lParam)
{
    //THREADINFOSTRUCT* tis=(THREADINFOSTRUCT *)lParam;
    return ((CFormView_JSBVerify *)lParam)->ThreadGo();
}
UINT CFormView_JSBVerify::ThreadGo()
{
    m_pDialogProgress->m_hEventModelDlgCreated=CreateEvent(NULL,TRUE,TRUE,_T("ModalDlgCreated")); // 此事件初始状态为FALSE,必须手动复位
    ResetEvent(m_pDialogProgress->m_hEventModelDlgCreated);
    m_hThread2 = AfxBeginThread(CFormView_JSBVerify::MyThreadFunc2,this,
        THREAD_PRIORITY_NORMAL,0,0);
    ASSERT(m_hThread2);
    m_pDialogProgress->DoModal();
    return 0;
}
UINT CFormView_JSBVerify::MyThreadFunc2(LPVOID lParam)
{
    //THREADINFOSTRUCT* tis=(THREADINFOSTRUCT *)lParam;
    return ((CFormView_JSBVerify *)lParam)->ThreadGo2();
}
//运行时选择的word文档的 vba界面不能打开,否则报错
UINT CFormView_JSBVerify::ThreadGo2()
{
    //m_strGCXMJJNR=L"";
    ::CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
    unsigned long ret=WaitForSingleObject(m_pDialogProgress->m_hEventModelDlgCreated, 5000);
    //::CoInitialize(NULL);
    //::CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
    CString JSBWordFile=L"",filenameFull=L"";
    m_fileeditctrl.GetWindowText(JSBWordFile);
    if(!PathFileExists(JSBWordFile))
    {
        ::AfxMessageBox(L"文件不存在,请重新选择!");//,MB_APPLMODAL
        CloseHandle(m_pDialogProgress->m_hEventModelDlgCreated);
        return 0;
    }
    if (WAIT_OBJECT_0==ret) // 阻塞当前线程,等待m_hEventModelDlgCreated标识在CDlgModal::OnInitDialog()中被置位,超时为2000毫秒(视情况而定,机器负荷不重的时候2秒足够了)。WaitForSingleObject函数返回WAIT_OBJECT_0表示在规定时间(2000毫秒)内该标识被置位。其它返回值请参阅MSDN
    {
        if(FALSE==m_WordWriter.Open(JSBWordFile))
        {
            m_WordWriter.CloseDocument2();
            m_WordWriter.CloseApp();
            return 0;
        }
        //m_WordWriter.ShowApp();
        m_WordWriter.GetParagraphs();
        long paragraphCount=m_WordWriter.GetDocParagraphsCount();
        CString AllOutputStr=L"";
        for(long i=1;i<=paragraphCount;i++)
        {
            //m_WordWriter.m_wdParagraphs.Item(1);
            if(m_pDialogProgress->m_ExitWorkThread==true)
            {
                ::PostMessage(m_pDialogProgress->m_hWnd,WM_USER_THREAD_FINISHED,0,0);
                m_WordWriter.CloseDocument2();
                m_WordWriter.CloseApp();
                CloseHandle(m_pDialogProgress->m_hEventModelDlgCreated);
                ::CoUninitialize();
            m_Cedit_Output.SetWindowTextW(AllOutputStr);
                return -1;
            }
            m_WordWriter.GetParagraph(i);

            m_WordWriter.GetParagraphSelectionAndRange();
            m_WordWriter.GetParagraphFont();
            CString FontName=m_WordWriter.m_wdFont0.get_Name();
            float FontSize=m_WordWriter.m_wdFont0.get_Size();
            CString OutputStr0=L"";
            CString OutputStr2=L"";
            bool MismatchFlag=false;//不匹配标志
            if(FontName!=L"宋体")
            {
                OutputStr2=L"字体不匹配,";
                MismatchFlag=true;
            }
            if(!(FontSize<14.000001 &&FontSize>13.999999))
            {
                OutputStr2+=L"字号不匹配,";
                MismatchFlag=true;
            }

            long FontEmboss=m_WordWriter.m_wdFont0.get_Emboss();//阳文2
            if(FontEmboss!=0)
            {
                OutputStr2+=L"阳文不匹配,";
                MismatchFlag=true;
            }
            long FontEngrave=m_WordWriter.m_wdFont0.get_Engrave();//阴文3
            if(FontEngrave!=0)
            {
                OutputStr2+=L"阴文不匹配,";
                MismatchFlag=true;
            }
            long FontOutline=m_WordWriter.m_wdFont0.get_Outline();//镂空4
            if(FontOutline!=0)
            {
                OutputStr2+=L"镂空不匹配,";
                MismatchFlag=true;
            }
            long FontScaling=m_WordWriter.m_wdFont0.get_Scaling();//字符比例5
            if(FontScaling!=100)
            {
                OutputStr2+=L"字符比例不匹配,";
                MismatchFlag=true;
            }
            long FontShadow=m_WordWriter.m_wdFont0.get_Shadow();//阴影6
            if(FontShadow!=0)
            {
                OutputStr2+=L"阴影不匹配,";
                MismatchFlag=true;
            }
            long FontStrikeThrough=m_WordWriter.m_wdFont0.get_StrikeThrough();//删除线7
            if(FontStrikeThrough!=0)
            {
                OutputStr2+=L"删除线不匹配,";
                MismatchFlag=true;
            }
            long FontDoubleStrikeThrough=m_WordWriter.m_wdFont0.get_DoubleStrikeThrough();//双删除线8
            if(FontDoubleStrikeThrough!=0)
            {
                OutputStr2+=L"双删除线不匹配,";
                MismatchFlag=true;
            }
            long FontSubscript=m_WordWriter.m_wdFont0.get_Subscript();//下标9
            if(FontSubscript!=0)
            {
                OutputStr2+=L"下标不匹配,";
                MismatchFlag=true;
            }
            long FontSuperscript=m_WordWriter.m_wdFont0.get_Superscript();//上标10
            if(FontSuperscript!=0)
            {
                OutputStr2+=L"上标不匹配,";
                MismatchFlag=true;
            }
            long FontHidden=m_WordWriter.m_wdFont0.get_Hidden();//隐藏11
            if(FontHidden!=0)
            {
                OutputStr2+=L"隐藏不匹配,";
                MismatchFlag=true;
            }
            long FontColor=m_WordWriter.m_wdFont0.get_ColorIndex();//隐藏11
//TRACE("%ld----%ld",i,FontColor);
            if(FontColor!=wdAuto&&FontColor!=wdBlack)
            {
                OutputStr2+=L"字体颜色不匹配,";
                MismatchFlag=true;
            }
            long FontHiliteColor=m_WordWriter.m_wdRange.get_HighlightColorIndex();//高亮
//TRACE("%ld----%ld",i,FontHiliteColor);
            if(FontHiliteColor!=0)
            {
                OutputStr2+=L"高亮显示不匹配,";
                MismatchFlag=true;
            }
            float FontSpacing=m_WordWriter.m_wdFont0.get_Spacing();//字间距
//TRACE("%ld----%f\n",i,FontSpacing);
            if(FontSpacing!=0)
            {
                OutputStr2+=L"字间距不匹配,";
                MismatchFlag=true;
            }
            long FontPosition=m_WordWriter.m_wdFont0.get_Position();//相对于基准线的文本位置(以磅为单位)。
            //TRACE("%ld----%ld\n",i,FontPosition);
            if(FontPosition!=0)
            {
                OutputStr2+=L"文本位置不匹配,";
                MismatchFlag=true;
            }
            long FontDisableCharacterSpaceGrid=m_WordWriter.m_wdFont0.get_DisableCharacterSpaceGrid();//
            //TRACE("%ld----%ld\n",i,FontPosition);
            if(FontDisableCharacterSpaceGrid!=FALSE)
            {
                OutputStr2+=L"网格对齐不匹配,";
                MismatchFlag=true;
            }
            long FontAnimation=m_WordWriter.m_wdFont0.get_Animation();//
            //TRACE("%ld----%ld\n",i,FontPosition);
            if(FontAnimation!=0)
            {
                OutputStr2+=L"动画不匹配,";
                MismatchFlag=true;
            }
            float FontKerning=m_WordWriter.m_wdFont0.get_Kerning();//
            //TRACE("%ld----%ld\n",i,FontPosition);
            if(!(FontKerning>=0.999999&&FontKerning<=1.000001))
            {
                OutputStr2+=L"调整字间距不匹配,";
                MismatchFlag=true;
            }
            if(m_WordWriter.m_wdRange.get_Bold()!=0)
            {
                OutputStr2+=L"加粗不匹配,";
                MismatchFlag=true;
            }
            if(m_WordWriter.m_wdRange.get_Underline()!=0)
            {
                OutputStr2+=L"下划线不匹配,";
                MismatchFlag=true;
            }
            if(m_WordWriter.m_wdRange.get_Italic()!=0)
            {
                OutputStr2+=L"斜体不匹配,";
                MismatchFlag=true;
            }

            if(m_WordWriter.m_wdRange.get_EmphasisMark()!=0)
            {
                OutputStr2+=L"着重号不匹配,";
                MismatchFlag=true;
            }
            m_WordWriter.GetParagraphRangeBorders();
            if(m_WordWriter.m_wdparagraphBorders.get_Enable()!=0)
            {
                OutputStr2+=L"边框不匹配,";
                MismatchFlag=true;
            }
            m_WordWriter.GetParagraphFormat();
            float paragraphLineSpacing=m_WordWriter.m_wdParagraphFormat.get_LineSpacing();
            float paragraphSpaceAfter=m_WordWriter.m_wdParagraphFormat.get_SpaceAfter();
            float paragraphSpaceBefore=m_WordWriter.m_wdParagraphFormat.get_SpaceBefore();
            if(!(paragraphLineSpacing<18.0001&&paragraphLineSpacing>17.9999))
            {
                OutputStr2+=L"段间距不匹配,";
                MismatchFlag=true;
            }
            if(!(paragraphSpaceBefore<0.0001&&paragraphSpaceBefore>-0.0001))
            {
                OutputStr2+=L"段前间距不匹配,";
                MismatchFlag=true;
            }
            if(!(paragraphSpaceAfter<0.0001&&paragraphSpaceAfter>-0.0001))
            {
                OutputStr2+=L"段后间距不匹配,";
                MismatchFlag=true;
            }
            //TRACE("%d----%f----%f---\n",i,paragraphSpaceAfter,paragraphSpaceBefore);
            if(MismatchFlag==true)
            {
                m_WordWriter.GetParagraphFirstCharRange();
                COleVariant FirstCharPageNumber_Var =m_WordWriter.m_wdFirstRange.get_Information(wdActiveEndPageNumber);
                long FirstCharPageNumber_Int=FirstCharPageNumber_Var.lVal;
                COleVariant FirstCharLineNumber_Var =m_WordWriter.m_wdFirstRange.get_Information(wdFirstCharacterLineNumber);
                long FirstCharLineNumber_Int=FirstCharLineNumber_Var.lVal;
                COleVariant FirstCharColNumber_Var =m_WordWriter.m_wdFirstRange.get_Information(wdFirstCharacterColumnNumber);
                long FirstCharColNumber_Int=FirstCharColNumber_Var.lVal;

                m_WordWriter.GetParagraphLastCharRange();
                COleVariant LastCharPageNumber_Var =m_WordWriter.m_wdLastRange.get_Information(wdActiveEndPageNumber);
                long LastCharPageNumber_Int=LastCharPageNumber_Var.lVal;
                COleVariant LastCharLineNumber_Var =m_WordWriter.m_wdLastRange.get_Information(wdFirstCharacterLineNumber);
                long LastCharLineNumber_Int=LastCharLineNumber_Var.lVal;
                COleVariant LastCharColNumber_Var =m_WordWriter.m_wdLastRange.get_Information(wdFirstCharacterColumnNumber);
                long LastCharColNumber_Int=LastCharColNumber_Var.lVal;

                if(m_WordWriter.m_wdParagraph.get_IsStyleSeparator()==TRUE)
                {
                    OutputStr0.Format(L"\r\n第%ld段,有样式分隔符",i);
                }
                else{
                    OutputStr0.Format(L"\r\n第%ld段,无样式分隔符",i);
                }
                OutputStr2+=OutputStr0;
                CString OutputStr=L"";
                const long wdSentence = 3;
                COleVariant SentenceVar((long)wdSentence);
                m_WordWriter.m_wdFirstRange.Expand(SentenceVar);
                OutputStr.Format(L"\r\n此段开始于:第%ld页,第%ld\
行,第%ld个字符,\"%s\"。\r\n此段终止于:第%ld页,第%ld\
行,第%ld个字符,\"%s\"。",FirstCharPageNumber_Int,
FirstCharLineNumber_Int,FirstCharColNumber_Int,m_WordWriter.m_wdFirstRange.get_Text(),
                                  LastCharPageNumber_Int,LastCharLineNumber_Int,
                                  LastCharColNumber_Int,m_WordWriter.m_wdLastRange.get_Text());
                OutputStr2+=OutputStr;
                AllOutputStr+="\r\n\r\n";
                AllOutputStr+=OutputStr2;
            }
            ::PostMessage(m_pDialogProgress->m_hWnd,WM_USER_THREAD_UPDATE_PROGRESS,i,paragraphCount);
        }

        //CString AllOutputStr;
        AllOutputStr+=L"------------------\r\n***************\r\n----------------\r\n";
        CString pageLinesMismatch=L"";
        m_WordWriter.GetPages();
        long PageCount=m_WordWriter.m_wdPages.get_Count();
        m_WordWriter.GetSelection();
        try{
            //m_WordWriter.m_wdSel=m_WordWriter.m_wdApp.get_Selection();
            for( int i=1;i<PageCount;i++ )
            {
                if(m_pDialogProgress->m_ExitWorkThread==true)
                {
                    ::PostMessage(m_pDialogProgress->m_hWnd,WM_USER_THREAD_FINISHED,0,0);
                    m_WordWriter.CloseDocument2();
                    m_WordWriter.CloseApp();
                    CloseHandle(m_pDialogProgress->m_hEventModelDlgCreated);
                    ::CoUninitialize();
                    m_Cedit_Output.SetWindowTextW(AllOutputStr);
                    return -1;
                }
                int linesCount=m_WordWriter.GetLineCountOfAPage(i);
                if(linesCount!=22)
                {
                    pageLinesMismatch.Format(L"第%ld页行数不正确%ld行,\r\n",i,linesCount);
                    AllOutputStr+=pageLinesMismatch;
                }

                ::PostMessage(m_pDialogProgress->m_hWnd,WM_USER_THREAD_UPDATE_PROGRESS,i,PageCount);
            }
        }
catch (COleDispatchException* e)
    {
        unsigned short code=e->m_wCode;
        //m_scError = -2146822347
        CString str1;
        str1.Format(L"%s ---%s---%x",e->m_strDescription,e->m_strSource,e->m_scError);
        ::AfxMessageBox(str1);
        e->ReportError();
        e->Delete();
    m_WordWriter.m_wdWindows.ReleaseDispatch();
    m_WordWriter.m_wdWindow0.ReleaseDispatch();
    m_WordWriter.m_wdView0.ReleaseDispatch();
    m_WordWriter.m_wdPanes.ReleaseDispatch();
    m_WordWriter.m_wdPane.ReleaseDispatch();
    m_WordWriter.m_wdPages.ReleaseDispatch();
    m_WordWriter.m_wdPage.ReleaseDispatch();
    m_WordWriter.m_wdLines.ReleaseDispatch();
    m_WordWriter.m_wdRectangles.ReleaseDispatch();
    m_WordWriter.m_wdRectangle.ReleaseDispatch();
    m_WordWriter.m_wdTmpRange.ReleaseDispatch();
//m_Cedit_Output.SetWindowTextW(AllOutputStr);
    ::PostMessage(m_pDialogProgress->m_hWnd,WM_USER_THREAD_FINISHED,0,0);
    ::PostMessage(this->m_hWnd,WM_USER_THREAD_FINISHED,0,0);
    m_WordWriter.CloseDocument2();
    m_WordWriter.CloseApp();
    CloseHandle(m_pDialogProgress->m_hEventModelDlgCreated);
    ::CoUninitialize();
    return FALSE;
    }
const long msogroup = 6;
const long msoTextBox = 17;

CTextFrame textFrame;
CShape Ashape,Ashape2;
CRange tmpRange1;
CFont0 tmpFont;
CShapes shapes=m_WordWriter.m_wdDoc.get_Shapes();
long shapesCount=shapes.get_Count();
CString ShapeOutputStr=L"";
for(long k=1;k<=shapesCount;k++)
{

    COleVariant index((long)k);
    CShape Ashape=shapes.Item(index);
    if(Ashape.get_Type()==msogroup)
    {
        CGroupShapes groupShapes=Ashape.get_GroupItems();
        long groupShapesCount=groupShapes.get_Count();
        for(long j=1;j<=groupShapesCount;j++)
        {
            COleVariant groupindex((long)j);
            Ashape2=groupShapes.Item(groupindex);
            //if(Ashape2.get_Type()==msoTextBox)
            //{
            textFrame=Ashape2.get_TextFrame();
            //textFrame.get_HasText();
            if(textFrame.get_HasText())
            {
                tmpRange1=textFrame.get_TextRange();
                tmpRange1.Select();
                m_WordWriter.GetSelection();
                tmpFont=m_WordWriter.m_wdSel.get_Font();
                VerifyShapeText(ShapeOutputStr,tmpFont,tmpRange1);
            }
            //}
            //Ashape2.get_TextFrame();
            //CGroupShapes groupShapes2=Ashape2.get_GroupItems();
            //long groupShapesCount2=groupShapes.get_Count();
        }
    }
    else{
        textFrame=Ashape.get_TextFrame();
        if(textFrame.get_HasText())
        {
            tmpRange1=textFrame.get_TextRange();
            tmpRange1.Select();
            m_WordWriter.GetSelection();
            tmpFont=m_WordWriter.m_wdSel.get_Font();
            VerifyShapeText(ShapeOutputStr,tmpFont,tmpRange1);
        }
    }
::PostMessage(m_pDialogProgress->m_hWnd,WM_USER_THREAD_UPDATE_PROGRESS,k,shapesCount);
}
AllOutputStr+="\r\n>>>>>>>>>>>>>>\r\n--------------\r\n";
AllOutputStr+=ShapeOutputStr;

    m_WordWriter.m_wdWindows.ReleaseDispatch();
    m_WordWriter.m_wdWindow0.ReleaseDispatch();
    m_WordWriter.m_wdView0.ReleaseDispatch();
    m_WordWriter.m_wdPanes.ReleaseDispatch();
    m_WordWriter.m_wdPane.ReleaseDispatch();
    m_WordWriter.m_wdPages.ReleaseDispatch();
    m_WordWriter.m_wdPage.ReleaseDispatch();
    m_WordWriter.m_wdLines.ReleaseDispatch();
    m_WordWriter.m_wdRectangles.ReleaseDispatch();
    m_WordWriter.m_wdRectangle.ReleaseDispatch();
    m_WordWriter.m_wdTmpRange.ReleaseDispatch();
m_Cedit_Output.SetWindowTextW(AllOutputStr);
    }
    ::PostMessage(m_pDialogProgress->m_hWnd,WM_USER_THREAD_FINISHED,0,0);
    ::PostMessage(this->m_hWnd,WM_USER_THREAD_FINISHED,0,0);
    m_WordWriter.CloseDocument2();
    m_WordWriter.CloseApp();
    CloseHandle(m_pDialogProgress->m_hEventModelDlgCreated);
    ::CoUninitialize();
    return 0;
}
// CFormView_JSBVerify 消息处理程序

void CFormView_JSBVerify::OnInitialUpdate()
{
    CFormView::OnInitialUpdate();

    // TODO: 在此添加专用代码和/或调用基类
    m_fileeditctrl.lpstrFilter=L"MicroSoft word 文档 (.doc or .docx) \0*.doc;*.docx\0\0";
}

void CFormView_JSBVerify::OnBnClickedOk()
{
    // TODO: 在此添加控件通知处理程序代码
    m_pDialogProgress->m_ExitWorkThread=false;
    m_pDialogProgress->m_hThread = AfxBeginThread(MyThreadFunc,this,
        THREAD_PRIORITY_NORMAL,0,0);
    ASSERT(m_pDialogProgress->m_hThread);
}
int CFormView_JSBVerify::VerifyShapeText(CString& OutputStr3,CFont0& font,CRange& range)
{
    CString OutputStr0=L"";
    CString OutputStr2=L"";
    CString FontName=font.get_Name();
    bool MismatchFlag=false;//不匹配标志
    if(FontName!=L"宋体")
    {
        OutputStr2=L"字体不匹配,";
        MismatchFlag=true;
    }
    float FontSize=font.get_Size();
    if(!(FontSize<14.000001 &&FontSize>13.999999))
    {
        OutputStr2+=L"字号不匹配,";
        MismatchFlag=true;
    }

    long FontEmboss=font.get_Emboss();//阳文2
    if(FontEmboss!=0)
    {
        OutputStr2+=L"阳文不匹配,";
        MismatchFlag=true;
    }
    long FontEngrave=font.get_Engrave();//阴文3
    if(FontEngrave!=0)
    {
        OutputStr2+=L"阴文不匹配,";
        MismatchFlag=true;
    }
    long FontOutline=font.get_Outline();//镂空4
    if(FontOutline!=0)
    {
        OutputStr2+=L"镂空不匹配,";
        MismatchFlag=true;
    }
    long FontScaling=font.get_Scaling();//字符比例5
    if(FontScaling!=100)
    {
        OutputStr2+=L"字符比例不匹配,";
        MismatchFlag=true;
    }
    long FontShadow=font.get_Shadow();//阴影6
    if(FontShadow!=0)
    {
        OutputStr2+=L"阴影不匹配,";
        MismatchFlag=true;
    }
    long FontStrikeThrough=font.get_StrikeThrough();//删除线7
    if(FontStrikeThrough!=0)
    {
        OutputStr2+=L"删除线不匹配,";
        MismatchFlag=true;
    }
    long FontDoubleStrikeThrough=font.get_DoubleStrikeThrough();//双删除线8
    if(FontDoubleStrikeThrough!=0)
    {
        OutputStr2+=L"双删除线不匹配,";
        MismatchFlag=true;
    }
    long FontSubscript=font.get_Subscript();//下标9
    if(FontSubscript!=0)
    {
        OutputStr2+=L"下标不匹配,";
        MismatchFlag=true;
    }
    long FontSuperscript=font.get_Superscript();//上标10
    if(FontSuperscript!=0)
    {
        OutputStr2+=L"上标不匹配,";
        MismatchFlag=true;
    }
    long FontHidden=font.get_Hidden();//隐藏11
    if(FontHidden!=0)
    {
        OutputStr2+=L"隐藏不匹配,";
        MismatchFlag=true;
    }
    long FontColor=font.get_ColorIndex();//隐藏11
    //TRACE("%ld----%ld",i,FontColor);
    if(FontColor!=wdAuto&&FontColor!=wdBlack)
    {
        OutputStr2+=L"字体颜色不匹配,";
        MismatchFlag=true;
    }
    long FontHiliteColor=range.get_HighlightColorIndex();//高亮
    //TRACE("%ld----%ld",i,FontHiliteColor);
    if(FontHiliteColor!=0)
    {
        OutputStr2+=L"高亮显示不匹配,";
        MismatchFlag=true;
    }
    float FontSpacing=font.get_Spacing();//字间距
    //TRACE("%ld----%f\n",i,FontSpacing);
    if(FontSpacing!=0)
    {
        OutputStr2+=L"字间距不匹配,";
        MismatchFlag=true;
    }
    long FontPosition=font.get_Position();//相对于基准线的文本位置(以磅为单位)。
    //TRACE("%ld----%ld\n",i,FontPosition);
    if(FontPosition!=0)
    {
        OutputStr2+=L"文本位置不匹配,";
        MismatchFlag=true;
    }
    long FontDisableCharacterSpaceGrid=font.get_DisableCharacterSpaceGrid();//
    //TRACE("%ld----%ld\n",i,FontPosition);
    if(FontDisableCharacterSpaceGrid!=FALSE)
    {
        OutputStr2+=L"网格对齐不匹配,";
        MismatchFlag=true;
    }
    long FontAnimation=font.get_Animation();//
    //TRACE("%ld----%ld\n",i,FontPosition);
    if(FontAnimation!=0)
    {
        OutputStr2+=L"动画不匹配,";
        MismatchFlag=true;
    }
    float FontKerning=font.get_Kerning();//
    //TRACE("%ld----%ld\n",i,FontPosition);
    if(!(FontKerning>=0.999999&&FontKerning<=1.000001))
    {
        OutputStr2+=L"调整字间距不匹配,";
        MismatchFlag=true;
    }
    if(range.get_Bold()!=0)
    {
        OutputStr2+=L"加粗不匹配,";
        MismatchFlag=true;
    }
    if(range.get_Underline()!=0)
    {
        OutputStr2+=L"下划线不匹配,";
        MismatchFlag=true;
    }
    if(range.get_Italic()!=0)
    {
        OutputStr2+=L"斜体不匹配,";
        MismatchFlag=true;
    }

    if(range.get_EmphasisMark()!=0)
    {
        OutputStr2+=L"着重号不匹配,";
        MismatchFlag=true;
    }
    //m_WordWriter.GetParagraphRangeBorders();
    CBorders paragraphBorders=font.get_Borders();
    if(paragraphBorders.get_Enable()!=0)
    {
        OutputStr2+=L"边框不匹配,";
        MismatchFlag=true;
    }
    //m_WordWriter.GetParagraphFormat();
    CParagraphFormat ParagraphFormat=range.get_ParagraphFormat();
    float paragraphLineSpacing=ParagraphFormat.get_LineSpacing();
    float paragraphSpaceAfter=ParagraphFormat.get_SpaceAfter();
    float paragraphSpaceBefore=ParagraphFormat.get_SpaceBefore();
    if(!(paragraphLineSpacing<18.0001&&paragraphLineSpacing>17.9999))
    {
        OutputStr2+=L"段间距不匹配,";
        MismatchFlag=true;
    }
    if(!(paragraphSpaceBefore<0.0001&&paragraphSpaceBefore>-0.0001))
    {
        OutputStr2+=L"段前间距不匹配,";
        MismatchFlag=true;
    }
    if(!(paragraphSpaceAfter<0.0001&&paragraphSpaceAfter>-0.0001))
    {
        OutputStr2+=L"段后间距不匹配,";
        MismatchFlag=true;
    }
    //TRACE("%d----%f----%f---\n",i,paragraphSpaceAfter,paragraphSpaceBefore);
    if(MismatchFlag==true)
    {
        //m_WordWriter.GetParagraphFirstCharRange();
        CCharacters Chars=range.get_Characters();
        CRange FirstRange=Chars.get_First();
        COleVariant FirstCharPageNumber_Var =FirstRange.get_Information(wdActiveEndPageNumber);
        long FirstCharPageNumber_Int=FirstCharPageNumber_Var.lVal;
        COleVariant FirstCharLineNumber_Var =FirstRange.get_Information(wdFirstCharacterLineNumber);
        long FirstCharLineNumber_Int=FirstCharLineNumber_Var.lVal;
        COleVariant FirstCharColNumber_Var =FirstRange.get_Information(wdFirstCharacterColumnNumber);
        long FirstCharColNumber_Int=FirstCharColNumber_Var.lVal;

        //m_WordWriter.GetParagraphLastCharRange();
        //m_wdChars=m_wdRange.get_Characters();
        CRange LastRange=Chars.get_Last();
        COleVariant LastCharPageNumber_Var =LastRange.get_Information(wdActiveEndPageNumber);
        long LastCharPageNumber_Int=LastCharPageNumber_Var.lVal;
        COleVariant LastCharLineNumber_Var =LastRange.get_Information(wdFirstCharacterLineNumber);
        long LastCharLineNumber_Int=LastCharLineNumber_Var.lVal;
        COleVariant LastCharColNumber_Var =LastRange.get_Information(wdFirstCharacterColumnNumber);
        long LastCharColNumber_Int=LastCharColNumber_Var.lVal;

        /*if(paragraph.get_IsStyleSeparator()==TRUE)
        {
            OutputStr0.Format(L"\r\n第%ld段,有样式分隔符",i);
        }
        else{
            OutputStr0.Format(L"\r\n第%ld段,无样式分隔符",i);
        }*/
        //OutputStr2+=OutputStr0;
        CString OutputStr=L"";
        const long wdSentence = 3;
        COleVariant SentenceVar((long)wdSentence);
        FirstRange.Expand(SentenceVar);
        OutputStr.Format(L"\r\n此图形开始于:第%ld页,第%ld\
行,第%ld个字符,\"%s\"。\r\n此段终止于:第%ld页",FirstCharPageNumber_Int,
                          FirstCharLineNumber_Int,FirstCharColNumber_Int,range.get_Text(),
                          LastCharPageNumber_Int);
        OutputStr2+=OutputStr;
        OutputStr3+="\r\n\r\n";
        OutputStr3+=OutputStr2;
        return 0;
    }
    else{
        return 1;//代表无错
    }
}
LRESULT CFormView_JSBVerify::OnThreadFinished(WPARAM wParam,LPARAM lParam)
{
    //SendMessage(WM_CLOSE);
    ::AfxMessageBox(L"技术标格式验证已经完成!");//,MB_APPLMODAL
    return 0;
}

需要注意的是,如果word文档内容中有隐藏的格式符号,当显示时,本程序不能将其检测出来,具体要大家仔细优化。本人只是抛砖引玉。

猜你喜欢

转载自blog.csdn.net/tom_xuzg/article/details/85772861