精华内容
下载资源
问答
  • word文件的组成
    千次阅读
    2021-07-31 09:28:19

    1.word文档的界面组成

    1、最左上角是word的图标及word视窗,接下来是菜单,再下来是工具栏,有数字的是标尺

    2、随意点开一个菜单,插入,这个的菜单项有好多,我们选择一个引用,下拉菜单选索引和目录,会弹出一个相应的对话框来。

    3、编辑好word文档后,要对文档进行相关设置,就会用到对话框里的选项

    4、用鼠标点中工具栏时,会有相应的工具栏文字提示,如把鼠标放在工具栏处,下方显示格式刷,放在其他位置,会有相应的提示。

    2.文件的组成

    文件的组成

    文件是一组相关信息的集合.它可以是程序,数据或其它信息,例好一篇文章、一份报告、一张表格等。Windows系统管理的基本对象之一是“文件”,在Windows系统下的所有程序和数据都是以文件的形式存储在磁盘上。

    一个文件的完整说明是由盘符、文件夹、文件名、扩展名组成。任何一个文件的完整说明必须是唯一的。

    一、盘符

    分别是软盘和硬盘驱动器号A:、B:、C:、D:等。

    二、文件夹

    文件夹是保存在计算机存储器上的一组文件的组合,是文件分类或分级保存的基本单元。

    三、文件名(最多可达到256个字符)

    通常用户所取的文件名应具有一定的意义,以便于记忆。

    四、扩展名

    扩展名是用于区分文件的不同类型。

    例:C:\Windows\ftp.exe

    扩展名 含义 扩展名 含义

    EXE 可执行的程序文件 BAK 备份文件

    XLS 纯二进制文件 DAT 数据文件

    BAT 批处理文件 BAS Basic程序文件

    TXT 文本文件 HLP 帮助文件

    SYS 系统文件 TMP 暂时文件

    DBF 数据库文件 DOC Word文档文件

    PBG FoxBASE命令

    3.电脑 文件由什么构成

    电脑的文件名是由文件的主名和扩展名组成的。

    文件是记录在存储介质上的一组被命名的相关信息的集合,与我们平时写在纸上的文件不是一个概念。文件可以是文字、图片、影片和一个应用程序。

    每个文件都必须给它一个命名,这个名字叫做文件名。文件名分为两部分,中间用一个圆点隔开,圆点后面的就是文件的姓,叫做扩展名。扩展名前面就是文件的主名。作为64位操作系统,Windows 7支持长文件名,文件名最长可达256个字符,相当于128个汉字。文件名里不能出现竖线、斜杠、小于号、大于号、冒号、引号、问号和星号。同一类型的文件扩展名相同,不同类型的文件扩展名不同,如Word 2007文件的扩展名一般是DOCX格式,如:工作安排.DOCX。而Excel 2007文件的扩展名一般是XLSX格式。如:员工电话本.XLSX。

    4.Word窗口一般由几部分组成

    1.标题栏(Title bar)

    2.菜单栏(Menu bar)

    3.工具栏(Tool bar)

    4.文档窗口(Document windows)

    5.状态栏(Status bar)

    Word 2003的窗口结构

    典型的Word 2003窗口由以下几部分组成:

    1.标题栏(Title bar)—— 位于窗口最上端,其左边显示正在处理的文件名和Word的软件信息,右上角的“ ”分别为“最小化窗口”、“最大化窗口”和“关闭窗口”按钮。

    2.菜单栏(Menu bar)—— 位于窗口上端第二行,上有“文件(F)”、“编辑(E)”、……“帮助(H)”等九个主菜单选项。每一主菜单项下又包含一个可折叠的下拉子菜单,其中包含了Word所有可用的菜单命令。

    3.工具栏(Tool bar) —— 菜单栏以下的若干行为工具栏,最常见的有常用工具栏和格式工具栏,它们以形象化的图标形式列出各个工具按钮,这些工具按钮提供了对常用菜单命令的快速访问。

    4.文档窗口(Document windows)—— 位于Word窗口的中央,用于文档的输入和编排。其中闪烁着的竖线形光标称为插入点(insertion point),用于指示文字输入的位置。文档窗口的顶端及左侧是标尺,其作用是给文本定位。文档窗口的底端和右侧是滚动条,用于滚动调整在文档窗口中显示的内容。

    5.状态栏(Status bar)—— 位于窗口最底一行,用于显示当前编辑文档的状态信息及一些编辑信息。

    5.如何将多个word文档组合成一个

    Word允许把其他文件的内容插入到当前编辑的文档中。

    利用这种功能可以将几个文档组合成一个文档。插入其他文件内容的方法如下: ① 将要插入的内容设定为插入点。

    ② 单击“插入”菜单栏上的“文件”命令,弹出“插入文件”对话框。 ③ 在对话框的“查找范围”列表框中选择要插入的文件所在的驱动器;在查找范围”列表框中选择插入文件所在的路径;在“文件类型”列表框中选择要插入的文件类型;在“文件名”滚动列表框中选择要插入的文件名,符合条件的一个文件名被显示在对话框中央的显示区;如果插入文件的一部分,可以单击“范围”按钮,在弹出的对话框输入范围起始页。

    ④ 单击对话框中的 “插入”按钮,被选文档便插入到当前文档的插入点处。

    更多相关内容
  • 窗口是指程序的整体界面,可以包含标题栏、菜单栏、工具栏、关闭按钮、最小化按钮、最大化按钮等。 控件是指按钮、复选框、文本框、表格、进度条等这些组成程序的基本元素。 一个程序可以有多个窗口,一个窗口也可以...
  • 1、在Word 2003主窗口最大化显示时,该窗口的右上角可以同时显示的按钮是___C__按钮。 A:最小化、还原、最大化 B:还原、最大化和关闭 C:最小化、还原和关闭 D:还原和最大化 2、如果想在Word 2003主窗口...
  • VC++ 操作Word(使用微软office控件)

    千次阅读 2019-03-04 23:25:33
    你可以实现诸如:Word文件打印、传送数据到Word文档、发送E-MAIL、自动产生表格、Excel数据统计、圆饼图,直方图显示、自动报表生成、播放幻灯、doc,txt,HTML,rtf文件转换、中文简繁体转换、拼音或笔画排序.........

            使用VC编程来操纵Office。你可以实现诸如:Word文件打印、传送数据到Word文档、发送E-MAIL、自动产生表格、Excel数据统计、圆饼图,直方图显示、自动报表生成、播放幻灯、doc,txt,HTML,rtf文件转换、中文简繁体转换、拼音或笔画排序......只要是Office能够实现的功能,都可以在你写的程序中调用。仔细阅读下面的说明,并下载源文件进行参考,你就可以一步一步地掌握这个技术。祝朋友们学习快乐。

     

    MSDN搜:microsoft.office.interop.word
    Also:https://msdn.microsoft.com/zh-cn/library/Microsoft.Office.Interop.Word(v=office.11).aspx

     

    使用VC编程来操纵Office。你可以实现诸如:Word文件打印、传送数据到Word文档、发送E-MAIL、自动产生表格、Excel数据统计、圆饼图,直方图显示、自动报表生成、播放幻灯、doc,txt,HTML,rtf文件转换、中文简繁体转换、拼音或笔画排序......只要是Office能够实现的功能,都可以在你写的程序中调用。仔细阅读下面的说明,并下载源文件进行参考,你就可以一步一步地掌握这个技术。祝朋友们学习快乐。

    一、概念

    Microsoft 的 Office 产品中,都提供了OLE Automation 自动化程序的接口。如果你使用VB,VBA 和 Script 脚本调用 Office 功能的话,其实比使用 VC 调用要简单的多。比如在 WORD 中,调出菜单“工具(T)\宏(M)\录制新宏(R)”,这时候它开始记录你在 WORD 中任何菜单和键盘的操作,把你的操作过程保存起来,以便再次重复调用。而保存这些操作的记录,其实就是使用了 VBA 程序(Visual Basic for Application)。而我们下面要实现的功能,也同样要参考 VBA 的方法。

    二、结构层次

    为了更有逻辑,更有层次地操作 Office,Microsoft 把应用(Application)按逻辑功能划分为如下的树形结构

    Application(WORD 为例,只列出一部分)

      Documents(所有的文档)

            Document(一个文档)

                ......

      Templates(所有模板)

            Template(一个模板)

                ......

      Windows(所有窗口)

            Window

            Selection

            View

      Selection(编辑对象)

            Font

            Style

            Range

            ......

    只有了解了逻辑层次,我们才能正确的操纵 Office。举例来讲,如果给出一个VBScript语句是:

    application.ActiveDocument.SaveAs "c:\abc.doc"

    那么,我们就知道了,这个操作的过程是:第一步,取得Application;第二步,从Application中取得ActiveDocument;第三步,调用 Document 的函数 SaveAs,参数是一个字符串型的文件名。

    三、基本步骤

    (1)创建(或打开已有的)一个 MFC 的程序工程

    (2)Ctrl+W 执行 ClassWizard(本文按照 VC6 操作,例子程序也是在VC6 下编写测试的)

    (3)Add Class...\From a type Library... 在 Office 目录中,找到你想使用的类型库。(我使用的是 Office2000,其Word 的类型库文件,保存在 C:\Program Files\Microsoft Office\Office\MSWORD9.OLB)根据你 Office 的版本,可以使用下表列出的类型库文件

    Office 版本和类型

    类型库文件

    Office 版本和类型

    类型库文件

    Access 97Msacc8.olbPowerPoint 2000Msppt9.olb
    Jet Database3.5 DAO350.dllWord 2000Msword9.olb
    Binder 97Msbdr8.olbAccess 2002Msacc.olb
    Excel 97Excel8.olbExcel 2002Excel.exe
    Graph 97Graph8.olbGraph 2002Graph.exe
    Office 97Mso97.dllOffice 2002MSO.dll
    Outlook 97Msoutl97.olbOutlook 2002MSOutl.olb
    PowerPoint 97Msppt8.olbPowerPoint 2002MSPpt.olb
    Word 97Msword8.olbWord 2002MSWord.olb
    Access 2000Msacc9.olbOffice Access 2003Msacc.olb
    Jet Database 3.51DAO360.dllOffice Excel 2003Excel.exe
    Binder 2000Msbdr9.olbGraph 2003Graph.exe
    Excel 2000Excel9.olbOffice 2003MSO.dll
    Graph 2000Graph9.olbOffice Outlook 2003MSOutl.olb
    Office 2000Mso9.dllOffice PowerPoint 2003MSPpt.olb
    Outlook 2000Msoutl9.olbOffice Word 2003MSWord.olb

    (4)选择类型库文件后,在弹出的对话窗中继续选择要添加的类。具体选择什么类,要看你将来在程序中打算调用什么功能。当然,你也可以不用考虑这么多,用鼠标和Shift键配合,全部选择也可以。

    (5)初始化COM。方法一,找到App的InitInstance()函数,在其中添加 AfxOleInit()函数的调用;方法二,在需要调用COM功能的地方 CoInitialize(NULL),调用完毕后 CoUninitialize()。

    (6)在你需要调用 Office 功能函数的 cpp 文件中

    #include   // 为了方便操作 VARIANT 类型变量,使用 CComVariant 模板类

    #include "头文件.h"   // 具体的头文件名,是由装载类型库的文件名决定的。(鼠标双点包装类的文件,就可以看到)

    // 比如使用 msword9.olb类型库,那么头文件是 msword9.h

    (7)好了,现在开始写程序吧。另外要说明的是,步骤3和4,其实也可以使用 #import 方式引入类型库。

    四、实现技巧

    在书写调用 Office 函数的过程中,最困难的是确定函数的参数,一般情况下,参数都是 VARIANT 类型的变量指针。那么到底具体我们应该怎么写那?推荐两个方法,其一是阅读有关 VBA 的书籍;其二,是使用 Office 中自带的“宏”功能。强烈推荐大家使用第二个方法,把你要完成的功能,在 Office 的操作环境中,用宏录制下来,然后观察分析录制后的函数和参数,就可以在 VC 中使用了。举一个例子:

    1.ActiveDocument.SaveAs FileName:="Hello.doc", FileFormat:=wdFormatDocument _

    2., LockComments:=False, Password:="", AddToRecentFiles:=True, _

    3.WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _

    4.SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _

    5.False

    以上是在 Word 中录制的一个保存文件的宏,而在 VC 中对应的函数原型为

    1.void _Document::SaveAs(VARIANT* FileName, VARIANT* FileFormat, VARIANT* LockComments,

    2.VARIANT* Password, VARIANT* AddToRecentFiles, VARIANT* WritePassword,

    3.VARIANT* ReadOnlyRecommended, VARIANT* EmbedTrueTypeFonts, VARIANT* SaveNativePictureFormat,

    4.VARIANT* SaveFormsData, VARIANT* SaveAsAOCELetter)

    分析对照后,我们就能看出,参数 FileName 是字符串 VARIANT(VT_BSTR),参数 LockComments 是布尔VARIANT(VT_BOOL),等等。参数 FileFormat := wdFormatDocument 是什么类型那?其实这是一个表示保存的时候指定文件类型的常量,而且显然是 DWORD 类型VARIANT(VT_I4)。那么常量的数值又是多少那?很简单,写一个宏,调用函数 MsgBox 显示一下不就都知道啦?!

    五、步步为营

    特别提示一:编译执行前,一定要先关闭 KV 实时监视病毒的功能(KV 的程序会干扰我们的调用,瑞星的则没关系)。

    特别提示二:在例子程序中,为了表现程序的关键部分,没有或很少使用了条件判断。为了实现你程序的健壮性,请自己加上条件判断和异常处理。

    Step1:如何启动和关闭 WORD,及 VARIANT 的最基本的使用方法

    Step2:和 Step1 同样功能,用 CComVariant 改进了 VARIANT 的使用方式

    Step3:在 Step2 的基础上,新建一个 WORD 文档,并从程序中传送一些字符到 WORD

    Step4:在 Step3 的基础上,保存 WORD 文档

    Step5:一个小应用举例,把输入的汉字按照“笔画”排序

    Step6:一个小应用举例,盗窃正在使用的 WORD 文档

    以上这6个小程序中,都有详细的注释。大家阅读后慢慢体会并实验,你就可以自由地操纵任何一个 Office 啦。

    六、参考:Microsoft Office Development with Visual Studio 

    参考资料:

    http://msdn.microsoft.com/zh-cn/library/microsoft.office.interop.word(v=office.11).aspx

    http://bbs.csdn.net/topics/290025616

    http://blog.sciencenet.cn/blog-43777-318939.html

    http://www.cnitblog.com/lifw/articles/vcpp_officeword.html

    http://www.cnblogs.com/Raikkonen/archive/2010/05/19/1738980.html

    http://blog.csdn.net/zhaoshilei29/article/details/5946333


    ====================================================================

     

    1.实现技巧

    写Word文档,首先要从Word应用程序获取文档的类的对象,然后设置文档中接收文字位置,最后将文字写入Word文档。

    注:Microsoft Office 2003类型库msword.olb常用的_Application,_Document,Documents,Selection四个类

     

    按照添加类的步骤,将_Application应用程序类和Documents类和Selection类加进应用程序。

    在View菜单中,点击ClassWizard,然后进入Automation标签中点击Add Class,选择From A Type Library。找到Microsoft Office 2003类型库msword.olb,选择_Application,_Document,_Documents,Selection四个类,如有其他需要(例如画表也可选择其他的类)。
     

    Documents类是文档对象集类,是所有Document对象的集合。使用Documents对象集合的Add方法可以新建一篇空白文档并将返回的Document 对象添至Documents对象集合之中。

    Add方法的原型声明如下:

    LPDISPATCH  Add( VARIANT* Template,  VARIANT* NewTemplate,  VARIANT* DocumentType,  VARIANT* Visible)

    参数Template,指定新文档使用的模板名,如果忽略此参数则使用Normal模板。
     
    参数NewTemplate,如果此属性设置为 True 则将文档作为模板打开。默认值为 False。
     
    参数DocumentType其值可取下列 WdNewDocumentType常量之一。
     
    WdNewBlankDocument 创建一个空白文档,默认值。
     
    WdNewEmailMessage 新建一个电子邮件信息。
     
    wdNewWebPage 新建一个Web页。
     
    参数Visible,如果此参数为True,Microsoft Word将在可见窗口打开文档。如果此参数为False,Word仍会打开此文档但文档窗口的Visible属性变为False,默认值为True。

    Selection类对象用于选定文档的文字,然后对选定部分进行操作,如设置文字的格式或键入文字。Selection 对象代表窗体中的选定内容,每个窗体中只能有一个Selection 对象而且只能激活一个 Selection 对象。Selection 对象代表的选定内容既可以是文档中的一个区域也可以仅仅是一个插入点。通过Selection对象的TypeText和GetText可对Word文档进行读写操作。

    TypeText的函数作用为写Word文档,其函数的声明如下:

    void TypeText(LPCTSTR Text);

    GetText的函数的作用是读文档,其函数的声明如下:

    CString GetText();

     

     

     1. VC6的操作:


         在第(4)步后,VC6会自动生成"msword.h"和"msword.cpp"两个文件,同时在类视图中会生成你选择的类(譬如_Application _Document等等);


         此时你只要加入#include "msword.h",就完成了准备工作。


    2. VC2005\2008


         VC2005不会生成"msword.h"和"msword.cpp"这两个文件,取而代之的是生成"CApplication.h" "CDocument0.h"等一系列头文件;


         但如果你以为加入了#include "CApplication.h" ,便可以完成准备工作的话,那就大错特错了,此时编译会出现很多错误;


         该怎么办呢?


         把VC6中生成的"msword.h"和"msword.cpp"两个文件拷贝到VC2005工程文件夹目录中,并加入到工程中(项目-添加现有项);


         然后加上以下代码就一切OK了!

     

    ===================================================================

     

     

    作者:http://blog.csdn.net/zhaoshilei29/article/details/5946333

    ---------------------------------------

    首先,把我参考的两个地址放上来,博主写到很好,我这里只是把学到的东西做记录自己备查而已。

    用Visual C++操纵MS Word:

    http://www.cnblogs.com/scq2099yt/archive/2008/01/07/1028697.html

    MFC/VC++调用word进行报表制作:

    http://www.cnblogs.com/scq2099yt/archive/2008/01/07/1028717.html

     

    其次,说说重点:

    重点就是怎么把VBA_Sub MyReporter.bas里的VBA代码转换成WORD.OLE代码,上面的两篇文章写的很好,照着一步一步做就成了。

     

    下面,一步一步开始吧:

    1. 首先,要打开Word的宏记录功能。

    备注:在Word中,使用VBA为脚本的宏,可以使文件具有一定逻辑处理功能。例如自动生成及处理数据等。

    2. 然后创建一个新宏

    3. 记录一个宏,在记录好以后,可以对宏进行简单的编辑,想调试看运行结果时,点击“运行”按钮。这一步很重要,在把这个VBA脚本翻译成C++可执行的代码前,这里的逻辑就是最后生成Word文档的逻辑,因此,要仔细调试,把其中没有必要的步骤去除,尽量精简生成文档的步骤。

    4. 在最终获得一个这样的脚本后,就可以准备开始C++的编程了,这里,贴出我完成的脚本(为了不公开项目里的数据,这里我稍做改动,把数据相关的内容全部替换了)

    Sub MyReporter()
        Documents.Add DocumentType:=wdNewBlankDocument ' //生成一个空文档
        
        Selection.TypeText Text:="某某报表" ' //输入第1行内容
        Selection.TypeParagraph ' //换行
        Selection.TypeText Text:="行1:" ' //输入第2行内容
        Selection.TypeParagraph ' //换行
        Selection.TypeText Text:="行2:" ' //输入第3行内容
        Selection.TypeParagraph ' //换行
        Selection.TypeText Text:="行3:" ' //输入第4行内容
        Selection.TypeParagraph ' //换行
        Selection.TypeText Text:="行4:" ' //输入第5行内容
        Selection.TypeParagraph ' //换行
        Selection.TypeText Text:="行5" ' //输入第6行内容
        Selection.TypeParagraph ' //换行
        
        ' //添加一个6行4列的表格,使用默认样式 
        ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=6, NumColumns:= _
            4, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
            wdAutoFitFixed
        
        ' //添加表的内容并设置表的格式
        ' //输入表内第1行内容 
        Selection.TypeText Text:="列1" ' //输入第1列内容
        Selection.MoveRight Unit:=wdCharacter, Count:=1 ' //向右移动鼠标到下一列
        Selection.TypeText Text:="列2" ' //输入第2列内容
        Selection.MoveRight Unit:=wdCharacter, Count:=1 ' //向右移动鼠标到下一列
        Selection.TypeText Text:="列3" ' //输入第3列内容
        Selection.MoveRight Unit:=wdCharacter, Count:=1 ' //向右移动鼠标到下一列 
        Selection.TypeText Text:="列4" ' //输入第4列内容
        ' //输入表内第2行内容 
        Selection.MoveDown Unit:=wdLine, Count:=1 ' //向下移动鼠标到下一行 
        Selection.MoveLeft Unit:=wdCharacter, Count:=3 ' //向左移动鼠标到第1列
        Selection.TypeText Text:="列1" ' //输入第1列内容
        Selection.MoveRight Unit:=wdCharacter, Count:=3 '// 向右移动鼠标到第4列
        Selection.TypeText Text:="列4" ' //输入第4列内容
        ' //输入表内第3行内容 
        Selection.MoveDown Unit:=wdLine, Count:=1 ' //向下移动鼠标到下一行
        Selection.MoveLeft Unit:=wdCharacter, Count:=3 ' //向左移动鼠标到第1列
        Selection.TypeText Text:="列1" ' //输入第1列内容
        Selection.MoveRight Unit:=wdCharacter, Count:=1 ' // 向右移动鼠标到第2列
        Selection.TypeText Text:="列2" '//输入第2列内容
        Selection.MoveRight Unit:=wdCharacter, Count:=1 ' // 向右移动鼠标到第3列
        Selection.TypeText Text:="列3" '//输入第3列内容
        Selection.MoveRight Unit:=wdCharacter, Count:=1  ' // 向右移动鼠标到第4列
        Selection.TypeText Text:="列4" '//输入第4列内容
        ' //输入表内第4行内容 
        Selection.MoveDown Unit:=wdLine, Count:=1 ' //向下移动鼠标到下一行
        Selection.MoveLeft Unit:=wdCharacter, Count:=3 ' //向左移动鼠标到第1列
        Selection.TypeText Text:="列1" ' //输入第1列内容
        Selection.MoveRight Unit:=wdCharacter, Count:=3 ' //向右移动鼠标到第4列
        Selection.TypeText Text:="列4" ' //输入第4列内容
        ' //输入表内第5行内容 
        Selection.MoveDown Unit:=wdLine, Count:=1 ' //向下移动鼠标到下一行
        Selection.MoveLeft Unit:=wdCharacter, Count:=3 ' //向左移动鼠标到第1列
        Selection.TypeText Text:="列1" ' //输入第1列内容
        Selection.MoveRight Unit:=wdCharacter, Count:=3 ' //向右移动鼠标到第4列
        Selection.TypeText Text:="列4" ' //输入第4列内容
        ' //输入表内第6行内容 
        Selection.MoveDown Unit:=wdLine, Count:=1 ' //向下移动鼠标到下一行
        Selection.MoveLeft Unit:=wdCharacter, Count:=3 ' //向左移动鼠标到第1列
        Selection.TypeText Text:="列1" ' //输入第1列内容
        Selection.MoveRight Unit:=wdCharacter, Count:=3 ' //向右移动鼠标到第4列
        Selection.TypeText Text:="列4" ' //输入第4列内容
        ' //设置表的格式 
        Selection.MoveUp Unit:=wdLine, Count:=5 ' //向上移动鼠标到表的第1行(目前鼠标在第1行第4列最后一个字符后)
        Selection.MoveLeft Unit:=wdCharacter, Count:=15 ' //向左移动鼠标到第1列的第1个字符前
        Selection.MoveDown Unit:=wdLine, Count:=5, Extend:=wdExtend ' //向下选取5行,共选取6行(执行这句后,第1列全部选中)
        Selection.MoveRight Unit:=wdCharacter, Count:=3, Extend:=wdExtend ' //向右选取3列,共选取4列(执行这句后,整个表被选中)
        Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter ' //设置对齐方式为“居中”
        
        ' //开始设置表以前内容的格式 
        Selection.MoveUp Unit:=wdLine, Count:=1 ' //向上移动鼠标到上一行
        Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter '//设置此行为“居中”格式 
        Selection.MoveUp Unit:=wdLine, Count:=5 '// 向上移动鼠标到第1行
        Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter '//设置标题行为“居中”格式
        Selection.EndKey Unit:=wdLine ' //将鼠标定位到第1行末
        Selection.HomeKey Unit:=wdLine, Extend:=wdExtend ' //将鼠标定位到第1行首,同时选取整行
        Selection.Font.Bold = wdToggle ' //设置标题行为“粗体”    
        Selection.Font.Size = 15 ' //设置标题行字号为15(小三号) 
        Selection.MoveDown Unit:=wdLine, Count:=1 ' //向下移动鼠标到正文第1行
        Selection.HomeKey Unit:=wdLine ' //将鼠标定位到正文第1行首,(第2行行首) 
        Selection.MoveDown Unit:=wdLine, Count:=11, Extend:=wdExtend ' //向下选取除标题行外的全部内容
        Selection.Font.Size = 12 ' //设置字号为12(小四号)
        Selection.WholeStory '// 选取全部内容
        Selection.Font.Name = "宋体" '// 设置全部内容为“宋体”
        
        ' //保存文件为《某某报表.doc》到默认位置,WORD的默认路径是“我的文档”
        ActiveDocument.SaveAs FileName:="某某报表.doc", FileFormat:= _
            wdFormatDocument, LockComments:=False, Password:="", AddToRecentFiles:= _
            True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:= _
            False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
            SaveAsAOCELetter:=False
            
        ' 退出程序,关闭Word
        Application.Quit
    End Sub

    5. 这就是最后一步了,就是把上面的VBA编程C++可执行的代码。当然,在生成这个工程的时候,一定要添加外部的库,这里,在MFC中操作WORD2003的库使用的是 MSWORD.OLB ,一般情况下,可以在OFFICE所在的文件夹下,通过搜索获得。对于如何添加这个外部链接库,这里不做记录了,会MFC的人,这个是基本功。那么在生成MFC工程后,把上面的VBA代码,一条一条翻译成C++的代码就行了,以下是翻译的结果:

    (把以下代码放到一个事件中,比如对一个Button的单击响应事件中,就可以运行了)

     //****待用的操作WORD的 常量
     const int wdCharacter = 1;
     const int wdLine = 5;
     const int wdAlignParagraphCenter = 1;
     const int wdExtend = 1;
     const int wdToggle = 9999998;
     const int wdFormatDocument = 0;
     const int wdWord9TableBehavior = 1;
      const int wdAutoFitFixed = 0;
     const int wdNULL = 0;
     const int wdNewBlankDocument = 0;
     const int wdWindowStateMinimize = 2;

     //****待用的操作WORD的 变量 
     _Application wordApp;
        Documents wordDocs;
        _Document wordDoc;
        Selection wordSelection;
     Range wordRange;
     Tables wordTables;
     Table wordTable;
     Cell wordCell;
     Cells wordCells;
     _Font wordFont;
     Shading wordShading;
     Paragraphs wordParagraphs;

     //****创建word application实例,失败的话返回false
     if (!wordApp.CreateDispatch(_T("Word.Application"))) 
     {
      AfxMessageBox("Word CreateDispatch Failed!");  //显示错误信息
      return FALSE; //返回false
     }     
     
     wordDocs=wordApp.GetDocuments();//获得 documents 实例 

     //****添加新的空白文档(调用COM)
     //(参考自:http://www.cnblogs.com/scq2099yt/archive/2008/01/07/1028717.html
     CComVariant tpl(_T("")),Visble,DocType(0),NewTemplate(false);
     wordDoc=wordDocs.Add(&tpl,&NewTemplate,&DocType,&Visble);
     wordSelection=wordApp.GetSelection(); //获得 wordSelection 实例

     //****添加文字 
     wordSelection.TypeText("某某报表"); //输出1行
     wordSelection.TypeParagraph(); //换行
     wordSelection.TypeText("行1:"); //输出2行
     wordSelection.TypeParagraph(); //换行
     wordSelection.TypeText("行2:");  //输出3行
     wordSelection.TypeParagraph(); //换行
     wordSelection.TypeText("行3:"); //输出4行 
     wordSelection.TypeParagraph(); //换行
     wordSelection.TypeText("行4:"); //输出5行
     wordSelection.TypeParagraph(); //换行
     wordSelection.TypeText("行5"); //输出6行
     wordSelection.TypeParagraph(); //换行
     
     //****插入表格 
     wordTables=wordDoc.GetTables(); //获得表格
     wordRange = wordSelection.GetRange();
     //添加一个6行4列的表格,使用默认样式
     wordTables.Add(wordRange, 
      6, // 行数
      4, // 列数
      COleVariant((short)wdWord9TableBehavior),
      COleVariant((short)wdAutoFitFixed)); 
     /*** 注意 COleVariant((short)XXX) 这个方法可以把int型转换为 VARIANT* 类型 ***/
     
     //添加表的内容并设置表的格式
     //输入表内第1行内容 
     wordSelection.TypeText("列1"); //输入第1列内容
     wordSelection.MoveRight(COleVariant((short)wdCharacter), 
      COleVariant((short)1), 
      COleVariant((short)wdNULL)); //向右移动鼠标到下一列
     wordSelection.TypeText("列2"); //输入第2列内容
     wordSelection.MoveRight(COleVariant((short)wdCharacter), 
      COleVariant((short)1), 
      COleVariant((short)wdNULL)); //向右移动鼠标到下一列
     wordSelection.TypeText("列3"); //输入第3列内容
     wordSelection.MoveRight(COleVariant((short)wdCharacter), 
      COleVariant((short)1),
      COleVariant((short)wdNULL)); //向右移动鼠标到下一列
     wordSelection.TypeText("列4"); //输入第4列内容 
     //输入表内第2行内容 
     wordSelection.MoveDown(COleVariant((short)wdLine), 
      COleVariant((short)1),
      COleVariant((short)wdNULL)); //向下移动鼠标到下一行
     wordSelection.MoveLeft(COleVariant((short)wdCharacter), 
      COleVariant((short)3),
      COleVariant((short)wdNULL)); //向左移动鼠标到第1列
        wordSelection.TypeText("列1"); //输入第1列内容    
     wordSelection.MoveRight(COleVariant((short)wdCharacter), 
      COleVariant((short)3), 
      COleVariant((short)wdNULL)); //向右移动鼠标到第4列
     wordSelection.TypeText("列4"); //输入第4列内容
     //输入表内第3行内容 
     wordSelection.MoveDown(COleVariant((short)wdLine), 
      COleVariant((short)1),
      COleVariant((short)wdNULL)); //向下移动鼠标到下一行
     wordSelection.MoveLeft(COleVariant((short)wdCharacter), 
      COleVariant((short)3),
      COleVariant((short)wdNULL)); //向左移动鼠标到第1列 
        wordSelection.TypeText("列1"); //输入第1列内容    
     wordSelection.MoveRight(COleVariant((short)wdCharacter), 
      COleVariant((short)1), 
      COleVariant((short)wdNULL)); //向右移动鼠标到第2列
     wordSelection.TypeText("列2"); //输入第2列内容
     wordSelection.MoveRight(COleVariant((short)wdCharacter), 
      COleVariant((short)1), 
      COleVariant((short)wdNULL)); //向右移动鼠标到第3列
     wordSelection.TypeText("列3"); //输入第3列内容
     wordSelection.MoveRight(COleVariant((short)wdCharacter), 
      COleVariant((short)1), 
      COleVariant((short)wdNULL)); //向右移动鼠标到第4列
     wordSelection.TypeText("列4"); //输入第4列内容
     //输入表内第4行内容 
     wordSelection.MoveDown(COleVariant((short)wdLine), 
      COleVariant((short)1),
      COleVariant((short)wdNULL)); //向下移动鼠标到下一行
     wordSelection.MoveLeft(COleVariant((short)wdCharacter), 
      COleVariant((short)3),
      COleVariant((short)wdNULL)); //向左移动鼠标到第1列
        wordSelection.TypeText("列1"); //输入第1列内容    
     wordSelection.MoveRight(COleVariant((short)wdCharacter), 
      COleVariant((short)3), 
      COleVariant((short)wdNULL)); //向右移动鼠标到第4列    
     wordSelection.TypeText("列4"); //输入第4列内容
     //输入表内第5行内容 
     wordSelection.MoveDown(COleVariant((short)wdLine), 
      COleVariant((short)1),
      COleVariant((short)wdNULL)); //向下移动鼠标到下一行
     wordSelection.MoveLeft(COleVariant((short)wdCharacter), 
      COleVariant((short)3),
      COleVariant((short)wdNULL)); //向左移动鼠标到第1列
        wordSelection.TypeText("列1"); //输入第1列内容    
     wordSelection.MoveRight(COleVariant((short)wdCharacter), 
      COleVariant((short)3), 
      COleVariant((short)wdNULL)); //向右移动鼠标到第4列    
     wordSelection.TypeText("列4"); //输入第4列内容
     //输入表内第6行内容 
     wordSelection.MoveDown(COleVariant((short)wdLine), 
      COleVariant((short)1),
      COleVariant((short)wdNULL)); //向下移动鼠标到下一行
     wordSelection.MoveLeft(COleVariant((short)wdCharacter), 
      COleVariant((short)3),
      COleVariant((short)wdNULL)); //向左移动鼠标到第1列
        wordSelection.TypeText("列1"); //输入第1列内容    
     wordSelection.MoveRight(COleVariant((short)wdCharacter), 
      COleVariant((short)3), 
      COleVariant((short)wdNULL)); //向右移动鼠标到第4列
     wordSelection.TypeText("列4"); //输入第4列内容
     //设置表的格式
     wordSelection.MoveUp(COleVariant((short)wdLine), 
      COleVariant((short)5),
      COleVariant((short)wdNULL)); //向上移动鼠标到表的第1行(目前鼠标在第一行第4列最后一个字符后)
     wordSelection.MoveLeft(COleVariant((short)wdCharacter), 
      COleVariant((short)15),
      COleVariant((short)wdNULL)); //向左移动鼠标到第1列的第1个字符前 
     wordSelection.MoveDown(COleVariant((short)wdLine), 
      COleVariant((short)5),
      COleVariant((short)wdExtend)); //向下选取5行,共选取6行(执行这句后,第1列全部选中)
     wordSelection.MoveRight(COleVariant((short)wdCharacter), 
      COleVariant((short)3), 
      COleVariant((short)wdExtend)); //向右选取3列,共选取4列(执行这句后,整个表被选中)
     wordParagraphs = wordSelection.GetParagraphFormat(); //获得对齐方式实例
     wordParagraphs.SetAlignment(wdAlignParagraphCenter); //设置表中的全部内容为“居中”
        
     //开始设置表以前内容的格式 
     wordSelection.MoveUp(COleVariant((short)wdLine), 
      COleVariant((short)1),
      COleVariant((short)wdNULL)); //向上移动鼠标到上一行
        wordParagraphs = wordSelection.GetParagraphFormat(); //获得对齐方式实例 
     wordParagraphs.SetAlignment(wdAlignParagraphCenter); //设置此行为“居中”格式 
        wordSelection.MoveUp(COleVariant((short)wdLine), 
      COleVariant((short)5),
      COleVariant((short)wdNULL)); // 向上移动鼠标到第1行
     wordParagraphs = wordSelection.GetParagraphFormat(); //获得对齐方式实例
     wordParagraphs.SetAlignment(wdAlignParagraphCenter); //设置标题行为“居中”
     wordSelection.EndKey(COleVariant((short)wdLine),
      COleVariant((short)wdNULL)); //将鼠标定位到第1行末
     wordSelection.HomeKey(COleVariant((short)wdLine),
      COleVariant((short)wdExtend)); //将鼠标定位到第1行末
     wordFont = wordSelection.GetFont(); //获得字体实例
     wordFont.SetBold(wdToggle); //设置标题行为“粗体”     
     wordFont.SetSize(15.0); //设置标题行字号为15(小三号)
     wordSelection.MoveDown(COleVariant((short)wdLine), 
      COleVariant((short)1),
      COleVariant((short)wdNULL)); //向下移动鼠标到正文第1行
     wordSelection.HomeKey(COleVariant((short)wdLine),
      COleVariant((short)wdNULL)); //将鼠标定位到正文第1行首,(第2行行首) 
     wordSelection.MoveDown(COleVariant((short)wdLine), 
      COleVariant((short)11),
      COleVariant((short)wdExtend)); //向下选取除标题行外的全部内容
     wordFont = wordSelection.GetFont(); //获得字体实例 
     wordFont.SetSize(12.0); //设置标题行字号为12(小四号)
     wordSelection.WholeStory(); // 选取全部内容
     wordFont = wordSelection.GetFont(); //获得字体实例
     wordFont.SetName("宋体"); //设置全部内容为“宋体”


     //保存文件为《某某报表.doc》到默认位置,和此程序在一起 
     CString fileName = "//某某报表.doc";
     CString fullFileName = GGetAppPath() + fileName;
     wordDoc.SaveAs(COleVariant(fullFileName), //FileName
      COleVariant((short)wdFormatDocument), //FileFormat
      COleVariant((short)FALSE), //LockComments
      COleVariant(""), //Password
      COleVariant((short)FALSE), //AddToRecentFiles
      COleVariant(""), //WritePassword
      COleVariant((short)FALSE), //ReadOnlyRecommended 
      COleVariant((short)FALSE), //EmbedTrueTypeFonts 
      COleVariant((short)FALSE), //SaveNativePictureFormat 
      COleVariant((short)FALSE), //SaveFormsData 
      COleVariant((short)FALSE), //SaveAsAOCELetter
      COleVariant((short)wdNULL), //Encoding 
      COleVariant((short)FALSE), //InsertLineBreaks
      COleVariant((short)FALSE), //AllowSubstutitions,
      COleVariant((short)wdNULL), //LineEnding
      COleVariant((short)wdNULL) //AddBiDiMarks
      );
     
     //退出程序,关闭Word
     wordApp.Quit(COleVariant((short)wdNULL),
      COleVariant((short)wdNULL),
      COleVariant((short)wdNULL));

     return TRUE; // 生成成功,返回TRUE

    6. 最后,编译,调试,运行,哈哈,最后,我生成了一个这样的表

     

    =========================================================

    使用word进行数据报告的制作可谓非常方便,word具有非常强大的编辑、排版功能。使用word能够制作出内容丰富、样式精美的报告。我们在工作中当然会有报表报告的需求,如果能够在MFC/VC++里面能够调用word进行word格式报告的自动生成,岂不是一件非常惬意的事情。                       

            我在工作当中需要对大量的数据或者各种测试数据进行统计分析,最终的统计分析结果总归要汇总为一份报告,不管是内部使用也好还是外部提供给客户也好,一份内容翔实、格式精美的报告自然必不可少。我对MFC/VC++也不是高手,只是业余爱好自己动动手做些东西。自然,低于VC操作word可谓完全没有经验,在网络上面也查找了很多资料,都是些只言片语,不能真正的领略通过VC使用word的方法。于是自己摸索了几个礼拜,可谓耗时甚长,劳心劳力啊。MS的东西,封装的也太严实了,对于函数部分只有些许的简单介绍,往往看的云里雾里。没有实践还是不行啊!体会自己的经历,虽然辛苦但也有收获。不想其他朋友再继续走我走过的路,浪费时间、精力,故成文以共享。
         

    废话少说,进入正题吧。
     第一步,当然我们需要首先导入word需要的库。通过ClassWizard->Add Class选择From a Type Library…定位需要的库文件导入。本例应该使用C:"Program Files"Microsoft Office"OFFICE11"MSWORD.OLB,在这里尽可选择所有的类导入,反正用的时候都有了,呵呵。完成这一步,我们得到两个文件msword.h和msword.cpp,那就加入你的工程吧。
                             
    说明:如果需要在VC++/MFC开发程序操作word/excel等office元素,那么需要对必要的类型库进行导入.下面是office系列的类型库参考,导入类型库时候请选择正确的类型库进行导入.                      

    第二步,进入具体使用实践阶段。激动人心的时刻到来了,呵呵。不过别忘记把你的H文件#Include进来。下面是我的一个例子,从我具体的工程当中抽取出来供各位参考。有些地方我会简要解释。还等什么,赶紧试验一下代码吧。修改一下就是你的报告了,开心吧。
     BOOLCMDIDemoApp::OnMakeReport()
      {
                                       _ApplicationwordApp;

                                      DocumentswordDocs;

                                      _DocumentwordDoc;

                                      SelectionwordSelection;

                                      RangewordRange;

                                      TableswordTables;

                                      TablewordTable;     

                                      CellwordCell;   

                                      CellswordCells;

                                      //Paragraphs wordParagraphs;

                                      //Paragraph wordParagraph;

                                      _FontwordFont;

                                      ShadingwordShading;

                                      intnRow=0;

                                      COleVariantvTrue((short)TRUE), 
                                      vFalse((short)FALSE), 
                                      vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR); 
                                      
                      CComVariantdefaultBehavior(1),AutoFitBehavior(0);
                                      //创建word application实例
                                      if 
                      (!wordApp.CreateDispatch(_T("Word.Application"))) 
                                      {
                                              AfxMessageBox("Word CreateDispatch 
                      Failed!");
                                              returnFALSE;
                                      }     
                                      wordApp.SetVisible(TRUE);//make visible
                                      wordApp.Activate();//激活
                                      wordDocs=wordApp.GetDocuments();//get 
                      documents object
                                      CStringstrDocTemplate;
                                      CStringstrPath;
                                      charszFullPath[_MAX_PATH];
                                      
    ::GetModuleFileName(NULL,szFullPath,_MAX_PATH);
                                      strDocTemplate.Format("%s",szFullPath);
                                      intnPos=strDocTemplate.ReverseFind('""');
                                      strDocTemplate=strDocTemplate.Left(nPos);
                                      strPath=strDocTemplate;
                                      TRACE1("%s"n",strDocTemplate);
                                      //     
                      strDocTemplate+="""Template""Report.doc";
                                      //     
                      wordDoc=wordDocs.Open(COleVariant(strDocTemplate),&vOpt,&vOpt,&vOpt,&vOpt,
                                      //            
                      &vOpt,&vOpt,&vOpt,&vOpt,&vOpt,&vOpt,&vTrue,&vOpt,&vOpt,&vOpt,&vOpt);
                                      
                      CComVarianttpl(_T("")),Visble,DocType(0),NewTemplate(false);
                                      
                      wordDoc=wordDocs.Add(&tpl,&NewTemplate,&DocType,&Visble);
                                      wordSelection=wordApp.GetSelection();
                                      
                      //wordTables.AttachDispatch(wordDoc.GetTables());
                                      wordTables=wordDoc.GetTables();
                                      //wordParagraphs = wordDoc.GetParagraphs();
                                      //wordParagraph=wordParagraphs.GetLast();
                                      //wordRange=wordParagraph.GetRange();
                                      
                      //wordSelection.EndKey(COleVariant((short)6),COleVariant((short)0));
                                      //move insertion point to the end of the story
                                      /*
                                      wdUnits:
                                      wdCharacter=1   
                                      wdWord=2
                                      wdSentence=3
                                      wdParagraph=4
                                      wdSection=8
                                      wdStory=6
                                      wdCell=12
                                      wdColumn=9
                                      wdRow=10
                                      wdTable=15       
                                      wdMovementType:
                             
                                      wdMove=0
                                      wdExtend=1       
                                      */
                                      //move to end of story
                                      
                      wordSelection.EndOf(COleVariant((short)6),COleVariant((short)0));
                                      //1.1 RxLev Full 
                                      wordSelection.TypeText("1. 统计报告");
                                      
                      wordSelection.HomeKey(&CComVariant(5),&CComVariant(1));
                                      //Format the line with selection
                                      wordFont = wordSelection.GetFont();
                                      wordFont.SetBold(9999998);//wdToggle
                                      
                      wordSelection.EndOf(&CComVariant(5),&CComVariant(0));
                                      wordSelection.TypeParagraph();    
                                      wordSelection.TypeText("(1.1). 分段统计");
                                      wordSelection.TypeParagraph();
                                      wordFont.SetBold(9999998);//wdToggle
                                      wordRange=wordSelection.GetRange();
                                       //add table
                                      //nRow=m_nRange1+1;
         wordTable=wordTables.Add(wordRange,5/*row*/,4/*column*/,&defaultBehavior,&AutoFitBehavior);
                                      wordRange=wordTable.GetRange();
                                      
                      //wordRange.MoveEnd(COleVariant((short)15),COleVariant((short)1));
                                      //wordRange.Select();
                                      //move end of table
                                      
                      //wordSelection.EndOf(COleVariant((short)15),COleVariant((short)0));
                                      //insert rows
                                      
                      //wordSelection.InsertRowsBelow(COleVariant((short)5));
                                      //选择第一个单元,进而选择第一行进行格式化
                                      wordCell=wordTable.Cell(1,1);
                                      wordCell.Select();
                                      //select the row with current selection
                                      
                      wordSelection.EndKey(&CComVariant(10),&CComVariant(1));
                                      //Format the row with selection
                                      //wordFont = wordSelection.GetFont();
                                      wordFont.SetBold(9999998);//wdToggle
                                      wordCells=wordSelection.GetCells();
                                      wordShading = wordCells.GetShading();
                                      wordShading.SetTexture(0);
                                      
                      wordShading.SetBackgroundPatternColor(14737632);//15987699 
                      14737632 adColorBlue
                                      
                      wordShading.SetForegroundPatternColor(-16777216);//-16777216 
                      wdColorAutomatic
                                      //move to end of table
                                      
                      //wordSelection.EndOf(COleVariant((short)15),COleVariant((short)0));
                                      //wordParagraph=wordParagraphs.GetLast();
                                      //wordRange=wordParagraph.GetRange();
                                      
                      //wordRange.MoveEnd(COleVariant((short)4),COleVariant((short)1)); 
                           
                                      //wordRange.SetText("Test");
                                      //wordSelection=wordApp.GetSelection();
                                      
                      //wordSelection.MoveEnd(COleVariant((short)6),COleVariant((short)1));
                                      wordCell=wordTable.Cell(1,1);
                                      wordCell.Select();
                                      wordSelection.TypeText("统计项目");
                                      
                      wordSelection.MoveRight(&CComVariant(12),&CComVariant(1),&CComVariant(0));
                                      wordSelection.TypeText("采样");
                                      
                      wordSelection.MoveRight(&CComVariant(12),&CComVariant(1),&CComVariant(0));
                                      wordSelection.TypeText("百分比");
                                      
                      wordSelection.MoveRight(&CComVariant(12),&CComVariant(1),&CComVariant(0));
                                      wordSelection.TypeText("累计百分比");
                                      
                      wordSelection.EndOf(COleVariant((short)6),COleVariant((short)0));
                                      wordSelection.TypeParagraph();    
                                      wordSelection.TypeText("(1.2). 分段统计");
                                      
                      wordSelection.HomeKey(&CComVariant(5),&CComVariant(1));
                                      /Format the line with selection
                                      wordFont = wordSelection.GetFont();
                                      wordFont.SetBold(9999998);//wdToggle
                                      
                      wordSelection.EndOf(&CComVariant(5),&CComVariant(0));
                                      wordSelection.TypeParagraph();
                                      wordFont.SetBold(9999998);//wdToggle
                                      wordRange=wordSelection.GetRange();
                                      //add table
                                      //nRow=m_nRange1+1;
                                      
                      wordTable=wordTables.Add(wordRange,5/*row*/,4/*column*/,&defaultBehavior,&AutoFitBehavior);
                                      wordRange=wordTable.GetRange();
                                      //选择第一个单元,进而选择第一行进行格式化
                                      wordCell=wordTable.Cell(1,1);
                                      wordCell.Select();
                                      //select the row with current selection
                                      
                      wordSelection.EndKey(&CComVariant(10),&CComVariant(1));
                                      //Format the row with selection
                                      wordFont = wordSelection.GetFont();
                                      wordFont.SetBold(9999998);
                                      wordCells=wordSelection.GetCells();
                                      wordShading = wordCells.GetShading();
                                      wordShading.SetTexture(0);
                                      
                      wordShading.SetBackgroundPatternColor(14737632);//15987699
                                      
                      wordShading.SetForegroundPatternColor(-16777216);
                                      wordCell=wordTable.Cell(1,1);
                                      wordCell.Select();
                                      wordSelection.TypeText("Range");
                                      
                      wordSelection.MoveRight(&CComVariant(12),&CComVariant(1),&CComVariant(0));
                                      wordSelection.TypeText("Samples");
                                      
                      wordSelection.MoveRight(&CComVariant(12),&CComVariant(1),&CComVariant(0));
                                      wordSelection.TypeText("Percentage");
                                      
                      wordSelection.MoveRight(&CComVariant(12),&CComVariant(1),&CComVariant(0));
                                      wordSelection.TypeText("Calculation");
                                      //Save document as report
                                      SYSTEMTIMEsysTime;
                                      GetLocalTime(&sysTime);
                                      CStringstrReport;
                                      strReport.Format("%d年-%d月-%d日 %d-%d-%d 
                      报告",sysTime.wYear,sysTime.wMonth,
                                      
                      sysTime.wDay,sysTime.wHour,sysTime.wMinute,sysTime.wSecond);
                                      strReport=strPath+""""+strReport;
                                      
                      wordDoc.SaveAs(COleVariant(strReport),COleVariant((short)0),vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt);
                                      //Release com
                                      wordFont.ReleaseDispatch();
                                      wordCells.ReleaseDispatch();
                                      wordShading.ReleaseDispatch();
                                      wordTable.ReleaseDispatch();
                                      wordTables.ReleaseDispatch();
                                      wordRange.ReleaseDispatch();
                                      wordSelection.ReleaseDispatch();
                                      wordDoc.RecheckSmartTags();
                                      wordDocs.ReleaseDispatch();
                                      wordApp.ReleaseDispatch();
                                      returnTRUE;
                              }
                              注释如下:
                              
    1.使用之前比忘记先进行COM环境的初始化,最好放在BOOLCMDIDemoApp::InitInstance()里吧。
         //Initialize COM context
          if (FAILED(::CoInitialize(NULL)))
          {
                AfxMessageBox("Initialize COM context failed!");
                returnFALSE;}
    2.注意几个函数的用法:
       a) wordSelection.EndOf(COleVariant((short)6),COleVariant((short)0));
       b)wordSelection.EndKey(&CComVariant(10),&CComVariant(1));
       c) wordSelection.HomeKey(&CComVariant(5),&CComVariant(1));
       d) wordTable=wordTables.Add(wordRange,5/*row*/,4/*column*/,&defaultBehavior,&AutoFitBehavior);
                              
       这几个函数可以说是我收获最大的地方了,EndOf/EndKey/HomeKey实现了当前焦点的任意移动,比如到一个文档的末尾或者行尾、表格的操作位置等。举例来说:EndOf  (VARIANT* Unit, VARIANT* Extend) 
       其第二个参数Extend决定了你是单纯的移动光标还是扩展移动选中内容。通过VBA参考,你可以知道wdMove=0 wdExtend=1,这样就可以决定是移动还是扩展选择内容了。当然还有其他很多操作可以摸索,大可以先用word的宏录制,然后编写自己的VC代码,不过确实是个繁琐的过程,很多VBA常量需要查找具体的value替换。通过预先的模版,你可以实现打开一个word模版,然后添加你自己的内容,灵活应用。然后保存为自己的报告。请参阅我的例子自己实现吧。Enjoy it by yourself...... J由于时间关系,我还没有摸索通如何在word报告中插入图表(chart/bar/pie)以及如何插入图片jpg等,这样就可以做出图文并茂的报告了。如果你有经验,欢迎交流共享。

     

     

    来源:http://www.cnblogs.com/For-her/p/3499778.html

    展开全文
  • 计算机应用基础Word基础一、单项选择题1.选择下面的哪一项可以打开Word2010()A. Microsoft Outlook 2010B. Microsoft Power Point 2019C. Microsoft Word 2010D. Microsoft FrontPage 20102.下面说法中不正确的是()A...

    计算机应用基础Word基础

    一、单项选择题

    1.选择下面的哪一项可以打开Word2010()

    A. Microsoft Outlook 2010

    B. Microsoft Power Point 2019

    C. Microsoft Word 2010

    D. Microsoft FrontPage 2010

    2.下面说法中不正确的是()

    A.状态栏位于文档的底部,可以显示页面,字数、视图方式和显示比例等内容

    B.滚动条位于文档窗口的右侧和底边

    C.Word2010窗口界面和Word2003界面完全一样

    D.标题栏可以显示软件名称和文档名称

    3.在Word2010下文件第一次保存时,执行“文件”选项卡中的“保存”命令后()

    A.将所有打开的文档存盘

    B.只能将当前文档存储在已有的原文件夹内

    C.只可以将当前文档存储在已有的任意文件内

    D.可以先建立一个新文件夹,再将文档存储在该文件夹内

    4.在“开始”菜单的___下有 Microsoft Word2010选项。()

    A.文档

    B.程序

    C.设置

    D.运行

    5.鼠标指针指向功能区上的某一个按钮时,显示按钮名称的矩形块是()

    A.标记

    B.菜单

    C.工具提示信息

    D.帮助信息

    6,能够进行中英文切换的快捷键是()

    A .Shift+.

    B. Ctrl+Space

    C. Ctrl+ Shift

    D. Shift+ Space

    7.在Word2010中,当前编辑的文档是D盘中的W1.docx文档,要将文档复制到可移动

    设备,应当使用的下列哪个命令()

    A.“文件”选项卡中的“另存为”

    B.“文件”选项卡中的“保存”

    C.“文件”选项卡中的“新建”

    D.“插入”选项卡中的“文件”

    8.为了避免在编辑操作过程中突然断电造成数据丢失,应()。

    A.在新建文档时即保存文档

    B.在打开文档时即做存盘操作

    C.在编辑时每一段时间做一次存盘操作

    D.在文档编辑完毕时立即保存文档

    9.将插人点定位于句子“计算机应用基础”中的“基”与“础”之间,按一下 Delete

    键,则该句子变为()

    A.变为“计算机应用基

    B.变为“计算机应用础”

    C.剪贴板已经有了要剪切或复制的内容

    D.不变

    10.当功能区上的“剪切”和“复制”按钮呈灰色显示状态时,表示()

    A.此时只能从快捷菜单中调用“剪切”和“复制”命令

    B.在文档中没有选定任何内容

    C.剪切板已有了要剪切或复制的内容

    D.选定的内容太长,剪贴板放不下

    11.对所编辑文档中内容进行全部选中的快捷键是()

    A. Ctrl+A

    B. Ctrl+V

    C .Alt+A

    D .Ctrl+C

    12.在Word2010主窗口的右上角,可以同时显示的按钮是()

    A.最小化、还原和最大化

    B.还原,最大化和关闭

    C.最小化、还原和关闭

    D.还原和最大化

    13使用Ctrl+F快捷键,可以实现_______功能。()

    A.剪切

    B.打印

    C.替换

    D.查找

    14.在Word2010文档窗口要保存文档内容,除了可以使用窗口中功能区按钮外,还可以

    使用快捷键()

    A.Ctrl+D

    B. CIrl+X

    C. Ctrl+S

    D.Ctrl+W

    15.将插入光标移到文档左侧的非编辑区,这时光标变成向右倾斜的箭头,三击鼠标,

    这时选定的是()

    A.这一段文字

    B.一行文字

    C.一个矩形块

    D.整篇文档

    16.在Word2010的编辑状态,执行了“复制”命令后()

    A.被选择的内容复制到插入点处

    B.被选择的内容复制到剪贴板

    C.插人点所在段落内容被复制到剪贴板

    D.插人点所在段落内容被移动到剪贴板

    17.双击Word2010窗口的标题栏,会产生的效果是

    使()

    A.窗口最大化

    B.窗口关闭

    C.窗口还原

    D.窗口最大化或还原

    18.在输人文本时,如果当前行没有足够空间容纳正在输人的文字,那么,当输到行尾

    时,应该()

    A.按回车键,继续输入

    B.将鼠标移到下一行单击鼠标左键,继续输入

    C.将鼠标移到下一行双击鼠标左键,继续输人

    D.继续输入

    19.不能退出word2010的操作是

    A.“文件”选项卡中的“退出”

    B. Alt+ F4

    C.双击“标题栏”左侧的“控制菜单”

    D.单击“文件”选项卡中的“关闭”

    20如果想把“……”输入到文档中,使用的快捷键是()

    A. Shift+2

    B. Shift+6

    C.Alt+2

    D. Alt+6

    21.在Word2010文档编辑窗口中,将光标快速移动文件首部的快捷键是()

    A. Home

    B. Ctrl+Home

    C.End

    D. Cirl +End

    22在word2010中,将插入点定位在一个段落中,选中该段落的操作是()

    第2页(共4页)

    单击

    双击

    三击

    四击

    23.Word2010文件的扩展名为()

    A. .txt

    B. .docx

    C.

    展开全文
  • 相关文章: Python自动办公--Pandas玩转Excel【一】 ...python处理Excel实现自动办公教学(数据筛选、公式操作、单元格拆分合并、冻结窗口、图表绘制等)【三】 python入门之后须掌握的知识点(模块编程、时间.

     相关文章和数据源:

    Python自动化办公--Pandas玩转Excel【一】

    Python自动化办公--Pandas玩转Excel数据分析【二】

    Python自动化办公--Pandas玩转Excel数据分析【三】


    python处理Excel实现自动化办公教学(含实战)【一】

    python处理Excel实现自动化办公教学(含实战)【二】

    python处理Excel实现自动化办公教学(数据筛选、公式操作、单元格拆分合并、冻结窗口、图表绘制等)【三】


    python入门之后须掌握的知识点(模块化编程、时间模块)【一】

    python入门之后须掌握的知识点(excel文件处理+邮件发送+实战:批量化发工资条)【二】


    spandas玩转excel码源.zip-数据挖掘文档类资源-CSDN下载

    Python自动化办公(2021最新版!有源代码,).zip-

    Python自动化办公(可能是B站内容最全的!有源代码,).zip-

    上面是对应码源,图方便的话可以直接下载都分类分好了,当然也可以看文章。


    1.知识巩固excel

    这个系列文章主要以实例为主,学会每个demo,活学活用,办公效率提升飞快!

    1.1 xlrd+xlwt读写excel

    #安装命令:
    pip install xlrd
    
    pip install xlwt

    我们在读取文件的时候,excel的列是字母我们不容易直观看出来是第几列,下面对excel进行设置。

     操作如下

    import xlrd
    # 打开excel
    xlsx = xlrd.open_workbook('7月新.xls')
    
    sheet = xlsx.sheet_by_index(0)
    data = sheet.cell_value(5, 1)
    print(data)
    
    # for i in xlsx.sheet_names():
    #     print(i)
        # table = xlsx.sheet_by_name(i)
        # print(table.cell_value(3, 3))
    # 通过sheet名查找:xlsx.sheet_by_name("7月下旬入库表")
    # 通过索引查找:xlsx.sheet_by_index(3)
    # print(table.cell_value(0, 0))
    
    #单元格读取方式
    print(sheet.cell_value(1, 2))
    print(sheet.cell(0, 0).value)
    print(sheet.row(0)[0].value)
    
    
    # for i in range(0, xlsx.nsheets):
    #     sheet = xlsx.sheet_by_index(i)
    #     print(sheet.name)
        # print(sheet.cell_value(0, 0))
    #
    # # 获取所有sheet名字:xlsx.sheet_names()
    # # 获取sheet数量:xlsx.nsheets
    #
    # for i in xlsx.sheet_names():
    #     print(i)
        # table = xlsx.sheet_by_name(i)
        # print(table.cell_value(3, 3))
    import xlwt
    
    # 新建工作簿
    new_workbook = xlwt.Workbook()
    # 新建sheet
    worksheet = new_workbook.add_sheet('new_test')
    # 新建单元格,并写入内容-行列
    worksheet.write(1, 2, 'test')
    # 保存
    new_workbook.save('test.xls')

     

     1.2  xlutils设置格式

    xlutils整体没有pandas设置来的方便

    from xlutils.copy import copy
    import xlrd
    import xlwt
    
    # 安装:pip install xlutils
    
    tem_excel = xlrd.open_workbook('日统计.xls', formatting_info=True) #格式信息打开
    tem_sheet = tem_excel.sheet_by_index(0)
    
    new_excel = copy(tem_excel)
    new_sheet = new_excel.get_sheet(0)
    
    style = xlwt.XFStyle()
    
    # 字体
    font = xlwt.Font()
    font.name = '微软雅黑'
    font.bold = True
    # 18*20
    font.height = 360
    style.font = font
    
    # 边框:细线==THIN
    borders = xlwt.Borders()
    borders.top = xlwt.Borders.THIN
    borders.bottom = xlwt.Borders.THIN
    borders.left = xlwt.Borders.THIN
    borders.right = xlwt.Borders.THIN
    style.borders = borders
    
    # 对齐
    alignment = xlwt.Alignment()
    alignment.horz = xlwt.Alignment.HORZ_CENTER
    alignment.vert = xlwt.Alignment.VERT_CENTER
    style.alignment = alignment
    
    
    new_sheet.write(2, 1, 12)
    new_sheet.write(3, 1, 18)
    new_sheet.write(4, 1, 19)
    new_sheet.write(5, 1, 15)
    
    
    # new_sheet.write(2, 1, 12, style)
    # new_sheet.write(3, 1, 18, style)
    # new_sheet.write(4, 1, 19, style)
    # new_sheet.write(5, 1, 15, style)
    
    new_excel.save('填写.xls')
    

     

     1.3 自动生成统计报表【案例一:分数统计】

    
    import xlrd
    
    import xlwt
    
    # 读取excel文件
    xlsx = xlrd.open_workbook('三年二班(各科成绩单).xls')
    # 选择指定sheet
    sheet = xlsx.sheet_by_index(0)
    
    all_data = []
    # 统计共有多少学生,并去重
    num_set = set()
    for row_i in range(1, sheet.nrows):
        num = sheet.cell_value(row_i, 0)
        name = sheet.cell_value(row_i, 1)
        grade = sheet.cell_value(row_i, 3)
    
        student = {
            'num': num,
            'name': name,
            'grade': grade,
        }
        all_data.append(student)
        num_set.add(num)
    # print(all_data)
    # print(len(all_data))
    # print(len(num_set))
    
    # 计算总分
    sum_list = []
    for num in num_set:
        name = ''
        sum = 0
        for student in all_data:
            # print(student['num'])
            # print(num)
            if num == student['num']:
                sum += student['grade']
                name = student['name']
        sum_stu = {
            'num': num,
            'name': name,
            'sum': sum
        }
        sum_list.append(sum_stu)
    print(sum_list)
    
    # 写入新的excel
    
    # 新建工作簿
    new_workbook = xlwt.Workbook()
    # 新建sheet
    worksheet = new_workbook.add_sheet('2班')
    # 新建单元格,并写入内容
    # 写入第一列的内容
    worksheet.write(0, 0, '学号')
    worksheet.write(0, 1, '姓名')
    worksheet.write(0, 2, '总分')
    # 自动写入后面的内容
    for row in range(0,len(sum_list)):
        worksheet.write(row+1,0,sum_list[row]['num'])
        worksheet.write(row+1,1,sum_list[row]['name'])
        worksheet.write(row+1,2,sum_list[row]['sum'])
    # 保存
    new_workbook.save('2班学生总分.xls')
    

     1.4 xlsxwriter 和openpyxl

    xlwt会遇到不支持超过列256的表格

    # import xlwt
    #
    # workbook = xlwt.Workbook()
    # sheet0 = workbook.add_sheet('sheet0')
    # for i in range(0,300):
    #     sheet0.write(0,i,i)
    # workbook.save('num.xls')
    
    # 不带格式
    import xlsxwriter as xw
    workbook = xw.Workbook('number.xlsx')
    sheet0 = workbook.add_worksheet('sheet0')
    for i in range(0,300):
        sheet0.write(0,i,i)
    workbook.close()
    
    
    # 性能不稳定
    import openpyxl
    workbook = openpyxl.load_workbook('number.xlsx')
    sheet0 = workbook['sheet0']
    sheet0['B3']= '2'
    sheet0['C2']= '4'
    sheet0['D7']= '3'
    workbook.save('num_open.xlsx')

    1.5 xlwings和pandas

    pandas在第一期已经详细讲解过,参考相关文章

    Python用来处理Excel的全部可用库,以及它们的优缺点

    xlwings具有以下优点:

    - xlwings能够非常方便的读写Excel文件中的数据,并且能够进行单元格格式的修改
    - 可以和matplotlib以及pandas无缝连接
    - 可以调用Excel文件中VBA写好的程序,也可以让VBA调用用Python写的程序。
    - 开源免费,一直在更新

    #### 1、打开/新建Excel文档
    
    ```python
    import xlwings as xw
    wb = xw.Book()  # 新建一个文档
    wb = xw.Book('test.xlsx')  # 打开一个已有的文档
    ```
    
    #### 2、读取/写入数据
    
    ```python
    sht = wb.sheets['Sheet1'] # 找到指定sheet
    print(sht.range('A1').value) # 读取指定单元格的数据,这里读的是A1
    sht.range('B1').value = 10 # 给指定的空白单元格赋值,这里赋值的是B1
    ```
    
    #### 3、保存文件、退出程序
    
    ```python
    wb.save(r'test.xlsx') #保存Excel文档,命名为test.xlsx,并保存在D盘
    wb.close() # 退出程序,该步骤不可省略
    ```
    
    #### 4、连接pandas处理复杂数据
    
    ```python
    import pandas as pd
    df = pd.DataFrame([[1,2], [3,4]], columns=['a', 'b'])
    sht.range('A1').value = df
    sht.range('A1').options(pd.DataFrame, expand='table').value
    ```
    
    #### 5、连接**Matplotlib** 画图
    
    ```python
    import matplotlib.pyplot as plt
    fig = plt.figure()
    plt.plot([1, 2, 3, 4, 5])
    sht.pictures.add(fig, name='MyPlot', update=True)

    1.6 案例实战---把文件名整理到excel中

    import os
    import xlwt
    
    # 目标文件夹
    file_path = 'd:/'
    # 取出目标文件夹下的文件名
    os.listdir(file_path)
    
    new_workbook = xlwt.Workbook()
    sheet = new_workbook.add_sheet('new_dir')
    
    n = 0
    for i in os.listdir(file_path):
        sheet.write(n,0,i)
        n+=1
    new_workbook.save('dir.xls')

    1.7  案例实战---excel填充画

    把一幅画导入到excel中用每个单元格背景色生成原画

    # coding: utf-8
    
    from PIL import Image
    from xlsxwriter.workbook import Workbook
    
    
    class ExcelPicture(object):
        FORMAT_CONSTRAINT = 65536
    
        def __init__(self, pic_file, ratio=0.5):
            self.__pic_file = pic_file
    
            self.__ratio = ratio
            self.__zoomed_out = False
    
            self.__formats = dict()
    
        # 缩小图片
        def zoom_out(self, _img):
            _size = _img.size
            _img.thumbnail((int(_img.size[0] * self.__ratio), int(_img.size[1] * self.__ratio)))
    
            self.__zoomed_out = True
    
        # 对颜色进行圆整
        def round_rgb(self, rgb, model):
            return tuple([int(round(x / model) * model) for x in rgb])
    
        # 查找颜色样式,去重
        def get_format(self, color):
            _format = self.__formats.get(color, None)
    
            if _format is None:
                _format = self.__wb.add_format({'bg_color': color})
                self.__formats[color] = _format
    
            return _format
    
        # 操作流程
        def process(self, output_file='_pic.xlsx', color_rounding=False, color_rounding_model=5.0):
            # 创建xlsx文件,并调整行列属性
            self.__wb = Workbook(output_file)
            self.__sht = self.__wb.add_worksheet()
            self.__sht.set_default_row(height=9)
            self.__sht.set_column(0, 5000, width=1)
    
            # 打开需要进行转换的图片
            _img = Image.open(self.__pic_file)
            print('Picture filename:', self.__pic_file)
    
            # 判断是否需要缩小图片尺寸
            if self.__ratio < 1:
                self.zoom_out(_img)
    
            # 遍历每一个像素点,并填充对应的颜色到对应的Excel单元格
            _size = _img.size
            print('Picture size:', _size)
            for (x, y) in [(x, y) for x in range(_size[0]) for y in range(_size[1])]:
                _clr = _img.getpixel((x, y))
    
                # 如果颜色种类过多,则需要将颜色圆整到近似的颜色上,以减少颜色种类
                if color_rounding: _clr = self.round_rgb(_clr, color_rounding_model)
    
                _color = '#%02X%02X%02X' % _clr
                self.__sht.write(y, x, '', self.get_format(_color))
    
            self.__wb.close()
    
            # 检查颜色样式种类是否超出限制,Excel2007对样式数量有最大限制
            format_size = len(self.__formats.keys())
            if format_size >= ExcelPicture.FORMAT_CONSTRAINT:
                print('Failed! Color size overflow: %s.' % format_size)
            else:
                print('Success!')
                print('Color: %s' % format_size)
                print('Color_rounding:', color_rounding)
                if color_rounding:
                    print('Color_rounding_model:', color_rounding_model)
    
    
    if __name__ == '__main__':
        r = ExcelPicture('test.jpg', ratio=0.5)
        r.process('0407.xlsx', color_rounding=True, color_rounding_model=5.0)
    # 同级目录
    

    效果如下:

    原图

    下面可以看到有一点糊是因为填充单元格可以当作像素点来考虑

     

     2.自动化处理word

    安装库

    >pip install python-docx

    - python-docx
        - 说明文档:https://python-docx.readthedocs.io/en/latest/#api-documentation

    2.1 自动生成word【批量化写模板文档】

    from docx import Document
    from docx.enum.text import WD_ALIGN_PARAGRAPH
    from docx.shared import Pt
    from docx.oxml.ns import qn
    
    import time
    
    price = input('请输入工资调整金额:')
    # 全体员工姓名
    company_list = ['员工1', '员工1', '员工2', '员工3', '员工4',
                    '员工5', '员工6', '员工7', '员工8', '员工9', '员工10']
    # word和excel可以结合
    
    # excel学习:for
    # 当天的日期!
    today = time.strftime("%Y{y}%m{m}%d{d}", time.localtime()
                          ).format(y='年', m='月', d='日')
    
    for i in company_list:
        document = Document()
        # 设置文档的基础字体
        document.styles['Normal'].font.name = u'宋体'
        # 识别中文
        document.styles['Normal'].element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
    
        # 建立一个自然段
        p1 = document.add_paragraph()
        # 对齐方式为居中,没有这句的话默认左对齐
        p1.alignment = WD_ALIGN_PARAGRAPH.CENTER
        run1 = p1.add_run('关于%s工资调整的通知' % (today))
        run1.font.name = '微软雅黑'
        run1.element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
        run1.font.size = Pt(21)
        run1.font.bold = True
        p1.space_after = Pt(5)
        p1.space_before = Pt(5)
    
        p2 = document.add_paragraph()
        run2 = p2.add_run(i + ':')
        run2.font.name = '宋体'
        run2.element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
        run2.font.size = Pt(16)
        run2.font.bold = True
    
        p3 = document.add_paragraph()
        run3 = p3.add_run('因为疫情影响,我们很抱歉的通知您,您的工资调整为每月%s元,特此通知' % price)
        run3.font.name = '宋体'
        run3.element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
        run3.font.size = Pt(14)
    
        p4 = document.add_paragraph()
        p4.alignment = WD_ALIGN_PARAGRAPH.RIGHT
        run4 = p4.add_run('人事:王小姐 电话:686868')
        run4.font.name = '宋体'
        run4.element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
        run4.font.size = Pt(14)
        run4.font.bold = True
    
        document.save('%s-工资调整通知.docx' % i)
    

    其中在读取员工信息这块可以和excel结合。

     

    2.2 批量化写模板文档【并添加图片和表格】

    新的要求,要求小杨在通知函上方加上图片红头,价格数据以表格形式展示。并在第二页加
    上广告【插入分页符】。

    效果如下:

    from docx import Document
    from docx.enum.text import WD_ALIGN_PARAGRAPH
    from docx.shared import Pt
    from docx.oxml.ns import qn
    from docx.shared import Inches
    
    import time
    
    price = input('请输入工资调整金额:')
    company_list = ['员工1', '员工1', '员工2', '员工3', '员工4',
                    '员工5', '员工6', '员工7', '员工8', '员工9', '员工10', ]
    today = time.strftime("%Y{y}%m{m}%d{d}", time.localtime()
                          ).format(y='年', m='月', d='日')
    for i in company_list:
        document = Document()
        # 设置文档的基础字体
        document.styles['Normal'].font.name = u'宋体'
        document.styles['Normal'].element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
    
        # 红头文件加入文件
        document.add_picture('title002.jpg', width=Inches(6))
    
        # 建立一个自然段
        p1 = document.add_paragraph()
        # 对齐方式为居中,没有这句的话默认左对齐
        p1.alignment = WD_ALIGN_PARAGRAPH.CENTER
        run1 = p1.add_run('关于%s工资调整的通知' % (today))
        run1.font.name = '微软雅黑'
        run1.element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
        run1.font.size = Pt(21)
        run1.font.bold = True
        p1.space_after = Pt(5)
        p1.space_before = Pt(5)
    
        p2 = document.add_paragraph()
        run2 = p2.add_run(i + ':')
        run2.font.name = '宋体'
        run2.element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
        run2.font.size = Pt(16)
        run2.font.bold = True
    
        p3 = document.add_paragraph()
        run3 = p3.add_run('因为疫情影响,我们很抱歉的通知您,您的工资调整为每月%s元,特此通知。' % price)
        run3.font.name = '宋体'
        run3.element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
        run3.font.size = Pt(14)
        
        #添加表格
        table = document.add_table(rows=2, cols=2, style='Table Grid')#默认格式
        # 合并单元格
        table.cell(0, 0).merge(table.cell(0, 1)) #坐上合并到右下
        table_run1 = table.cell(0, 0).paragraphs[0].add_run('签名栏')
        table_run1.font.name = '黑体'
        table_run1.element.rPr.rFonts.set(qn('w:eastAsia'), u'黑体')
        table.cell(0, 0).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
        table.cell(1, 0).text = i
        table.cell(1, 0).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
        
       
        p4 = document.add_paragraph()
        p4.alignment = WD_ALIGN_PARAGRAPH.RIGHT
    
        run4 = p4.add_run('人事:王小姐 电话:686868')
        run4.font.name = '宋体'
        run4.element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
        run4.font.size = Pt(14)
        run4.font.bold = True
        
            #插入分页符
        document.add_page_break()
        p5= document.add_paragraph()
        run4=p5.add_run("此处是广告")
    
        document.save('%s-工资调整通知.docx' % i)
    

    2.3 读取word文档【 文字+表格混合文档:

    from docx import Document
    
    document = Document('pure.docx')
    all_paragraphs = document.paragraphs
    for p in all_paragraphs:
        print(p.text)
    
    
    # excel写入

     如果word里是表格呈现读取如下:

     文字+表格形式:

    word基本格式问题:把word重名后缀为zip的文件,打开看到里面有xml的格式文件

     导入zipfile库解压文件,设置格式只读取我们需要的文字:进行组合。

    import zipfile
    
    word_book = zipfile.ZipFile('word_table.docx')
    xml = word_book.read("word/document.xml").decode('utf-8')
    # print(xml)
    xml_list = xml.split('<w:t>')
    # print(xml_list)
    text_list = []
    for i in xml_list:
        if i.find('</w:t>') + 1:
            text_list.append(i[:i.find('</w:t>')])
        else:
            pass
    text = "".join(text_list)
    print(text)
    

    2.4 word转pdf(批量化)

    安装库:

    pip install pywin32
    from win32com.client import Dispatch,constants,gencache
    
    doc_path = 'test.docx'
    pdf_path = 'test.pdf'
    
    gencache.EnsureModule('{00020905-0000-0000-C000-000000000046}',0,8,4)
    wd = Dispatch("Word.Application")
    doc = wd.Documents.Open(doc_path,ReadOnly=1)
    doc.ExportAsFixedFormat(pdf_path,constants.wdExportFormatPDF,
                            Item=constants.wdExportDocumentWithMarkup,
                            CreateBookmarks=constants.wdExportCreateHeadingBookmarks)
    wd.Quit(constants.wdDoNotSaveChanges)

    在执行时报错了,下面来说解决方法。
    参考网站:

    win32api pywin32 安装后出现 ImportError: DLL load failed_mengfanteng的博客-CSDN博客

    • 找到我们安装python的文件夹,在Lib文件中找到site-packages\pywin32_system32
    • D:\Program Files (x86)\Python\Python36\Lib\site-packages\pywin32_system32
    • 把里面的所有的文件复制到:C:\Windows\System32
    import os
    from win32com.client import Dispatch,constants,gencache
    
    
    
    from docx import Document
    from docx.enum.text import WD_ALIGN_PARAGRAPH
    from docx.shared import Pt
    from docx.oxml.ns import qn
    
    import time
    
    price = input('请输入工资调整金额:')
    # 全体员工姓名
    company_list = ['员工1', '员工1', '员工2', '员工3', '员工4', '员工5', '员工6', '员工7', '员工8', '员工9', '员工10' ]
    # 当天的日期
    today = time.strftime("%Y{y}%m{m}%d{d}", time.localtime()).format(y='年', m='月', d='日')
    
    for i in company_list:
        document = Document()
        # 设置文档的基础字体
        document.styles['Normal'].font.name = u'宋体'
        # 识别中文
        document.styles['Normal'].element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
    
        # 建立一个自然段
        p1 = document.add_paragraph()
        # 对齐方式为居中,没有这句的话默认左对齐
        p1.alignment = WD_ALIGN_PARAGRAPH.CENTER
        run1 = p1.add_run('关于%s工资调整的通知' % (today))
        run1.font.name = '微软雅黑'
        run1.element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
        run1.font.size = Pt(21)
        run1.font.bold = True
        p1.space_after = Pt(5)
        p1.space_before = Pt(5)
    
        p2 = document.add_paragraph()
        run2 = p2.add_run(i + ':')
        run2.font.name = '宋体'
        run2.element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
        run2.font.size = Pt(16)
        run2.font.bold = True
    
        p3 = document.add_paragraph()
        run3 = p3.add_run('因为疫情影响,我们很抱歉的通知您,您的工资调整为每月%s元,特此通知' % price)
        run3.font.name = '宋体'
        run3.element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
        run3.font.size = Pt(14)
    
        p4 = document.add_paragraph()
        p4.alignment = WD_ALIGN_PARAGRAPH.RIGHT
        run4 = p4.add_run('人事:王小姐 电话:686868')
        run4.font.name = '宋体'
        run4.element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
        run4.font.size = Pt(14)
        run4.font.bold = True
    
    
        document.save('%s-工资调整通知.docx' % i)
    
        doc_path = '%s-工资调整通知.docx' % i
        pdf_path = '%s-工资调整通知.pdf' % i
    
        gencache.EnsureModule('{00020905-0000-0000-C000-000000000046}',0,8,4)
        wd = Dispatch("Word.Application")
        doc = wd.Documents.Open(doc_path,ReadOnly=1)
        doc.ExportAsFixedFormat(pdf_path,constants.wdExportFormatPDF,Item=constants.wdExportDocumentWithMarkup,CreateBookmarks=constants.wdExportCreateHeadingBookmarks)
        wd.Quit(constants.wdDoNotSaveChanges)
        time.sleep(10)

    3.PDF识别以及读取PDF中文字【pdf合并】

    3.1 使用 pdfplumber和PyPDF2

    安装库:

    pip install pdfplumber
    
    pip install PyPDF2

    参考文章:

    PDFPlumber使用入门_顺其自然~的博客-CSDN博客_pdfplumber

    import PyPDF2
    import pdfplumber
    
    def extract_content(pdf_path):
        # 内容提取,使用 pdfplumber 打开 PDF,用于提取文本
        with pdfplumber.open(pdf_path) as pdf_file:
            # 使用 PyPDF2 打开 PDF 用于提取图片
            pdf_image_reader = PyPDF2.PdfFileReader(open(pdf_path, "rb"))
            print(pdf_image_reader.getNumPages())
    
            content = ''
            # len(pdf.pages)为PDF文档页数,一页页解析
            for i in range(len(pdf_file.pages)):
                print("当前第 %s 页" % i)
                # pdf.pages[i] 是读取PDF文档第i+1页
                page_text = pdf_file.pages[i]
                # page.extract_text()函数即读取文本内容
                page_content = page_text.extract_text()
                if page_content:
                    content = content + page_content + "\n"
                    print(page_content)
    
    extract_content('静夜思.pdf')

    合并pdf

    from PyPDF2 import PdfFileReader, PdfFileWriter
    
    def merge_pdfs(paths, output):
        pdf_writer = PdfFileWriter()
    
        for path in paths:
            pdf_reader = PdfFileReader(path)
            for page in range(pdf_reader.getNumPages()):
                # 把每张PDF页面加入到这个可读取对象中
                pdf_writer.addPage(pdf_reader.getPage(page))
    
        # 把这个已合并了的PDF文档存储起来
        with open(output, 'wb') as out:
            pdf_writer.write(out)
    
    if __name__ == '__main__':
        paths = ['静夜思.pdf', '静夜思.pdf']
        merge_pdfs(paths, output='pandas官方文档中文版.pdf')
    from PyPDF2 import PdfFileReader, PdfFileWriter
    
    def merge_pdfs(paths, output):
        pdf_writer = PdfFileWriter()
    
        for path in paths:
            pdf_reader = PdfFileReader(path)
            for page in range(pdf_reader.getNumPages()):
                # 把每张PDF页面加入到这个可读取对象中
                pdf_writer.addPage(pdf_reader.getPage(page))
    
        # 把这个已合并了的PDF文档存储起来
        with open(output, 'wb') as out:
            pdf_writer.write(out)
    
    if __name__ == '__main__':
        paths = ['study.pdf', 'labuladong的算法小抄官方完整版.pdf']
        merge_pdfs(paths, output='pandas官方文档中文版.pdf')

    3.2 pdfminer(推荐)

    读取:

     4.ppt自动化操作

     python-pptx说明文档
        - https://pypi.org/project/python-pptx/

    # pip install python-pptx

    4..1在ppt中写入文字

    
    
    from pptx import Presentation
    from pptx.util import Inches,Pt
    
    ppt = Presentation()
    slide = ppt.slides.add_slide(ppt.slide_layouts[1])# 在PPT中插入一个幻灯片
    
    body_shape = slide.shapes.placeholders
    # body_shape[0].text = '这是占位符0'
    # body_shape[1].text = '这是占位符1'
    #
    title_shape = slide.shapes.title
    title_shape.text = '这是标题'
    # subtitle = slide.shapes.placeholders[1] #取出本页第二个文本框
    # subtitle.text = '这是文本框'
    #
    # new_paragraph = body_shape[1].text_frame.add_paragraph()
    # new_paragraph.text = '新段落'
    # new_paragraph.font.bold = True
    # new_paragraph.font.italic = True
    # new_paragraph.font.size = Pt(15)
    # new_paragraph.font.underline = True
    #
    left = Inches(2)
    top = Inches(2)
    width = Inches(3)
    height = Inches(3)
    #
    #
    #
    textbox = slide.shapes.add_textbox(left,top,width,height)
    textbox.text = 'new textbox'
    # 如何在文本框里添加第二段文字?
    # new_para = textbox.text_frame.add_paragraph()
    # new_para.text = '第二段文字'
    #
    
    
    ppt.save('test.pptx')

    4.2 在ppt插入图片表格

    
    # pip install python-pptx
    from pptx import Presentation
    from pptx.util import Inches,Pt
    
    ppt = Presentation()
    slide = ppt.slides.add_slide(ppt.slide_layouts[1])# 在PPT中插入一个幻灯片
    
    left = Inches(1)
    top = Inches(1)
    width = Inches(2)
    height = Inches(2)
    
    img = slide.shapes.add_picture('img.jpg',left,top,width,height)
    
    rows = 2
    cols = 2
    left = Inches(1)
    top = Inches(1)
    width = Inches(4)
    height = Inches(4)
    
    table = slide.shapes.add_table(rows,cols,left,top,width,height).table
    table.columns[0].width = Inches(1)
    table.columns[1].width = Inches(3)
    table.cell(0,0).text = '00'
    table.cell(0,1).text = '01'
    table.cell(1,0).text = '10'
    table.cell(1,1).text = '11' #二进制的11,代表十进制的多少?
    
    ppt.save('text.pptx')
    

    展开全文
  • 词语向量-word2vec简介和使用

    万次阅读 多人点赞 2017-06-09 02:39:47
    前言最初听闻word2vec还在读研了。当时挺感兴趣的,不过一直忙于毕业事项,没好好研究下,对word2vec也只是概念上的了解,直到这两天有空才能专门学习下这方面...本文主要从我的学习经历介绍下word2vec,还是以实践为
  • 推荐 Word、EXCEL必备工具箱

    千次阅读 2019-09-20 09:41:36
    1、添加函数:JoinStr函数,数据里有0.3之类小数,存在转换结果会不显示前面的0的问题,已经改进。 2、处理工具→公式助手→提取唯一值函数改进,更加方便实用。 3、添加函数→小写金额函数XXJE,将超过亿元...
  • (数组中保存起始位置就好了,结束位置一定是最后) AC自动机 数组缺失 二叉树遍历 前序 中序 后序 进一步思考 二叉树序列/反序列 先序中序后序两两结合重建二叉树 先序遍历 中序遍历 后序遍历 层次遍历 输入某...
  • monitor被占用就会处于锁定状态,线程执行monitorenter指令尝试获取monitor的所有权,过程如下: 1.如果monitor的进入数为0,则该线程进入monitor,然后将进入数设置为1,该线程即为monitor的所有者。 2.如果...
  • Qt实现Word文档界面样式--QtitanRibbon

    万次阅读 2017-12-04 17:03:29
    QtitanRibbon - Microsoft Ribbon for Nokia's Qt概念的实现 ...这个组件和Qt一道为获取一些应用提供了一个难得的机会,这些应用在全球三大主要平台Windows、Linux和Mac OS X上都有现代的外观和感觉。 Qtitan
  • 视图是基于数据表的一种查询窗口。不能在这种查询窗口中再建数据表。从用户角度来看,一个视图是从一个特定的角度来查看数据库中的数据。从数据库系统内部来看,一个视图是由SELECT语句组成的查询定义的虚拟表。从...
  • Word快捷键

    千次阅读 2013-11-16 14:34:34
    对于刚打开的文档,移至上一次关闭文档  插入点所在位置 ◆ 在表格中移动 快捷键 光标移至 Tab  一行中的下一个单元格 Shift+Tab  一行中的上一个单元格 Alt+Home  一行中的第一个单元格 ...
  • word2016所有快捷键汇总-微软官方

    千次阅读 2020-03-31 17:44:29
    本文介绍 windows 中 word2016 的所有快捷键及自定义快捷键的方式。
  • 出现问题: ...尝试在C:\Program Files\Microsoft Office\root\Office16下打开word,具体就是在C:\Program Files\Microsoft Office\root\Office16下打开WINWORD.EXE,再打开需要转换公式的文...
  • Word 2的15次方怎么打

    千次阅读 2021-07-29 04:28:54
    1回答2020-12-01浏览:39分类:办公入门回答:你可以首先在中文输入状态下 按住caPS lock 在按shift+ctrl+k试试看中文状态下 你的软键盘设置的的快捷键是不是shift+ctrl+k ,是的话在大写开着会切换锁定了大写3....
  • NLP 之 word2vec 以及负采样原理详解

    千次阅读 多人点赞 2019-07-28 16:25:29
    的导师让博研究以下人机对话,上周花了一周的时间研究了一下word2vec。下面以这篇博客来总结一下博word2vec的理解。如果有错误的地方,欢迎大家在评论区进行批评指正。    word2vec是谷歌于2013...
  • 关于NLP中,有各种不同的表达,如:词向量、word embedding、分布式表示、word2vec、glove等等,这一锅粥的名词术语分别代表什么,他们具体的关系是什么,他们是否处于平级关系? 希望写完这篇文章后,自己能清楚地...
  • 基于Word2Vec的相似度计算(python)

    万次阅读 多人点赞 2018-07-11 13:51:25
    前言 ...词向量(word2vec)是一个将单词转换成向量形式的工具。可以把对文本内容的处理简化为向量空间中的向量运算,计算出向量空间上的相似度,来表示文本语义上的相似度。 在自然语言处理(NLP...
  • Word2Vec

    千次阅读 2018-10-16 22:41:13
    版权声明:本文为博原创文章,可随意转载,但请注明作者和出处。 https://blog.csdn.net/LeYOUNGER/article/details/78206832 摘要 关键词: Glove,word2vec,NNLM,...
  • word技巧

    千次阅读 2018-03-01 21:40:22
    word 高效经典教程(整理版)目录一分钟驾驭word 高效经典教程(整理版)... 6A、基础知识... 61、度量单位... 62、WORD中文字字号与磅的对应关系... 63、字体文件格式... 7B、文本编辑... 71、快速移动文档... 72、...
  • 【计算机基础】03-Word知识

    万次阅读 2020-05-09 13:41:13
    第3章 文字处理软件 Word 2010 3.1 初始Office 2010 Office 2010组件包括Word(文字处理软件)、Excel(电子表格软件)、PowerPoint(幻灯片制作软件)、Outlook(个人信息管理软件)、Access(关联式数据库管理...
  • import win32guiimport win32conimport win32api# 从顶层窗口向下搜索主窗口,无法搜索子窗口# FindWindow(lpClassName=None, lpWindowName=None) 窗口类名 窗口标题名handle = win32gui.FindWindow("Notepad", None...
  • 一、修改应用程序窗口的外观   对于MFC应用程序来说,为了改变MFC AppWizard自动生成的应用程序外观和大小,既可以在应用程序窗口创建之前进行,也可以在该窗口创建之后进行。 首先新建一个单文档类型的MFC ...
  • 人工智能遇上安全》系列博客,详细介绍人工智能与安全相关的论文、实践,并分享各种案例,希望您喜欢。前一篇文章分享了张超大佬的两次报告,带领大家了解Fuzzing,第一篇是学术论文相关的“数据流敏感的漏洞...
  • Python对Windows程序窗口的操作

    千次阅读 2021-10-25 15:36:23
    hwnd = win32gui.FindWindow(lpClassName=None, lpWindowName=None) # 查找窗口,不找子窗口,返回值为0表示未找到窗口 hwnd = win32gui.FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=...
  • 很多软件除了可以GUI方式操作外还可以用CLI接口操作,不过一些软件未提供CLI接口,我们应该怎么办呢?我们还可以用程序控制桌面上的窗口、模拟点击鼠标或按下键盘等动作来释放自己。pywin32是一个Python库,它为...
  • 获取当前窗口句柄:GetForegroundWindow() [DllImport(“user32.dll”, CharSet = CharSet.Auto, ExactSpelling = true)] public static extern IntPtr GetForegroundWindow(); 返回值类型是IntPtr,即为当前获得焦点...
  • 所以这段空窗期除了应对仅仅一门课的期末考试,也准备在会议期间学习QT,尽量能为实验室做出一款可视的VVC码流分析软件。 我的学习方式是收集一些QT的源码,边改动边理解,直接记下自己的学习笔记。希望会对大家...
  • 程序员必知的 89 个操作系统核心概念

    万次阅读 多人点赞 2020-03-31 19:13:39
    X Window System:X 窗口系统(X11,或简称X)是用于位图显示窗口系统,在类 UNIX 操作系统上很常见。 Gnome:GNOME 是一个完全由自由软件组成的桌面环境。它的目标操作系统是Linux,但是大部分的 BSD 系统亦支持...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,355
精华内容 7,742
关键字:

当word主窗口最大化显示时