在MFC中使用自动化接口操作WORD

原文:怎么用VC读取Word文本框中的内容(http://www.cnitblog.com/lifw/articles/vcpp_officeword.html)

感恩这位热心的编程高手已经为我们做好了不少工作,让我可以省了不不少的工作.如果让我自己重新来做,像我的速度,又要花掉好几天.建立一个MFC基本Dialog的工期,通过类向导对话框将库MSWORD.OLB加自来,选中所有可以自动生成的类对象,确定之后将生成msword.h,msword.cpp这样,我们操作word就很方便了.现在我对原来的工程完善了一下,主要实现了:

(1)可以增加数据表格;

(2)可以读取书签附近带有下划线的所有字符;

(3)可以设置字体的大小,文本是否居中等.

下面这张图片就是通过程序,简单输出的一个word文档.

 

 

/* CWordOffice.h */

 

#ifndef WORDOFFICE_INCLUDE_H
#define WORDOFFICE_INCLUDE_H
//文字对齐方式
enum TEXT_ALIGNMENT
{
 ALIGN_LEFT = 0,   //水平居左
 ALIGN_MIDDLE = 1,
 ALIGN_RIGHT = 2
};

//文字读取起点类型
enum TEXT_READ_START_TYPE
{
 READ_START_ABS = 0, //绝对位置
    READ_START_MARK = 1,  //通过书签
};

//读取文本考虑的属性类型
enum TEXT_READ_FONT_TYPE
{
    READ_USE_UNDERLINED = 0, //读取考虑是否带有下划线的
    READ_USE_BOLD,   //读取考虑是否加粗的
 READ_USE_ITALIC, //读取考虑是否倾斜的
 READ_USE_FONTSIZE, //读取考虑固定大小的
};

//读取文本格式
typedef  struct
{
 bool bUnderLine; //是否带有下划线
 bool bBold; //是否加粗的
 bool bItalic; //是否倾斜的
    float fixedSize; //固定尺寸
}FONT_TYPE;

//文本读取参数
typedef struct
{
 TEXT_READ_START_TYPE readStartType; //起点读取类型
 /*readStartType =READ_START_ABS */
 long start;       //读取的绝对位置
    /*readStartType =READ_START_MARK */
 char *bookMark;   //读取的书签位置
 
 FONT_TYPE fontType;   //读取文本格式
 TEXT_READ_FONT_TYPE    *readFontTypes;// 读取文本要考虑的属性列表
 int ftReadTypeSize; //读取文本要考虑的属性列表长度
 int ftSearchWidth; //如果开始位置的字体格式不符合要求,向右搜索可能符合的字体的最大宽度

 bool bReadFixedLen; //是否读取固定长度的
 long fixedLength;   //读取固定长度

 bool bReadFinishedStr; //是否读到固定字符串结束
 char *finishedStr;     //读到此结束字符串为止
 long failMaxLength;    //结束字符串不存在时读取的最大长度
}WORD_TEXT_READ_ARGU;


//文字写入起点类型
enum TEXT_WRITE_START_TYPE
{
  WRITE_START_ABS = 0, //指定绝对位置
     WRITE_START_MARK = 1,  //通过书签指定位置
};

//文本写入参数
typedef struct
{
 char *text;  //写入的文本
 TEXT_WRITE_START_TYPE writeStartType; //文字写入起点类型
 /*writeStartType =WRITE_START_ABS */
 long start;       //读取的绝对位置
    /*writeStartType =WRITE_START_MARK */
 char *bookMark;   //读取的书签位置

 bool bUnderline; //是否带下划线
 bool bBold;//是否加粗
 bool bItalic;//是否倾斜
    bool bSetFixedSize; //是否设定字号
 float fixedSize; //字体尺寸
 bool bReWrited; //已经有文字时是否重新写入
 bool bDeleteOlds; //重新写入时是否删除原来的内容
}WORD_TEXT_WRITE_ARGU;


class CWordOffice
{
private:
    _Application m_wdApp;
    Documents m_wdDocs;
    _Document m_wdDoc;
    Selection m_wdSel;
    Range     m_wdRange;
    InlineShapes m_wdInlineShapes;
    InlineShape m_wdInlineShape;

public:
    CWordOffice();
    virtual ~CWordOffice();

public:
    //操作
    //**********************创建新文档*******************************************
    BOOL CreateApp();                    //创建一个新的WORD应用程序
    BOOL CreateDocuments();                //创建一个新的Word文档集合
    BOOL CreateDocument();                //创建一个新的Word文档
    BOOL Create();                        //创建新的WORD应用程序并创建一个新的文档
    void ShowApp();                        //显示WORD文档
    void HideApp();                        //隐藏word文档

    //**********************打开文档*********************************************
    BOOL OpenDocument(CString fileName);//打开已经存在的文档。
    BOOL Open(CString fileName);        //创建新的WORD应用程序并打开一个已经存在的文档。
    BOOL SetActiveDocument(short i);    //设置当前激活的文档。

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


    //**********************文本书写操作*****************************************
 void WriteText(CString szText,const WORD_TEXT_WRITE_ARGU &argu); //在当前光标或指定位置处写文本,可指定字号
 void WriteText(CString szText,long start=-1, float fontSize=-1);
 //! 读取文本
 CString GetText(const WORD_TEXT_READ_ARGU &argu,long &totalWidth);
 //! 根据起始,截止位置读取文本
    CString GetText(long start, long end);
 //! 读取当前位置所在表格单元格的文本
    CString GetCellText(long start);
 void SetFontSize(float fontSize); //设置字体大小
    float GetFontSize();//获取字体大小
    void SetFontUnderline(long value);//设置字体是否带有下划线
 long GetFontUnderline();//获取字体是否带有下划线
 void SetTextAlignment(TEXT_ALIGNMENT align); //设置当前位置的文字对齐方式
    void WriteNewLineText(CString szText, int nLineCount = 1); //换N行写字
    void WriteEndLine(CString szText);    //文档结尾处写文本

    void WholeStory();                    //全选文档内容
    void Copy();                        //复制文本内容到剪贴板
    void InsertFile(CString fileName);    //将本地的文件全部内容写入到当前文档的光标处。
   
    //**********************图片插入操作*****************************************
    void InsertShapes(CString fileName);//在当前光标的位置插入图片
   
    //**********************超链接插入操作*****************************************
    void InsertHyperlink(CString fileLink);//超级链接地址,可以是相对路径。


  //**********************当前光标移动操作*****************************************
 //! Moves the start position of the specified range or selection. This method returns an integer that indicates the number of units by which the start position or the range or selection actually moved, or it returns 0 (zero) if the move was unsuccessful.
    long MoveStart(long unit, long count);
    //! Moves the selection to the right and returns the number of units it's been moved.
    long MoveRight(long unit, long count, long extend);
    //! Moves the selection to the left and returns the number of units it's been moved.
    long MoveLeft(long unit, long count, long extend);
 long Delete(long unit, long count);
 long MoveUp(long unit, long count, long extend);
 long MoveDown(long unit, long count, long extend);

 //**********************表格处理*****************************************
 //! 根据某一表格中,某一行列上的单元格内容
    CString GetTableCellText(long tableIndex, long row, long col);
 //! 在某一表格中,某一行列上的单元格中写入内容
    void WriteTableCellText(long tableIndex, long row, long col, CString szText);
 //! 读取某一表格中所有单元格的内容,结果放在数组strArray中
    bool GetTableCellsText(long tableIndex, CString strArray[]);
 //!建立表格,可指定位置
 void CreateTable(long rowCount, long colCount,long start=-1);

 //**********************测试*****************************************
 //! 测试所有表格的文本
    void TestTablesText();
 //! 建立一个测试文档
 bool TestCreateDoc(CString fileName);
protected:
 //**********************书签处理*********************************************
 //! 查找书签位置
 long __GetMarkPosition(CString bookMark);

    //检查字体是否符合格式
 bool __isFontValid(TEXT_READ_FONT_TYPE *fontTypes, int ftTypeSize, const FONT_TYPE &fontType,  _Font &ft);
 //!读取以固定字符串结尾的文本
    CString  __GetTextWithEndStr(long start, const char *finishedStr,long failMaxLength, long& totalWidth);

 //! 从此处开始读取所有带有下划线的文本
 // start 开始位置
 // searchWidth 如果开始位置的文本不带有下划线,向右搜索可能带有下划线文本的最大宽度
 CString __GetUnderlineText(long start, long searchWidth, long &length);
 //! 读取固定长度文本
 CString  __GetFixedLenText(long start, long fixedLength);
};
#endif


 

/* CWordOffice.cpp */

#include "stdAfx.h"
#include "CWordOffice.h"
#include  <atlbase.h>
#include  <cmath>

CWordOffice::CWordOffice()
{

}

CWordOffice::~CWordOffice()
{
    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_wdRange.ReleaseDispatch();
    m_wdSel.ReleaseDispatch();
    //m_wdFt.ReleaseDispatch();
    m_wdDoc.ReleaseDispatch(

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值