精华内容
下载资源
问答
  • Word97文字处理软件培训教案

    千次阅读 2007-07-03 21:24:00
    Word97 中文字处理软件的应用 基本要求 1.了解中文字处理软件Word的功能、特点、运行环境、启动和退出 2.了解窗口组成,掌握窗口操作 3.熟练掌握建立、打开、关闭、保存、另存为等文件的基本操作 4.熟练掌握...

    Word97 中文字处理软件的应用

     基本要求

      1.了解中文字处理软件Word的功能、特点、运行环境、启动和退出

      2.了解窗口组成,掌握窗口操作

      3.熟练掌握建立、打开、关闭、保存、另存为等文件的基本操作

      4.熟练掌握文本和表格的基本编辑操作

      5.掌握各种对象的插入和编辑

      6.熟练掌握字符、段落和页面的格式设置

      7.掌握拼写和语法检查、字数统计等工具

      8.熟练掌握打印的设置方式

    Word 概述:
    Microsoft Office 集成软件
    · Word       字处理(中西文混排、表格处理、图文混排)
    · Excel      电子表格(基于规范二维表的数据统计软件)
    · Powerpoint 演示文稿(集多种媒体于一体的幻灯片软件)
    · Access     数据库管理系统
    · Outlook    桌面管理系统

    主要操作方法: A) 菜单法 B) 按钮法 C) 右击法 D) 快捷键、鼠标拖放操作、键盘操作等


    第一章      Word97的基本知识

     

    1.1 Word的启动
    ·  "开始"菜单/程序/Microsoft Word
    ·  开始/打开OFFICE文档
    ·  开始/新建OFFICE文档
    ·  桌面快捷方式
    ·  应用已有的Word文档启动Word

    1.2 Word的退出:
    ·  关闭"按钮
    ·  "文件"菜单
    ·  快捷键(Alt+F4)
    ·  系统控制菜单
    ·  双击图标

    1.3 Word的窗口操作
     
    1.3.1  认识Word窗口

    1.3.2  窗口操作:调“窗口”菜单

    ·   窗口的拆分与取消拆分:菜单法、滚动条法
    ·   多文档窗口间的切换
    ·   多文档窗口的重排
    ·   建立文档副本新窗口

    1.3.3  视图操作:调“视图”菜单、或点文档窗口左下角的按钮(★★下载范例★★)

    ·   普通:只显示文档的内芯,适用于文字编辑。
    ·   页面:显示整页(包括内芯和边距),适用于格式设置。
    ·   大纲:使用标题样式后可以分级显示纲要式文档。(例:显示三级标题层次)
    ·   联机版式:使用标题样式后可以按“目录+内容”的方法显示文档。(相关菜单项“视图/文档结构图”)

    1.3.4  工具栏:调菜单“视图/工具栏/...”、或右击菜单栏和工具栏后调用
    ·   打开或关闭
    ·   固定或浮动
    ·   独占一行或重叠排列
    ·   工具栏允许自定义:调菜单“视图/工具栏/自定义”后进行自定义操作
    ·   新建工具栏并添加按钮
    ·   工具栏的选项设置:如屏幕提示、菜单打开方式
    1.3.5 辅助编辑项目
    ·   标尺、坐标线、段落标记:调菜单“视图/...”进行设置
    ·   状态栏、滚动条、格式编辑符:调菜单“工具/选项”的<视图>标签进行设置
    ·  “显示/隐藏编辑标记”按钮:用于控制格式编辑符的显示或隐藏
    ·   显示比例:菜单法、按钮法

    1.4 文件操作

    1.4.1 新建、打开、保存、关闭和更名保存文档

    ·  文件菜单法/按钮法/快捷键法
    ·  操作实例:利用“中文信函和传真”模板建立一个专业型信函。
                  启动word97程序新建一个文档,并在其中输入“全国计算机职考”,以“WD1.DOC”作为文件名保存在桌面中 退出
                  打开桌面中的“WD1.DOC”,并将其以文件名“WD2.DOC”保存在C盘上的“my documents”文件夹下。

    1.4.2 为文档保护和权限密码设置
    ·  工具/保护文档  工具/选项/保存
    ·  操作实例:WD1.DOC”在保存时将打开权限密码设置为“123”,修改权限密码设置为“456”。


    第二章 文本编辑及格式化操作

    2.1  文字的输入
    2.1.1 输入环境设置
    · 取消自动套用格式:调菜单“工具/自动更正”...(如:句首大写)
    · 取消自动缩进:调菜单“工具/选项”的<编辑>选项卡...
    2.1.1 编辑键
    · 移动光标的方向键:↑、↓、←、→ 
    · 移动到行首或行尾:Home、End      
    · 上下翻页:        PgUp、PgDn     
    · 移动到文首或文末:Ctrl+Home、Ctrl+End
    · 向前和向后删除:  ←Backspace、Delete
    · 空格、换行、换段:Space、Shift+Enter、Enter
    · “插入和改写”状态的切换:调菜单“工具/选项”的<编辑>标签...
    2.1.2 字符的选取
    · 鼠标拖放法
    · 鼠标点击法
    · 键盘法:Shift+编辑键
    2.1.3 插入各种对象:调菜单“插入/...”
    · 插入日期和时间
    · 插入特殊符号
    · 插入不同格式的数字
    · 插入页码
    · 插入目录
    2.1.4 基本的输入原则:只有在标题、空格、段落结束时才按下“回车键”。
    2.1.5 输入技巧
    · 自动更正
    · 自动图文集
    · 操作实例:输入唐诗《静夜思》         

    2.2、文档的编辑:调菜单“编辑”
    2.2.1 撤消(Ctrl+Z)与恢复(Ctrl+Y)
    2.2.2 复制与移动
    · 复制方法:选取->复制(Ctrl+C)->目标位->粘贴(Ctrl+V)  (菜单法/按扭法/快捷键)
       复制技巧:选取后按住Ctrl键拖到目标位/右键拖动法
    · 移动方法:选取->剪切(Ctrl+X)->目标位->粘贴(Ctrl+V)   (菜单法/按扭法/快捷键)
       移动技巧:选取后直接拖到目标位
    2.2.3 选择性粘贴
    2.2.4 多种查找和替换方式
    2.2.5 光标定位
    2.2.6 拼写/语法检查
    2.2.7 字数统计

     


    第三章 基本格式设置(文字、段落、边框和底纹)

    3.1 文字格式
    · 格式/字体、格式工具栏(部分)、右击法
    · 基本字体:黑、宋、楷、仿宋
    · 字号:度量单位为“号、磅”的矢量字(五号=10.5磅、小四号=12磅、四号=14磅、小三号=15磅、三号=16磅、小二号=18磅、二号=22磅、小

    一号=24磅、一号=26磅)
    · 文字方向
    · 操作实例:制作如格式范例1.doc(★★下载格式范例1.doc★★)

    3.2 段落的格式
    · 文档中的对齐
       操作方法:格式/段落、格式工具栏、右击法
       标题:居中
       正文:两端对齐(解决段落内行尾间的对齐)
    · 行距
       最小值:可以保持行之间的最小间距且不重叠
       固定值:行距固定不改变,允许行重叠
    · 缩进
       首行缩进
       左缩进
       右缩进
       悬挂缩进
       操作方法:格式/段落、标尺缩进按钮法
      
    3.3 项目符号和编号
    · 调用方法:插入/项目符号和编号,项目符号和编号按钮
    · 自动套用项目符号和编号:调菜单“工具/自动更正”...
    · 多级符号允许自定义
    · 操作实例:

     

    计算机硬件系统
    在计算机系统中所使用的电子线路和物理设备,是看得见、摸得着的实体,如中央处理器( CPU )、存储器、外部设备(输入输出设备、I/O设备)及总线等。
    存储器。主要功能是存放程序和数据,程序是计算机操作的依据,数据是计算机操作的对象。存储器是由存储体、地址译码器 、读写控制电路、地址总线和数据总线组成。能由中央处理器直接随机存取指令和数据的存储器称为主存储器,磁盘、磁带、光盘等大容量存储器称为外存储器(或辅助存储器) 。由主存储器、外部存储器和相应的软件,组成计算机的存储系统。
    外部设备是用户与机器之间的桥梁。输入设备的任务是把用户要求计算机处理的数据、字符、文字、图形和程序等各种形式的信息转换为计算机所能接受的编码形式存入到计算机内。输出设备的任务是把计算机的处理结果以用户需要的形式(如屏幕显示、文字打印、图形图表、语言音响等)输出。输入输出接口是外部设备与中央处理器之间的缓冲装置,负责电气性能的匹配和信息格式的转换。
    中央处理器的主要功能是按存在存储器内的程序 ,逐条地执行程序所指定的操作。中央处理器的主要组成部分是:
    数据寄存器
    指令寄存器
    指令译码器
    算术逻辑部件
    操作控制器
    程序计数器
    地址寄存器。

        a、 将标题设置成“黑体、二号”,并“居中”排列;
        b、 将1、2、3段首行缩进两个字符
        c、将文章中所有文字“计算机”替换成“computer”;
        d、全文设置行间距为“最小值18磅”;
        e、文章第一段首字“在”设置成“下沉”格式 字体:隶书 下沉3行;
        f、对当前文档的最后七行设置“ν”形项目符号(项目符号与行首对齐)。
        g、将“外部设备…”自然段中字符间距设为“加宽1.3磅”,“两分栏”排列;
        h、在页面底端插入页码,位置居中。(视图/页眉和页脚)


     [思考题] 多种“替换”方式
        i、将正文前2段中的文字“计算机”替换为“computer”,其它段落中的“计算机”不变;
        j、将文章中所有的文字“我们”替换成格式为“红色、斜体”的“People”;
        k、删除全文中所有的“计算机”;


    3.4 边框
    · 应用范围:文字、段落、表格、页面
    · 文字的默认边框
    · 操作方法:格式/边框和底纹

         
    3.5 底纹
    · 应用范围:文字、段落、表格
    · 文字的默认底纹
    · 操作方法:格式/边框和底纹
    · 操作实例:吉祥如意
                 合肥市行政事业单位文件

      △“吉祥如意”的主要格式
        A 隶书、初号字、斜体、居中、红色文字、阴影字、空心字;
        B 前3字字符间距8磅、中间2字字符升高12磅;
        C 加应用范围为“段落”的“花线、蓝色、3磅、带阴影”的边框和“黄色底纹”;
        D 段落左右缩进2厘米
      △“文件头”的主要格式
        A 标题“黑体、50磅字号、加粗、字符缩放50%、整行内分散对齐、红色文字”;
        B 文号“宋体、四号、居中”;(注意:字符无缩放、黑色文字)
        C 分隔线为“应用于段落的自定义下边框(红色、4.5磅粗线)”,与文号的下边距为12磅。
    3.6 格式的复制和删除
    · 格式刷的使用(单击取格式只能刷1次,双击取格式可以反复刷)
    · 重新设定格式、或者选择性粘贴/纯文本

     


    第四章 排版和打印设置
    4.1 页面设置
    · 选择纸张大小
    · 自己定义纸张大小
    · 纸张横向和纵向
    · 设置页边距
    · 操作方法:调菜单“文件/页面设置”
    · 文档应具有统一的内芯(边距的设置决定页面内的行数与字数)
    · 16K:纸张大小18.4*26/内芯14.6*21.6(上下1.9/左右2.2:39行*39字/正文五号宋体)
    · A4: 纸张大小21*29.7/内芯15.6*22.5(上下3.7/左右2.7:22行*28字/正文三号仿宋)
    4.2 文本修饰
    · 页眉和页角(各页相同)
       调用方法:视图/页眉
    · 页眉和页角编辑
       调用方法:页眉/页脚工具栏
    · 插入分页符
    · 页面边框
    · 添加行号
    · 自动套用格式
    · 样式库
    · 操作实例:
                打开“射雕英雄传.doc”
                a、为文档加上页眉文字“射雕英雄传”,并居中,页脚加上页码,格式为“1,2,3”且居中。
                b、将二、三两段设置为两栏格式,间距为1cm,要求加分隔线
                c、为整篇文章的所有页面加上艺术型页面边框中的“苹果”。

                d、为第一个页面加上艺术型边框中的第一个艺术型,第二个页面加上第二个艺术型边框。

    4.3 打印预览
    · 调用方法:文件/打印预览、打印预览按钮法
    · 单页显示
    · 多页显示
    · 放大
    · 缩至整页
    · 全屏显示
    4.4 打印设置
    · 调用方法:文件/打印
    · 选择打印页面范围
    · 执行/取消打印
    · 双面打印
    · 奇数页/偶数页
    · 操作实例:
                设置“射雕英雄传.doc”纸张大小为16开,上、下、左、右边距都为2CM,设定每页中可以打印40行。


    第五章 表格
    5.1 认识表格、表格的组成
    · 行
    · 列
    · 单元格(1*1一般被称为表头)
    · 嵌套表格  
    5.2 插入新表格
    · 菜单法
    · 按钮法
    · 绘制法:打开“表格和边框”工具栏
    · 转换法 
    · 操作实例:用以上四种方法绘制一个当前月份的日历表(参考计算机的日期和时间)
    5.3 表格的选取
    · 选定列
    · 选定行:区分“选取行中内容”和“选取整行”
    5.4“插入和删除”行列
    · 先选取
    · 操作实例:为日历表改为2007年9月日历表
    5.5“复制和移动”行列
    5.6 单元格编号和标题行重复
    5.7 表格的格式
    ·  自动套用格式
    ·  行高和列宽:菜单法、多种鼠标拖放控制
    ·  线型、粗细、垂直对齐、均分、...
    ·  操作实例:按照计算机格式将日历表进行格式(当前日期为蓝底白字)
    5.8  不规则表处理
    ·   斜线的绘制  调用方法:调用“表格和边框工具栏” 、 格式/边框和底纹
    ·   合并与橡皮
    ·   拆分与铅笔
    ·   操作实例:制作一小学课程表(★如下图★)

    5.9  排序与数据统计
    ·   自动求和、公式、排序
    ·   调用方法:调用菜单 表格/公式 、表格/排序
    ·   操作实例:
         a、将下列文字转换成表格

    ,  语文, 数学, 英语, 小计
    红眼病,  80, 90, 80,
    黄脸婆,  70, 40, 60,
    黑社会,  30, 70, 70,
    白毛女,  80, 80, 80,
    绿眼狼,  70, 80, 90,
    青面兽,  60, 70, 60,

    保存为学生成绩表在桌面
         b、在第一个单元格中添加表头(姓名/成绩)
         c、在黑社会和白毛女之间添加一行,数据如下:
            蓝腰带  100 100 100
         d、统计成绩
         e、并按小计(含标题)降序排列
        

     

     

     

    第六章 图形对象/图文混排(图片、艺术字、文本框、图表)

     

    6.1 图片对象
    6.1.1插入图片对象(剪贴画、图片)
    ·  调用方法:“插入/图片/...”菜单法:剪贴画、来自文件
    · “复制粘贴”法
    ·  在文档中插入剪贴画“鸽子”


    6.1.2 图片的拖放控制
    · 移动
    · 缩放
    · 裁剪:应调菜单“视图/工具栏/图片”打开图片工具栏
             右击菜单/
    · 亮度/对比度

    6.1.3 图文混排的要点
    · 漂浮与嵌入:右击法调“格式”菜单
    · 组合与取消组合:嵌入式图片利用“框”与文字组合、漂浮式图片间通过右击法组合
    · 叠放次序:漂浮式图片通过右击法改变叠放次序、嵌入式图片无叠放次序
    · 图片格式的精确设置 右击法调“格式”菜单

    · 操作实例:将"鸽子"图片设置成如下格式: 设置图片高度和宽度分别为5cm*10cm环绕方式:紧密型 环绕位置:两边

    6.2 插入自选图形(基本图形/自选图形)
    · 插入自选图片的方法
    · 利用绘图工具栏按钮修饰自选图形
    · 自选图形的编辑:鼠标右击菜单/设置自选图形格式 ,双击法

       例如:在文档中画若干个相互部分重叠的矩形框,向其中填充红色,黄色,蓝色,绿色等颜色,并把其中的红色框置于顶层。
       将其中的红色图形设置阴影样式2,然后取消其阴影。将其中的某蓝色矩形的三维效果设置为样式6。

    · 操作事例:制作一面国旗(要点:图形的填充、边框、组合、叠放顺序  提示:国旗比例1.5:1 )
     

    6.3 文本框
    · 插入文本框的方法(横向、纵向):调菜单“插入/图片/文本框”、绘图工具栏

    · 文本框的编辑方法:选中文本框边框/右击菜单选择设置文本框格式 、双击选中文本框边框

    · 操作实例:给下面已有的文字添加文本框
      《游子吟》
          孟郊
       慈母手中线,
       游子身上衣。
       临行密密缝,
       意恐迟迟归。
       谁言寸草心,
       报得三春晖。


      (要点:文本框的填充效果、边框、提示:效果/大理石 边框/双线)

    · 文本框的链接:当该文本框显示不完时,可以设置文本框链接,但是链接文本框必须是空文本框
       操作步骤:选取文本框/新建文本框的链接/选取空白文本框

    6.5 插入、编辑和修饰艺术字
    · 插入方法:调菜单“插入/图片/艺术字”、绘图工具栏、艺术字工具栏
    · 艺术字的编辑与修饰(控制形状   控制大小   环绕方式   旋转   竖排   颜色和线条   阴影  三维效果)
      

        倒影艺术字

        立体艺术字

    · 操作实例:图章 (要点:设置艺术字格式、字形、翻转、组合)


    6.6 插入图表 (图表是对表格本身一种直观的体现)
    · 操作方法:插入/图片/图表
    · 操作实例:
    姓名,  语文, 数学, 英语, 小计
    红眼病,  50, 50, 50, 150
    黄脸婆,  70, 80, 40, 190
    黑社会,  90, 90, 90, 270

    a、将数据转换表格
    b、并插入图表、图表的数据源为语文、数学、外语成绩
    c、图表类型为簇状柱形图
    d、图表的标题:学生成绩表  x轴:学生 y轴:成绩
      

     

     


      

    第七章 高级编辑技术


    7.1 插入书签

    ·书签是定位用的,比如说,在编辑或阅读一篇较长的WORD文档时,想在某一处或几处留下标记,以便以后查找、修改,便可以该处插入一书

    签。( 常和定位命令和超级链接命令一起使用)
    · 插入方法:调菜单“插入/书签”
    · 显示文档中的书签
       单击“工具”菜单中的“选项”命令,然后单击“视图”选项卡。
       选中“书签”复选框。
       如果已经为一项内容指定了书签,该书签会以括号([…])的形式出现(括号仅显示在屏幕上,不会打印出来)。
       注意: 书签名必须以字母开头,可包含数字但不能有空格。可以用下划线字符来分隔文字

    · 操作实例:为文档的开头位置设置书签“阅于7月7日”(教师讲解定位)

    7.2 插入脚注、尾注(常用于论文写作中、文言文中)
    · 插入方法:调菜单“插入/脚注、尾注”
    · 操作实例:
            a、打开“射雕英雄传.doc”为第一段开头文字“金庸”;加上脚注文字“金庸,原名查良镛(Cha Leung Yung、 Zhà Liáng Yōng),

    生于1924年 ,浙江海宁人”,其格式为“a,b,c”
            b、为标题开头文字“射雕英雄传”;加上脚注文字“《射雕英雄传》又名《大漠英雄传》。”,其格式为“i,ii,iii”
    7.3 插入文件
    · 插入方法:调菜单“插入/文件”
    · 操作实例:将金庸作品集.DOC”插入到本文最后的位置,(要求链接文件)。

    7.4 插入超级链接

    · 插入方法:调菜单“插入/超级链接 ”
    · 链接方式:url 、文件、标签
    · 操作实例:取消已有超级链接

    7.5 插入声音对象

    · 插入方法:调菜单“插入/剪贴画/声音 ”


    7.6 使用样式和模板
    · 操作方法:调菜单“插入/样式“
    · 操作方法:“新建/其他其他文档(模板)“

    · 操作实例:将文中的第三段应用样式中的“目录8”

                 新建“现代型通讯”模板


    7.7 插入数学公式
    · 插入方法:调菜单“插入/对象/miscrosoft equation 3.0 ”
    · 操作实例:插入求和(1+2..100)和积分公式


    7.8 插入结构图
    · 插入方法:调菜单“插入/对象/ms 组织结构图2.0
    · 操作实例:插入安徽省行政区域图

     


    7.9 工具菜单下的“选项”
    · 这一菜单命令用来完成WORD工作环境的设置,在此处出题出题较多,应引起足够地重视
    · 操作实例:设置WORD的度量单位为“磅” (选项/常规)

     

    7.10 使用自动图文集
    ·把你常用文字/图片统统存入Word模板吧!在需要时,只要用鼠标轻轻一点就能显示出来

    ·插入方法:调菜单“插入/自动图文集”、自动图文集工具栏

    ·操作实例:
               在第一段的开头位置插入自动图文集“Best wishes,”

               将“祝大家考试成功!”一句话新建为自动图文集中的词条

     

     感谢钱老师和杨老师提供相关资料

    展开全文
  • Qt版Word处理软件

    千次阅读 2015-12-11 19:53:59
    //设置在子窗口关闭时销毁这个类的对象 isUntitled = true ; //初始化isUntitled为true } /* * 新建文件操作 * 1、设置窗口编号 * 2、设置文件未被保存过“isUntitled =...
    演示界面



    mychild.h

    #ifndef MYCHILD_H
    
    #define MYCHILD_H
    
    
    #include <QTextEdit>
    #include <QPrinter>
    
    
    
    
    class MyChild : public QTextEdit
    {
        Q_OBJECT
    public:
        MyChild();
        void newFile();                         //新建操作
        bool loadFile(const QString &fileName); //加载文件
        bool save();                            //保存文件
        bool saveAs();                          //另存为
        bool saveFile(QString fileName);
        void setAlign(int align);               //设置段落对齐格式
        void setStyle(int style);               //设置段落标号、编号
    
    
        QString userFriendlyCurrentFile();      //提取文件名
        QString currentFile() {return curFile;} //返回当前文件路径
        void mergeFormatOnWordOrSelection(const QTextCharFormat &format);   //字体格式设置
    protected:
        void closeEvent(QCloseEvent *event);
    private slots:
        void documentWasModified();             //文档被修改时,窗口显示更改状态标识
    
    
    
    
    private:
        bool maybeSave();           //提醒保存文件操作
        QString strippedName(const QString &fullFileName);  //获取较短的绝对路径
        void setCurrentFile(const QString &fileName);       //设置当前文件的属性
        QString curFile;                        //保存当前文件路径
        bool isUntitled;                        //作为当前文件是否被保存到硬盘上的标识
    
    
    };
    
    
    #endif // MYCHILD_H

    mychild.cpp

    #include "mychild.h"
    #include <QtWidgets>
    
    
    MyChild::MyChild()
    {
        setAttribute (Qt::WA_DeleteOnClose);    //设置在子窗口关闭时销毁这个类的对象
        isUntitled = true;                      //初始化isUntitled为true
    }
    
    
    /*
     * 新建文件操作
     * 1、设置窗口编号
     * 2、设置文件未被保存过“isUntitled = true”
     * 3、保存文件路径,为curFile赋初值
     * 4、设置子窗口标题
     * 5、文联文档内容改变信号contentsChanged()至显示文档更改状态标识槽documentWasModified()
     *
     * static 局部变量只被初始化一次,下一次依据上一次的结果值
    */
    void MyChild::newFile ()
    {
        //设置窗口编号,因为编号会一直被保存,所以需要使用静态变量
        static int sequenceNumber = 1;
        //新建的文档默认未命名
        isUntitled = true;
        //将当前文件命名为“文档+编号”的形式,编号先使用在加1
        curFile = tr("文档 %1").arg (sequenceNumber++);
        //设置窗口标题,使用[*]可以在文档被更改在文件名称后显示“*”号
        setWindowTitle (curFile + "[*]" + tr("- Myself Word"));
        //文档更改时发送contentSChanged()信号,执行documentWasModified()槽函数
        connect (document (), SIGNAL(contentsChanged()), this, SLOT(documentWasModified()));
    }
    /*
     * 加载文件操作步骤
     * 1、打开指定的文件,并读取文件内容到编辑器
     * 2、设置当前文件的setCurrentFile(),该函数可以获取文件路径,完成文件和窗口状态的设置
     * 3、关联文档内容改变信号到显示文档更改状态标志槽documentWasModified()。加载文件操作采用loadFile()函数实现
    */
    bool MyChild::loadFile (const QString &fileName)
    {
        if(!fileName.isEmpty ())
        {
            if(!QFile::exists (fileName))
            {
                return false;
            }
            //新建QFile对象
            QFile file(fileName);
            //以只读方式打开文件,出错则提示,并返回false
            if(!file.open (QFile::ReadOnly))
            {
                return false;
            }
            QByteArray data = file.readAll ();
            /*通过检查BOM(字节顺序标记)和内容类型的元头,并能够解码成Unicode的html返回QTextCodec实例。Qt使用Unicode
            存储,操作字符,提供了一套QTextCodec类。去帮助转换非Unicode格式到Unicode*/
            QTextCodec *codec = Qt::codecForHtml (data);
            QString str = codec->toUnicode (data);
            //如果是纯文本
            if(Qt::mightBeRichText (str))
            {
                /*如果你有现成的HTML文件,则可以直接调用setHtml()方法来加载*/
                this->setHtml (str);
            }
            else
            {
                str = QString::fromLocal8Bit (data);
                /*setPlainText()顾名思义,是设置纯文本。而setText参数除了可以设置为纯文本之外,还可以设置为一些简单
                  的html格式的字符串,当然这些字符串是修饰一个字符串。*/
                this->setPlainText (str);
            }
            setCurrentFile (fileName);
            connect(document (), SIGNAL(contentsChanged()), this, SLOT(documentWasModified()));
            return true;
        }
    }
    /*
     * 保存文件
     * 1、如果文件没有被保存过(用isUntitled判断),则执行“另存为”操作saveAs()。
     * 2、否则直接“保存”文件saveFile(),该函数首先打开指定文件,然后将编辑器的内容写入该文件,最后设置当前文件setCurrentFIle()
    */
    bool MyChild::save ()
    {
        if(isUntitled)
        {
            return saveAs();
        }
        else
        {
            return saveFile (curFile);
        }
    }
    
    
    /*
     * 另存为
     * 1、从文件对话框获取文件路径。
     * 2、如果路径不为空,则保存文件saveFile()
    */
    bool MyChild::saveAs ()
    {
        QString fileName = QFileDialog::getSaveFileName (this, tr("另存为"), curFile, tr("HTML 文档(*.htm *.html); 所有文件(*.*)"));
        //获取文件路径,如果为空则返回false,否则保存文件
        if(fileName.isEmpty ())
        {
            return false;
        }
        return saveFile (fileName);
    }
    /*
     * 保存文件
    */
    bool MyChild::saveFile (QString fileName)
    {
        //如果字符串的结尾引用.htm或者.html则返回true,否则返回false。忽略大小写
        if(!(fileName.endsWith (".htm", Qt::CaseInsensitive) || fileName.endsWith (".html", Qt::CaseInsensitive)))
        {
            fileName += ".html";    //默认保存为HTML文档
        }
        //保存文件对话框(对于某些格式QTextDocumentWriter可直接保存,其他不支持的格式就用QTextStream以流的形式保存 
        QTextDocumentWriter writer(fileName);
        bool success = writer.write (this->document ());
        if(success)
            setCurrentFile (fileName);
        return success;
    }
    
    
    /*
     * 另存为文件操作(Remind the save file)
    */
    bool MyChild::maybeSave ()
    {
        //首先判断文档是否被修改过,如果文档被修改过执行if(){}下面的内容
        if(!document()->isModified ())
        {
            return true;
        }
        QMessageBox::StandardButton ret;
        ret = QMessageBox::warning (this, tr("Myself Qt Word"), tr("文档'%1'已被修改,保存吗?").arg (userFriendlyCurrentFile ()), QMessageBox::Save | QMessageBox::Cancel | QMessageBox::Discard);
        if(ret == QMessageBox::Save)
        {
            return save();
        }
        else if(ret == QMessageBox::Cancel)
        {
            return false;
        }
    
    
        return true;
    }
    
    
    /*
     * 关闭文件事件
    */
    void MyChild::closeEvent (QCloseEvent *event)
    {
        if(maybeSave())
        {
            event->accept ();
        }
        else
        {
            event->ignore ();
        }
    }
    
    
    /*
     * 文件更改标签
     * 编辑器内容是否被更改,可以使用QTextDocument类的isModified()函数获知,这里使用了QTextEdit类,document()函数来获取
     * 它的QTextDocument类对象。然后使用setWindowModified()函数设置窗口的更改状态标志“*”,如果参数为true,则将在标题中设置
     * 了“[*]”号的地方显示“*”号,表示该文件已经被修改。
    */
    void MyChild::documentWasModified ()
    {
        //根据文档的isModified()函数的返回值,判断编译器内容是否被更改
        setWindowModified (document ()->isModified ());
    }
    
    
    QString MyChild::userFriendlyCurrentFile ()
    {
        return strippedName (curFile);
    }
    
    
    QString MyChild::strippedName (const QString &fullFileName)
    {
        return QFileInfo(fullFileName).fileName ();
    }
    
    
    /*
     * 设置当前文件属性
    */
    void MyChild::setCurrentFile (const QString &fileName)
    {
        /*canonicalFilePath ()可以除去路径中符号链接,如“.”和“..”等符号。这个
         *函数只是将加载文件的路径首先保存到curFile中,然后再进行一些状态的设置*/
        curFile = QFileInfo(fileName).canonicalFilePath ();
        //文件已经被保存过
        isUntitled = false;
        //文档没有被更改过
        document ()->setModified (false);
        //窗口不显示被更改标志
        setWindowModified (false);
        //设置窗口标题,userFriendlyCurrentFile ()返回文件名
        setWindowTitle (userFriendlyCurrentFile () + "[*]");
    }
    
    
    /*
     * 设置字体格式
     * 调用QTextCursor的mergeCharFormat()函数,将参数format所表示的格式应用到光标所在处的字符上
    */
    void MyChild::mergeFormatOnWordOrSelection (const QTextCharFormat &format)
    {
        QTextCursor cursor = this->textCursor ();
        if(!cursor.hasSelection ())
        {
            cursor.select (QTextCursor::WordUnderCursor);
        }
        cursor.mergeCharFormat (format);
        this->mergeCurrentCharFormat (format);
    }
    
    
    /*
     * 设置段落对齐格式
    */
    void MyChild::setAlign (int align)
    {
        if(align == 1)
        {
            this->setAlignment (Qt::AlignLeft | Qt::AlignAbsolute);
        }
        else if(align == 2)
        {
            this->setAlignment (Qt::AlignHCenter);
        }
        else if(align == 3)
        {
            this->setAlignment (Qt::AlignRight | Qt::AlignAbsolute);
        }
        else if(align == 4)
        {
            this->setAlignment (Qt::AlignJustify);
        }
    }
    
    
    void MyChild::setStyle (int style)
    {
        //设置文本光标,执行文本首部
        QTextCursor cursor = this->textCursor ();
        if(style != 0)
        {
            //QTextListFormat 主要用于描述文本符号,编号的格式
            QTextListFormat::Style stylename = QTextListFormat::ListDisc;
            switch(style)
            {
            default:
            case 1:
                stylename = QTextListFormat::ListDisc;          //实心圆标号
                break;
            case 2:
                stylename = QTextListFormat::ListCircle;        //空心圆标号
                break;
            case 3:
                stylename = QTextListFormat::ListSquare;        //方形标号
                break;
            case 4:
                stylename = QTextListFormat::ListDecimal;       //十进制标号
                break;
            case 5:
                stylename = QTextListFormat::ListLowerAlpha;    //小写字母编号
                break;
            case 6:
                stylename = QTextListFormat::ListUpperAlpha;    //大写字母编号
                break;
            case 7:
                stylename = QTextListFormat::ListLowerRoman;    //小写罗马编号
                break;
            case 8:
                stylename = QTextListFormat::ListUpperRoman;    //大写罗马编号
                break;
            }
    
    
            //为支持撤销操作(设置开始编辑文本格式)
            cursor.beginEditBlock ();
            QTextBlockFormat bfmt = cursor.blockFormat ();
            QTextListFormat listfmt;
            if(cursor.currentList ())
            {
                listfmt = cursor.currentList ()->format ();
            }
            else
            {
                listfmt.setIndent (bfmt.indent () + 1);
                bfmt.setIndent (0);
                cursor.setBlockFormat (bfmt);
            }
            listfmt.setStyle (stylename);
            cursor.createList (listfmt);
            cursor.endEditBlock ();
        }
        else
        {
            //QTextBlockFormatTextBlockFormat类则用于表示这一块文本的格式,如缩进值、与四边的边距等
            QTextBlockFormat bfmt;
            bfmt.setObjectIndex (-1);
            cursor.mergeBlockFormat (bfmt); //合并格式
        }
    }

    myword.h

    #ifndef MYWORD_H
    
    #define MYWORD_H
    
    
    #include <QMainWindow>
    #include <QPrintDialog>
    #include <QPrinter>
    #include <QPrintPreviewDialog>
    
    
    class QMdiArea;     //TextEdit
    class QMenu;        //主菜单
    class QAction;      //动作
    class QComboBox;    //
    class QFontComboBox;//
    class MyChild;
    class QMdiSubWindow;
    class QSignalMapper;//信号映射器,它可以实现对多个子窗口部件的相同信号进行映射,首先为其添加字符串或者数值参数,然后在发送出去。
    
    
    
    
    class Myword : public QMainWindow
    {
        Q_OBJECT
    
    
    public:
        Myword(QWidget *parent = 0);
        ~Myword();
    private:
        QMdiArea *mdiArea;
        void createMenus();         //创建主菜单
        void createActions();       //创建动作
        void createToolBars();      //创建工具栏
        void createStatusBar();     //创建状态栏
        void colorChanged(const QColor &c); //设置动作栏颜色
    
    
    
    
        QMdiSubWindow *findMyChild(const QString &fileName);    //查找子窗口
        void enabledText();         //设置格式菜单及其对应的工具按钮变为可用状态
        MyChild *activeMyChild();   //活动窗口
    
    
        QSignalMapper *windowMapper;
        //菜单
        QMenu *fileMenu;        //文件菜单
        QMenu *editMenu;        //编辑菜单
        QMenu *formatMenu;      //格式菜单
        QMenu *fontMenu;        //字体子菜单
        QMenu *alignMenu;       //段落子菜单
        QMenu *windowMenu;      //窗口菜单
        QMenu *helpMenu;        //帮助菜单
    
    
        //【文件】主菜单
        QAction *newAct;        //新建
        QAction *openAct;       //打开
        QAction *saveAct;       //保存
        QAction *saveAsAct;     //另存为
        QAction *printAct;      //打印
        QAction *printPreviewAct;//打印预览
        QAction *quitAct;       //退出
    
    
        //【编辑】主菜单
        QAction *undoAct;       //撤销
        QAction *redoAct;       //重做
        QAction *cutAct;        //剪切
        QAction *copyAct;       //复制
        QAction *pasteAct;      //粘贴
    
    
        //【格式】主菜单
        QAction *boldAct;       //加粗
        QAction *italicAct;     //倾斜
        QAction *underlineAct;  //下划线
        QAction *leftAlignAct;  //左对齐
        QAction *centerAlignAct;//居中
        QAction *rightAlignAct; //右对齐
        QAction *justifyAct;    //两端对齐
        QAction *colorAct;      //颜色
    
    
        //【窗口】主菜单
        QAction *closeAct;      //关闭
        QAction *closeAllAct;   //关闭所有
        QAction *tileAct;        //平铺
        QAction *cascadeAct;    //层叠
        QAction *nextAct;       //下一个
        QAction *previousAct;   //前一个
        QAction *separatorAct;  //
    
    
        //【帮助】主菜单
        QAction *aboutAct;      //关于本软件
        QAction *aboutQtAct;    //关于Qt
    
    
        QToolBar *fileToolBar;  //"文件"工具条
        QToolBar *editToolBar;  //"编辑"工具条
        QToolBar *formatToolBar;//"格式"工具条
        QToolBar *comboToolBar; //组合框选择栏
        QComboBox *comboStyle;  //标号与编号类型选择框
        QFontComboBox *comboFont;//字体选择框
        QComboBox *comboSize;   //字号选择框
    
    
    private slots:
        void about();
        void fileNew();                         //新建文件操作
        void fileOpen();                        //打开文件操作
        void fileSave();                        //保存文件操作
        void fileSaveAs();                      //另存为文件操作
    
    
        void undo();                            //撤销
        void redo();                            //重做
        void cut();                             //剪切
        void copy();                            //复制
        void paste();                           //粘贴
    
    
        void textBold();                        //加粗
        void textItalic();                      //倾斜
        void textUnderline();                   //下划线
    
    
        void textFamily(const QString &f);      //字体选择框
        void textSize(const QString &p);        //字号
    
    
        void textAlign (QAction *a);            //设置段落对齐格式
        void textColor();                       //设置字体颜色
    
    
        void textStyle(int styleIndex);         //设置段落的风格
    
    
        void filePrint();                       //打印文档
        void filePrintPreview();                //打印预览文档
        void printPreview(QPrinter *);          //
    
    
        void updateMenus();                     //更新菜单
        void updateWindowMenu();                //更新窗口菜单
    
    
        MyChild *createMyChild();               //创建子窗口
        void setActiveSubWindow(QWidget *window);
    
    
    protected:
        void closeEvent (QCloseEvent *event);
    };
    
    
    #endif // MYWORD_H

    myword.cpp

    #include "myword.h"
    #include <QtWidgets>
    #include "mychild.h"
    #include <QIcon>
    #include <QFont>
    #include <QPixmap>
    
    
    /*
     * setHorizontalScrollBarPolicy和setVerticalScrollBarPolicy函数,只要设置
     * Qt::ScrollBarAlwaysOff就可以隐藏滚动条,此处设置为Qt::ScrollBarAsNeeded表示
     * 滚动条在需要(子窗口较多,主区域显示不下)时才出现
    */
    class QString rsrcPath = ":/images";
    
    
    Myword::Myword(QWidget *parent)
        : QMainWindow(parent)
    {
        move(200, 150);
        resize (800, 500);
        setWindowIcon (QIcon(rsrcPath + "/qt.png"));
        setWindowTitle (tr("Myself Word"));
    
    
        mdiArea = new QMdiArea;
        mdiArea->setHorizontalScrollBarPolicy (Qt::ScrollBarAsNeeded);
        mdiArea->setVerticalScrollBarPolicy (Qt::ScrollBarAsNeeded);
        setCentralWidget (mdiArea);
        /*当有活动窗口时更新菜单*/
        connect (mdiArea, SIGNAL(subWindowActivated(QMdiSubWindow*)), this, SLOT(updateMenus()));
        //创建信号映射器
        windowMapper = new QSignalMapper(this);
        //映射器重新发送信号,根据信号设置活动窗口
        connect(windowMapper, SIGNAL(mapped(QWidget*)), this, SLOT(setActiveSubWindow(QWidget *)));
    
    
        createActions ();
        createMenus ();
        createToolBars();
        updateMenus ();
    
    
    }
    
    
    Myword::~Myword()
    {
    
    
    }
    /*
     * 更新菜单的槽函数
    */
    void Myword::updateWindowMenu ()
    {
        //首先清空菜单,然后再添加各个菜单动作
        windowMenu->clear ();
        windowMenu->addAction(closeAct);
        windowMenu->addAction(closeAllAct);
        windowMenu->addSeparator ();        //分割线
        windowMenu->addAction(tileAct);
        windowMenu->addAction(cascadeAct);
        windowMenu->addSeparator ();        //分割线
        windowMenu->addAction(nextAct);
        windowMenu->addAction(previousAct);
        windowMenu->addAction(separatorAct);
        //如果有活动窗口,则显示分隔条
        QList<QMdiSubWindow *> windows = mdiArea->subWindowList ();
        separatorAct->setVisible (!windows.isEmpty ());
        //遍历各个子窗口,显示当前已打开的文档子窗口项
        for(int i = 0; i < windows.size (); i++)
        {
            MyChild *child = qobject_cast<MyChild*>(windows.at (i)->widget ());
            QString text;
            if(i < 9)
            {
                text = tr("&%1 %2").arg (i + 1).arg (child->userFriendlyCurrentFile ());
            }
            else
            {
                text = tr("%1 %2").arg (i + 1).arg (child->userFriendlyCurrentFile ());
            }
            //添加动作作到菜单,设置动作可以选择
            QAction *action = windowMenu->addAction(text);
            action->setCheckable (true);
            //设置当前活动窗口动作作为选中状态
            action->setChecked(child == activeMyChild ());
            //关联动作的触发信号到信号映射器的map()槽,这个槽会发送mapped()信号
            connect (action, SIGNAL(triggered(bool)), windowMapper, SLOT(map()));
            //动作作与相应的窗口部件进行映射,在发送mapped()信号时就会以这个窗口部件为参数
            windowMapper->setMapping (action, windows.at (i));
        }
        enabledText (); //使得字体设置菜单可用
    }
    
    
    /*
     * 主菜单
    */
    void Myword::createMenus ()
    {
        //"文件"主菜单
        fileMenu = menuBar ()->addMenu (tr("文件(&F)"));
        fileMenu->addAction(newAct);
        fileMenu->addAction(openAct);
        fileMenu->addSeparator ();  //分割线
        fileMenu->addAction(saveAct);
        fileMenu->addAction(saveAsAct);
        fileMenu->addSeparator ();  //分割线
        fileMenu->addAction(printAct);
        fileMenu->addAction(printPreviewAct);
        fileMenu->addSeparator ();  //分割线
        fileMenu->addAction(quitAct);
    
    
        //“编辑”主菜单
        editMenu = menuBar ()->addMenu (tr("编辑(&E)"));
        editMenu->addAction(undoAct);
        editMenu->addAction(redoAct);
        editMenu->addSeparator ();  //分割线
        editMenu->addAction(cutAct);
        editMenu->addAction(copyAct);
        editMenu->addAction(pasteAct);
    
    
        //"格式"主菜单
        formatMenu = menuBar ()->addMenu (tr("格式(&O)"));
        fontMenu = formatMenu->addMenu (tr("字体(&D)"));      //"字体"子菜单
        fontMenu->addAction(boldAct);
        fontMenu->addAction(italicAct);
        fontMenu->addAction(underlineAct);
        alignMenu = formatMenu->addMenu (tr("段落"));         //“段落”子菜单
        alignMenu->addAction(leftAlignAct);
        alignMenu->addAction(centerAlignAct);
        alignMenu->addAction(rightAlignAct);
        alignMenu->addAction(justifyAct);
        formatMenu->addAction(colorAct);
    
    
        //"窗口"主菜单
        windowMenu = menuBar ()->addMenu (tr("窗口(&W)"));
        updateWindowMenu ();
        connect (windowMenu, SIGNAL(aboutToShow()), this, SLOT(updateWindowMenu()));
        menuBar ()->addSeparator ();
    
    
        //”帮助“主菜单
        helpMenu = menuBar ()->addMenu (tr("帮助(&H)"));
        helpMenu->addAction(aboutAct);
        helpMenu->addSeparator ();      //分割线
        helpMenu->addAction(aboutQtAct);
    }
    /*
     * 文件主菜单动作集
    */
    void Myword::createActions ()
    {
        //文件菜单动作集
        newAct = new QAction(QIcon(rsrcPath + "/filenew.png"), tr("新建(&N)"), this);
        newAct->setShortcut (QKeySequence::New);
        newAct->setToolTip ("新建");              //设置工具栏按钮的提示文本
        newAct->setStatusTip ("新建一个新文档");    //设置按钮状态栏提示文本
        connect(newAct, SIGNAL(triggered(bool)), this, SLOT(fileNew()));
    
    
        openAct = new QAction(QIcon(rsrcPath + "/fileopen.png"), tr("打开(&O)"), this);
        openAct->setShortcut (QKeySequence::Open);
        openAct->setToolTip ("打开");
        openAct->setStatusTip ("打开已存在的文档");
        connect (openAct, SIGNAL(triggered(bool)), this, SLOT(fileOpen()));
    
    
        saveAct = new QAction(QIcon(rsrcPath + "/filesave.png"), tr("保存(&S)"), this);
        saveAct->setShortcut (QKeySequence::Save);
        saveAct->setToolTip ("保存");
        saveAct->setStatusTip ("将当前文档存盘");
        connect (saveAct, SIGNAL(triggered(bool)), this, SLOT(fileSave()));
    
    
        saveAsAct = new QAction(tr("另存为(&A)..."), this);
        saveAsAct->setShortcut (QKeySequence::SaveAs);
        saveAsAct->setStatusTip (tr("以一个新名字保存文档"));
        connect (saveAsAct, SIGNAL(triggered(bool)), this, SLOT(fileSaveAs()));
    
    
        printAct = new QAction(QIcon(rsrcPath + "/fileprint.png"), tr("打印&P"), this);
        printAct->setShortcut (QKeySequence::Print);
        printAct->setToolTip ("打印");
        printAct->setStatusTip (tr("打印文档"));
        connect (printAct, SIGNAL(triggered(bool)), this, SLOT(filePrint()));
    
    
        printPreviewAct = new QAction(tr("打印预览..."), this);
        printPreviewAct->setStatusTip (tr("打印预览效果"));
        connect (printPreviewAct, SIGNAL(triggered(bool)), this, SLOT(filePrintPreview()));
    
    
        quitAct = new QAction(tr("退出"), this);
        quitAct->setShortcut (tr("Ctrl+Q"));
        quitAct->setStatusTip (tr("退出应用程序"));
        connect (quitAct, SIGNAL(triggered(bool)), qApp, SLOT(closeAllWindows()));
    
    
        //编辑菜单动作集
        undoAct = new QAction(QIcon(rsrcPath + "/editundo.png"), tr("撤销(&U)"), this);
        undoAct->setShortcut (QKeySequence::Undo);
        undoAct->setToolTip (tr("撤销"));
        undoAct->setStatusTip ("撤销当前操作");
        connect (undoAct, SIGNAL(triggered(bool)), this, SLOT(undo()));
    
    
        redoAct = new QAction(QIcon(rsrcPath + "/editredo.png"), tr("重做(&R)"), this);
        redoAct->setShortcut (QKeySequence::Redo);
        redoAct->setToolTip (tr("重做"));
        redoAct->setStatusTip (tr("恢复之前操作"));
        connect (redoAct, SIGNAL(triggered(bool)), this, SLOT(redo()));
    
    
        cutAct = new QAction(QIcon(rsrcPath + "/editcut.png"), tr("剪切(&T)"), this);
        cutAct->setShortcut (QKeySequence::Cut);
        cutAct->setToolTip (tr("剪切"));
        cutAct->setStatusTip (tr("从文档中裁剪所选内容,并将其放入剪贴板"));
        connect (cutAct, SIGNAL(triggered(bool)), this, SLOT(cut()));
    
    
        copyAct = new QAction(QIcon(rsrcPath + "/editcopy.png"), tr("复制(&C)"), this);
        copyAct->setShortcut (QKeySequence::Copy);
        copyAct->setToolTip (tr("复制"));
        copyAct->setStatusTip (tr("拷贝所选内容,并将其放入剪切板"));
        connect (copyAct, SIGNAL(triggered(bool)), this, SLOT(copy()));
    
    
        pasteAct = new QAction(QIcon(rsrcPath + "/editpaste.png"), tr("粘贴(P)"), this);
        pasteAct->setShortcut (QKeySequence::Paste);
        pasteAct->setToolTip (tr("粘贴"));
        pasteAct->setStatusTip (tr("将剪粘板的内容粘贴到文档"));
        connect (pasteAct, SIGNAL(triggered(bool)), this, SLOT(paste()));
    
    
        //"格式"主菜单动作集
        boldAct = new QAction(QIcon(rsrcPath + "/textbold.png"), tr("加粗(&B)"), this);
        boldAct->setCheckable (true);
        boldAct->setShortcut (Qt::CTRL + Qt::Key_B);
        boldAct->setToolTip (tr("加粗"));
        boldAct->setStatusTip (tr("将所选文字加粗"));
        QFont bold;
        bold.setBold (true);
        boldAct->setFont (bold);
        connect (boldAct, SIGNAL(triggered(bool)), this, SLOT(textBold()));
    
    
        italicAct = new QAction(QIcon(rsrcPath + "/textitalic.png"), tr("倾斜(&I)"), this);
        italicAct->setCheckable (true);
        italicAct->setShortcut (Qt::CTRL + Qt::Key_I);
        italicAct->setToolTip (tr("倾斜"));
        italicAct->setStatusTip (tr("将所选字体倾斜显示"));
        QFont italic;
        italic.setItalic (true);
        italicAct->setFont (italic);
        connect (italicAct, SIGNAL(triggered(bool)), this, SLOT(textItalic()));
    
    
        underlineAct = new QAction(QIcon(rsrcPath + "/textunder.png"), tr("下划线(&U)"), this);
        underlineAct->setCheckable (true);
        underlineAct->setShortcut (Qt::CTRL + Qt::Key_U);
        underlineAct->setToolTip (tr("下划线"));
        underlineAct->setStatusTip (tr("将所选字体加下划线"));
        QFont underline;
        underline.setUnderline (true);
        underlineAct->setFont (underline);
        connect (underlineAct, SIGNAL(triggered(bool)), this, SLOT(textUnderline()));
    
    
        //“格式”--“段落”子菜单下的各项为同一个菜单项组,只能选其中一项
        QActionGroup *grp = new QActionGroup(this);
        connect(grp, SIGNAL(triggered(QAction*)), this, SLOT(textAlign(QAction*)));
        if(QApplication::isLeftToRight ())
        {
            leftAlignAct = new QAction(QIcon(rsrcPath + "/textleft.png"),tr("左对齐(&L)"), grp);
            centerAlignAct = new QAction(QIcon(rsrcPath + "/textcenter.png"),tr("居中(&E)"), grp);
            rightAlignAct = new QAction(QIcon(rsrcPath + "/textright.png"),tr("右对齐(&R)"), grp);
        }
        else
        {
            rightAlignAct = new QAction(QIcon(rsrcPath + "/textright.png"),tr("右对齐(&R)"), grp);
            centerAlignAct = new QAction(QIcon(rsrcPath + "/textcenter.png"),tr("居中(&E)"), grp);
            leftAlignAct = new QAction(QIcon(rsrcPath + "/textleft.png"),tr("左对齐(&L)"), grp);
        }
    
    
        justifyAct = new QAction(QIcon(rsrcPath + "/textjustify.png"), tr("两端对齐(&J)"), grp);
    
    
        leftAlignAct->setShortcut (Qt::CTRL + Qt::Key_L);
        leftAlignAct->setCheckable (true);
        leftAlignAct->setToolTip ("左对齐");
        leftAlignAct->setStatusTip (tr("将文字左对齐"));
    
    
        centerAlignAct->setShortcut (Qt::CTRL + Qt::Key_E);
        centerAlignAct->setCheckable (true);
        centerAlignAct->setToolTip ("居中");
        centerAlignAct->setStatusTip (tr("将文字居中对齐"));
    
    
        rightAlignAct->setShortcut (Qt::CTRL + Qt::Key_R);
        rightAlignAct->setCheckable (true);
        rightAlignAct->setToolTip ("右对齐");
        rightAlignAct->setStatusTip (tr("将文字右对齐"));
    
    
        justifyAct->setShortcut (Qt::CTRL + Qt::Key_J);
        justifyAct->setCheckable (true);
        justifyAct->setToolTip ("两端对齐");
        justifyAct->setStatusTip (tr("将文字左右两端同时对齐,并根据需要增加字间距"));
    
    
        QPixmap pix(16, 16);
        pix.fill (Qt::red);
        colorAct = new QAction(pix, tr("颜色(&C)..."), this);
        colorAct->setToolTip ("颜色");
        colorAct->setStatusTip (tr("设置文字颜色"));
        connect(colorAct, SIGNAL(triggered(bool)), this, SLOT(textColor()));
    
    
        //”窗口“主菜单动作集
        closeAct = new QAction(tr("关闭(&O)"), this);
        closeAct->setStatusTip (tr("关闭活动文档子窗口"));
        connect (closeAct, SIGNAL(triggered(bool)), mdiArea, SLOT(closeActiveSubWindow()));
        closeAllAct = new QAction(tr("关闭所有(&A)"), this);
        closeAllAct->setStatusTip (tr("关闭所有子窗口"));
        connect(closeAllAct, SIGNAL(triggered(bool)), mdiArea, SLOT(closeAllSubWindows()));
        tileAct = new QAction(tr("平铺(&T)"), this);
        tileAct->setStatusTip (tr("平铺子窗口"));
        connect(tileAct, SIGNAL(triggered(bool)), mdiArea, SLOT(tileSubWindows()));
        cascadeAct = new QAction(tr("层叠(&C)"), this);
        cascadeAct->setStatusTip (tr("曾跌子窗口"));
        connect (cascadeAct, SIGNAL(triggered(bool)), mdiArea, SLOT(cascadeSubWindows()));
        nextAct = new QAction(tr("下一个(&X)"), this);
        nextAct->setShortcut (QKeySequence::NextChild);
        nextAct->setStatusTip (tr("移动焦点到下一个子窗口"));
        connect(nextAct, SIGNAL(triggered(bool)), mdiArea, SLOT(activateNextSubWindow()));
        previousAct = new QAction(tr("前一个(&V)"), this);
        previousAct->setShortcut (QKeySequence::PreviousChild);
        previousAct->setStatusTip (tr("移动焦点到前一个子窗口"));
        connect(previousAct, SIGNAL(triggered(bool)), mdiArea, SLOT(activatePreviousSubWindow()));
        separatorAct = new QAction(this);
        separatorAct->setSeparator (true);
    
    
        //"帮助"主菜单动作集
        aboutAct = new QAction(tr("关于(&A)"), this);
        aboutAct->setStatusTip (tr("Myself Word"));
        connect (aboutAct, SIGNAL(triggered(bool)), this, SLOT(about()));
        aboutQtAct = new QAction(tr("关于Qt(&Q)"), this);
        aboutQtAct->setStatusTip (tr("关于Qt库"));
        connect(aboutQtAct, SIGNAL(triggered(bool)), qApp, SLOT(aboutQt()));
    
    
    }
    /*
     * 当有活动窗口时更新菜单
    */
    void Myword::updateMenus ()
    {
        //至少有一个子文档打开时的情况
        bool hasMyChild = (activeMyChild () != 0);
    
    
        saveAct->setEnabled(hasMyChild);
        saveAsAct->setEnabled(hasMyChild);
        printAct->setEnabled(hasMyChild);
        printPreviewAct->setEnabled(hasMyChild);
    
    
        pasteAct->setEnabled(hasMyChild);
    
    
        closeAct->setEnabled(hasMyChild);
        closeAllAct->setEnabled(hasMyChild);
        tileAct->setEnabled(hasMyChild);
        cascadeAct->setEnabled(hasMyChild);
        nextAct->setEnabled(hasMyChild);
        previousAct->setEnabled(hasMyChild);
        separatorAct->setVisible(hasMyChild);
        //文档打开着并且其中有内容被选中的情况
        bool hasSelection = (activeMyChild() && activeMyChild()->textCursor().hasSelection());
    
    
        cutAct->setEnabled(hasSelection);
        copyAct->setEnabled(hasSelection);
    
    
        boldAct->setEnabled(hasSelection);
        italicAct->setEnabled(hasSelection);
        underlineAct->setEnabled(hasSelection);
        leftAlignAct->setEnabled(hasSelection);
        centerAlignAct->setEnabled(hasSelection);
        rightAlignAct->setEnabled(hasSelection);
        justifyAct->setEnabled(hasSelection);
        colorAct->setEnabled(hasSelection);
    }
    /*
     * 创建状态栏
    */
    void Myword::createStatusBar ()
    {
        statusBar ()->showMessage (tr("就绪"));
    }
    
    
    /*
     * 判断是否有活动子窗口用activeMyChild()函数
    */
    MyChild *Myword::activeMyChild ()
    {
        //若有活动窗口,则将其内的中心部件转换为MyChild类型,若没有直接返回0
        if (QMdiSubWindow *activeSubWindow = mdiArea->activeSubWindow())
            return qobject_cast<MyChild *>(activeSubWindow->widget());
        return 0;
    }
    
    
    /*
     * 工具栏设计
    */
    void Myword::createToolBars ()
    {
        //”文件“工具栏
        fileToolBar = addToolBar (tr("文件"));
        fileToolBar->addAction(newAct);
        fileToolBar->addAction(openAct);
        fileToolBar->addAction(saveAct);
        fileToolBar->addSeparator ();   //分隔条
        fileToolBar->addAction(printAct);
    
    
        //”编辑“工具栏
        editToolBar = addToolBar (tr("编辑"));
        editToolBar->addAction(undoAct);
        editToolBar->addAction(redoAct);
        editToolBar->addSeparator ();
        editToolBar->addAction(cutAct);
        editToolBar->addAction(copyAct);
        editToolBar->addAction(pasteAct);
    
    
        //”格式“工具条
        formatToolBar = addToolBar (tr("格式"));
        formatToolBar->addAction(boldAct);
        formatToolBar->addAction(italicAct);
        formatToolBar->addAction(underlineAct);
        formatToolBar->addSeparator ();
        formatToolBar->addAction(leftAlignAct);
        formatToolBar->addAction(centerAlignAct);
        formatToolBar->addAction(rightAlignAct);
        formatToolBar->addAction(justifyAct);
        formatToolBar->addSeparator ();
        formatToolBar->addAction(colorAct);
    
    
        //组合选择栏
        //可以使工具条分多行显示。这里是将组合选择条在工具栏上另起一行显示,以使界面看起来更加美观,大方。
        addToolBarBreak (Qt::TopToolBarArea);
        comboToolBar = addToolBar (tr("组合选择框"));
    
    
        comboStyle = new QComboBox();
        comboToolBar->addWidget (comboStyle);
        comboStyle->addItem ("标准");
        comboStyle->addItem ("项目符号 (●)");
        comboStyle->addItem("项目符号 (○)");
        comboStyle->addItem("项目符号 (■)");
        comboStyle->addItem("编号 (⒈⒉⒊)");
        comboStyle->addItem("编号 ( a.b.c.)");
        comboStyle->addItem("编号 ( A.B.C.)");
        comboStyle->addItem("编号 (ⅰ.ⅱ.ⅲ.)");
        comboStyle->addItem("编号 (Ⅰ.Ⅱ.Ⅲ.)");
        connect(comboStyle, SIGNAL(activated(int)), this, SLOT(textStyle(int)));
    
    
        comboFont = new QFontComboBox();
        comboToolBar->addWidget (comboFont);
        comboFont->addItem ("更改字体");
        connect (comboFont, SIGNAL(activated(QString)), this, SLOT(textFamily(QString)));
    
    
        comboSize = new QComboBox();
        comboToolBar->addWidget (comboSize);
        comboSize->setEditable (true);
        comboSize->setStatusTip ("更改字号");
        QFontDatabase db;
        foreach(int size, db.standardSizes ())
        {
            comboSize->addItem (QString::number (size));
            connect(comboSize, SIGNAL(activated(QString)), this, SLOT(textSize(QString)));
            comboSize->setCurrentIndex (comboSize->findText (QString::number (QApplication::font ().pointSize ())));
        }
    }
    /*
     * 创建MyChild部件,并将它作为子窗口的中心部件,添加到多文档区域。紧接着关联编辑器的信号和菜单动作,
     * 让它们可以随着文档的改变而改变状态。最后返回MyChild对象指针。
    */
    MyChild *Myword::createMyChild ()
    {
        MyChild *child = new MyChild;       //创建MyChild部件
        mdiArea->addSubWindow (child);      //向多文档区域添加子窗口,child为中心部件
        //根据QTextEdit类是否可以复制信号、设置剪切、复制动作是否可用
        connect(child, SIGNAL(copyAvailable(bool)),cutAct, SLOT(setEnabled(bool)));
        connect(child, SIGNAL(copyAvailable(bool)),copyAct, SLOT(setEnabled(bool)));
    
    
        return child;
    }
    
    
    /*
     * 发现子窗口操作
    */
    QMdiSubWindow *Myword::findMyChild (const QString &fileName)
    {
        /*canonicalFilePath ()可以除去路径中符号链接,如“.”和“..”等符号。这个
         *函数只是将加载文件的路径首先保存到canonicalFilePath中,然后再进行一些状态的设置*/
        QString canonicalFilePath = QFileInfo(fileName).canonicalFilePath ();
        //遍历整个多文档区域的所有子窗口
        foreach(QMdiSubWindow *window, mdiArea->subWindowList ())
        {
            MyChild *myChild = qobject_cast<MyChild *>(window->widget ());
            if(myChild->currentFile () == canonicalFilePath)
            {
                return window;
            }
        }
        return 0;
    }
    
    
    /*
     *
    */
    void Myword::setActiveSubWindow (QWidget *window)
    {
        if(!window)
            return;
        mdiArea->setActiveSubWindow (qobject_cast<QMdiSubWindow*>(window));
    }
    
    
    /*
     * 关于软件
    */
    void Myword::about ()
    {
        QMessageBox::about (this, tr("关于"), tr("这是一个基于Qt实现的文字处理软件,具备类似于微软office word的功能。"));
    }
    /*
     * 设置格式菜单及其对应的工具按钮变为可用状态
    */
    void Myword::enabledText()
    {
        boldAct->setEnabled (true);
        italicAct->setEnabled (true);
        underlineAct->setEnabled (true);
        leftAlignAct->setEnabled (true);
        centerAlignAct->setEnabled (true);
        rightAlignAct->setEnabled (true);
        justifyAct->setEnabled (true);
        colorAct->setEnabled (true);
    }
    /*
     * 新建文件函数
    */
    void Myword::fileNew ()
    {
        MyChild *child = createMyChild ();
        child->newFile ();
        child->show ();
        enabledText();              //使得字体设置菜单可用
    }
    /*
     * 打开文件操作
    */
    void Myword::fileOpen ()
    {
        QString fileName = QFileDialog::getOpenFileName (this, tr("打开"), QString(), tr("HTML 文档 (*.html);所有文件(*.*)"));
        if(!fileName.isEmpty ())
        {
            QMdiSubWindow *existing = findMyChild (fileName);
            //如果发现该文件已经打开,则直接设置为子窗口为活动窗口
            if(existing)
            {
                mdiArea->setActiveSubWindow (existing);
                return;
            }
            //如果文件没有打开则直接加载要打开的文件,并添加新的子窗口
            MyChild *child = createMyChild ();
            if(child->loadFile (fileName))
            {
                statusBar ()->showMessage (tr("文件已加入"), 2000);
                child->show ();;
                enabledText();      //使得字体设置菜单可用
            }
            else
            {
                child->close ();
            }
        }
    }
    
    
    /*
     * 保存文件操作
    */
    void Myword::fileSave ()
    {
        /*如果有活动窗口并且活动点击saveAct动作*/
        if(activeMyChild () && activeMyChild ()->save ())
        {
            statusBar ()->showMessage (tr("保存成功"));
        }
    }
    
    
    void Myword::fileSaveAs ()
    {
        /*如果有活动窗口并且点击saveAsAct动作*/
        if(activeMyChild () && activeMyChild ()->saveAs ())
        {
            statusBar ()->showMessage (tr("保存成功"), 2000);
        }
    }
    
    
    /*
     * 关闭事件
    */
    void Myword::closeEvent (QCloseEvent *event)
    {
        mdiArea->closeAllSubWindows ();
        if(mdiArea->currentSubWindow ())
        {
            event->ignore ();
        }
        else
        {
            event->accept ();
        }
    }
    
    
    /*
     * 撤销
    */
    void Myword::undo()
    {
        //判断是否是当前活动窗口
        if(activeMyChild ())
            activeMyChild ()->undo();
    }
    
    
    /*
     * 重做
    */
    void Myword::redo ()
    {
        //判断是否是当前活动窗口
        if(activeMyChild ())
            activeMyChild ()->redo ();
    }
    
    
    /*
     * 剪切
    */
    void Myword::cut ()
    {
        //判断是否是当前活动窗口
        if(activeMyChild ())
            activeMyChild ()->cut ();
    }
    
    
    /*
     * 复制
    */
    void Myword::copy ()
    {
        //判断是否是当前活动窗口
        if(activeMyChild ())
            activeMyChild ()->copy ();
    }
    
    
    /*
     * 粘贴
    */
    void Myword::paste()
    {
        //判断是否是当前活动窗口
        if(activeMyChild ())
            activeMyChild ()->paste ();
    }
    
    
    /*
     * 加粗
    */
    void Myword::textBold ()
    {
        QTextCharFormat fmt;
        fmt.setFontWeight (boldAct->isChecked () ? QFont::Bold : QFont::Normal);
        if(activeMyChild ())
        {
            activeMyChild ()->mergeFormatOnWordOrSelection (fmt);
        }
    }
    
    
    /*
     * 倾斜
    */
    void Myword::textItalic ()
    {
        QTextCharFormat fmt;
        fmt.setFontItalic (italicAct->isChecked ());
        if(activeMyChild ())
        {
            activeMyChild ()->mergeFormatOnWordOrSelection (fmt);
        }
    }
    
    
    /*
     * 下划线
    */
    void Myword::textUnderline ()
    {
        QTextCharFormat fmt;
        fmt.setFontUnderline (underlineAct->isChecked ());
        if(activeMyChild ())
        {
            activeMyChild ()->mergeFormatOnWordOrSelection (fmt);
        }
    }
    
    
    /*
     * 字体
    */
    void Myword::textFamily (const QString &f)
    {
        QTextCharFormat fmt;
        fmt.setFontFamily (f);
        if(activeMyChild ())
        {
            activeMyChild ()->mergeFormatOnWordOrSelection (fmt);
        }
    }
    
    
    /*
     * 字号
    */
    void Myword::textSize (const QString &p)
    {
        qreal pointsize = p.toFloat ();
    
    
        if(p.toFloat () > 0)
        {
            QTextCharFormat fmt;
            fmt.setFontPointSize (pointsize);
            if(activeMyChild ())
            {
                activeMyChild ()->mergeFormatOnWordOrSelection (fmt);
            }
        }
    
    
    }
    /*
     * 使用整型数字1、2、3和4分别代表左对齐、居中、右对齐和两端对齐
    */
    void Myword::textAlign (QAction *a)
    {
        if(activeMyChild ())
        {
            if(a == leftAlignAct)
            {
                activeMyChild ()->setAlign (1);
            }
            else if(a == centerAlignAct)
            {
                activeMyChild ()->setAlign (2);
            }
            else if(a == rightAlignAct)
            {
                activeMyChild ()->setAlign (3);
            }
            else if(a == justifyAct)
            {
                activeMyChild ()->setAlign (4);
            }
        }
    }
    
    
    /*
     * 设置动作栏图标颜色
    */
    void Myword::colorChanged (const QColor &c)
    {
        QPixmap pix(16, 16);
        pix.fill (c);
        colorAct->setIcon (pix);
    }
    
    
    /*
     * 设置字体颜色
    */
    void Myword::textColor ()
    {
        if(activeMyChild ())
        {
            QColor color = QColorDialog::getColor (activeMyChild ()->textColor (), this);
            //如果颜色无效
            if(!color.isValid ())
            {
                return;
            }
            QTextCharFormat fmt;
            //将画板设置为前台显示
            fmt.setForeground (color);
            activeMyChild ()->mergeFormatOnWordOrSelection (fmt);
            colorChanged (color);
        }
    }
    
    
    /*
     * 设置段落的风格
    */
    void Myword::textStyle (int styleIndex)
    {
        if(activeMyChild ())
        {
            activeMyChild ()->setStyle (styleIndex);
        }
    }
    
    
    /*
     * 打印文档
    */
    void Myword::filePrint ()
    {
        QPrinter printer(QPrinter::HighResolution);
        QPrintDialog *dlg = new QPrintDialog(&printer, this);
        if(activeMyChild ()->textCursor ().hasSelection ())
        {
            dlg->addEnabledOption (QAbstractPrintDialog::PrintSelection);
        }
        dlg->setWindowTitle (tr("打印文档"));
        if(dlg->exec () == QDialog::Accepted)
        {
            activeMyChild ()->print (&printer);
        }
        delete dlg;
    }
    
    
    /*
     * 打印预览文档
    */
    void Myword::filePrintPreview ()
    {
        QPrinter printer(QPrinter::HighResolution);
        QPrintPreviewDialog preview(&printer, this);
        connect (&preview, SIGNAL(paintRequested(QPrinter*)), SLOT(printPreview(QPrinter*)));
        preview.exec ();
    }
    
    
    void Myword::printPreview (QPrinter *printer)
    {
        activeMyChild ()->print (printer);
    }

    展开全文
  • 之前的文章介绍了利用Range对象读写word的方法,用这种方法如果处理比较简单的文档还好,若文档较复杂,就显得有些力不从心了。  比如有这么一个文档,内容如下:  要求我们在程序里面动态的生成这些数据然后...

    一、引言

            本文主要介绍通过Word中的书签Bookmark来向Word中写入我们自定义的数据。之前的文章介绍了利用Range对象读写word的方法,用这种方法如果处理比较简单的文档还好,若文档较复杂,就显得有些力不从心了。

            比如有这么一个文档,内容如下:


            要求我们在程序里面动态的生成这些数据然后补充进word文档里面,此时如果我们再用range进行这些信息的填写,就显得无从下手了。这种文档的格式和排版都是固定的,我们可以称之为模板。如果按照range进行写入的思路,先要读取range,然后在内存中修改数据,最后写入文档时还要针对每个字段进行格式化,以保证排版和操作之前一致。如果遇到比较复杂的排版,这种方案几乎是不可能实现的。

            此时,就需要我们引入书签Bookmark了。通过书签进行word文档写入的思路是:在模板需要填入数据的位置我们预先编写若干书签,而对于其他我们不关系的文字内容我们不用理会,在程序中我们只需要先读取书签,然后再针对每个书签填充即可。这样做的好处就是整个word文档的排版可以事先做好,而我们不必再关心那些烦人的格式问题。

            好,接下来就分步骤介绍下书签Bookmark在开发中的应用。

    二、编写带有书签的模板

             首先,我们要做的是在模板中插入书签。打开模板文档,把鼠标放到需要我们填写数据的“姓名”字段之后,然后从word的“插入”工具栏标签中,找到书签按钮,点击调出增加书签的界面:


            在弹出的“书签”对话框中我们填入为书签的命名name,然后点击添加按钮。


            此时会在文档中我们的鼠标所在的位置插入一个中括号的一个符号,这就是书签:


            如果你没看到类似的符号,请勾选word选项->高级->显示书签,如下图所示:


            接下来我们将剩余的3个字段分别加入书签,书签名称分别为six,job,date这样,整个模板就设置完成了,接下来我们在项目中实现对模板的填充。

            

    三、填充模板

    3.1 加载模板文档

            在“测试”按钮的点击事件处理函数中我们,先利用app.documents.add()的方式打开该文档,代码如下:

      

     private void button1_Click(objectsender, EventArgs e)
            {
                Microsoft.Office.Interop.Word.Application app = newMicrosoft.Office.Interop.Word.Application();
                Documentdoc = app.Documents.Add("D:\\Test.docx");
                doc.ActiveWindow.Visible = true;
            }

            此时如果我们用断点调试,查看加载后的doc对象,你会发现我们所做的书签已经被成功获取,接下来我们就可以遍历书签进行相关操作了:


    3.2 遍历书签填充内容

             Document对象的Bookmarks是所有书签Bookmark的一个集合,我们可以用foreach对其进行循环,然后在调用每个Bookmark的range属性,通过range写入我们的数据:

           

      private void button1_Click(object sender, EventArgs e) 
    	{
                Microsoft.Office.Interop.Word.Application app = newMicrosoft.Office.Interop.Word.Application();
                stringversion = app.Version;
                Console.WriteLine(version);
                Documentdoc = app.Documents.Add("D:\\Test.docx");
                doc.ActiveWindow.Visible = true;
                foreach(Bookmark bk indoc.Bookmarks)
                {
                    bk.Range.Text =GetStrByBookmarkName(bk.Name);
               }
     
            }
     
            privatestring GetStrByBookmarkName(string name)
            {
                stringstr = string.Empty;
                switch(name)
                {
                    case"name":
                        str = "Hyman";
                        break;
                    case"six":
                        str="男";
                        break;
                    case"job":
                        str = "软件工程师";
                        break;
                    case"date":
                        str = DateTime.Now.ToString();
                        break;
                }
                returnstr;
            }

            我们把通过书签名称获取数据的功能封装在了GetStrByBookmarkName函数中,这样循环过后,成功在模板中填充了我们关心的数据。

     

            

    Github位置:

    https://github.com/HymanLiuTS/OfficeTestByC-

    克隆本项目:

    git clone git@github.com:HymanLiuTS/OfficeTestByC-.git

    获取本文源代码:

    git checkout L05

     

    展开全文
  • 解决visio对象word中显示不全的问题

    万次阅读 多人点赞 2018-05-28 16:40:54
    作为一个软件工程师,编写技术文档是常有的事情,使用... 当然,我们可以直接使用截图的方式,将visio对象的截图粘贴到word中,但是这会带来一个问题,如果需要更新文档,或者临时做些修改时,如果是截图的话,...

        作为一个软件工程师,编写技术文档是常有的事情,使用visio绘制各种图形(如,流程图,结构图,框架图,状态图等等)也是再正常不过的事情。

        如果我们在word中撰写文档时,需要引用visio绘制的图形时,就可能有麻烦的事情发生了。

        当然,我们可以直接使用截图的方式,将visio对象的截图粘贴到word中,但是这会带来一个问题,如果需要更新文档,或者临时做些修改时,如果是截图的话,就必须需要找原始的visio文档,比较麻烦。

        方便的做法就是直接将visio对象插入word文档中去。

        不过在这么做的时候,常常也会遇到比较坑爹的问题,那就是在visio中好好的图形,粘贴到word之后就显示不全了。

        这里就记录两种visio对象显示不全的问题,并提供了相应的解决方法,记录起来以作备忘。

                                                        

        以上是我用来测试的原始visio对象图形。接下来就来看两种异常的情况:


    1.  行距不对,比如是固定值:20磅,其显示如下所示:

                                                   

     解决方法:行距不能是固定值,必须改为单倍,1.5倍等类似的值(反正不是固定值就行)


    2. 在行距正确的情况,仍然显示不全,如下面的样子:

                                                      

    解决方法: 在visio对象上点击右键, 会出现一个“样式|裁剪”类似的菜单,选择裁剪

                                                

    然后在visio对象的右侧(四个方向都可以尝试)向右边拖动,这样就可以将visio对象显示完整了

       

    展开全文
  • 设计了一个Word文档批量生成小工具软件

    万次阅读 多人点赞 2018-08-25 10:44:45
    最近,因工作需要开发了一个文档自动生成的小工具软件,即批量替换Word文档模板中设定标签为指定的内容。Word文档模板为事先已经排版好的报表、公文等文件,但留下部分内容需要更改,将该内容设定为一个标签(如...
  • Python3.6实现图片文字识别和PDF转WORD图片文字提取- - 需求来源 - -- - 代码实现 - -PDF转WORD- - 需求来源 - -- - 代码实现 - -窗口实现- - 使用PyQt5创建 - -- - 使用tkinter 创建 - -最终实现- - 实现说明 - -- ...
  • Java准确获取Word/Excel/PPT/PDF的页数(附Word页数读不准的处理办法) 1.需求背景 2.环境准备工作 2.1 JACOB介绍及安装 2.2 Microsoft Office Word的设置 3.代码 3.1 代码示例 3.1.1 pom.xml 3.1.2 主要功能实现 ...
  • 使用python-docx模块,通过其中的Document函数可以读取word文档,然后可以借助document对象的相关属性、方法来获取文档中想要的信息或者编辑文档。 ‘add_heading’, ‘add_page_break’, ‘add_paragraph’, ‘add...
  • Lucene对pdf、word、html等文件的处理

    千次阅读 2014-10-09 18:09:24
    PDFBox是一个在java环境中对pdf文件进行解析处理的开源软件,同时它也提供了一个丰富的类库支持对pdf文件的操作。PDFBox为使 用Lucene的开发者专门提供了LucenePDFDocument类,它的static方法getDocument(ps:该方法...
  • mfc制作图像处理软件总结(一)

    千次阅读 2014-07-24 14:34:19
    首先放出一下软件的运行截图,主要是做了灰度图像的几何变换、正交变换、图像增强、二值化处理、形态学处理、图像分割等功能。代码主要参考了《visual c++数字图象处理技术详解》以及网上的一些技术文章,完整的...
  • 面向对象体系结构风格的KWIC关键词索引系统 java实现
  • &#13; &#13; &#13; &#13; &#13; &#13; &#13; 本文教你用简单易学的工业级Python自然语言处理软件包Spacy,对自然语言文本做词性分析、命名实...
  • Word是一个功能强大的文字处理软件,在Word文档中可以方便的对文字信息进行排版,也可以向文档中插入生动、直观的图片信息,本实例将会介绍一个有趣的功能,向Word文档中插入Windows控件,并且此控件还可以响应用户...
  • 通过freemarker制作word比较简单 步骤:制作word模板。制作方式是:将模板word保存成为xml----在xml的word模板中添加相应的标记----将xml的word文件的后缀名改成ftl文件   详细步骤如下: 模板制作(将要...
  • 使用Excel可以方便的处理表格信息,但是在Word中也可以简单的使用表格,在Word菜单中单击“表格”/“插入”/“表格”,在插入表格窗口中添加表格的行数和列数,最后单击“确定”按钮插入表格。在实例中我们可以使用...
  • POI操作word模板并生成新的word.docx

    千次阅读 2017-08-18 13:29:06
    POI能操作word是使用XWPFDocument对象。 XWPFDocument对象可以解析docx文件,在XWPFDocument对象通过输入流解析docx的时候,会获取到docx文档中的各种对象,例如表格,段落,图片等,通过操作XWPFDocument对象就...
  • Word表格之VBA知识

    千次阅读 多人点赞 2019-01-28 13:56:10
    Table对象(因为是对象,...下面是Table的常用方法(注意是部分,不是全部,只例出重要的方法,下面的属性皆如此,如果详细面全部的了解,请看Word VBA自带的帮助。VBAWD10.chm) 使用Table对象 可使用 Tables(...
  • Word宏与VBA/VB

    千次阅读 2019-04-24 18:05:28
    1、 Visual Basic(简称VB)是Microsoft公司开发的一种通用的基于对象的程序设计语言。是一种可用于微软自家产品开发的语言。 2、Word宏 宏是一个批量处理程序命令,正确地运用它可以提高工作效率。 微软的...
  • Android中解析读取复杂word,excel,ppt等的方法

    万次阅读 热门讨论 2016-08-02 17:49:20
    查阅了下资料,发现Android中最传统的直接解析读取word,excel的方法主要用了java里第三方包,比如利用tm-extractors-0.4.jar和jxl.jar等,下面附上代码和效果图。  读取word用了tm-extractors-0.4.jar包,代码如
  • 利用poi读取word模板文件生成新的word文档 利用poi读取word模板文件,并回填逻辑数据,生成并导出需要的word文档源码。解决模板读取异常问题,提供wordUtils工具类(各种功能实现) 第一步: 项目结构见下图: 第二...
  • poi操作word模板(word2003,word2007)

    千次阅读 2014-06-06 13:02:12
    近期老师给了个任务,要通过Word模版生成各类文档,主要就是将类似%title%,%name%,%content%等标签,通过类的方法,查询数据库并替换标签,上网查了一下,发现POI对文档操作比较不错,Apache POI是Apache软件基金...
  • 自然语言处理NLP开源软件工具包

    千次阅读 2019-06-24 11:49:34
    自然语言处理(NLP) 开源软件工具包 基础研究领域 1、文本分类 2、依存分析 3、命名实体 4、词性标注 5、中文分词 6、情感分析 7、信息抽取 8、文本摘要 一、NLTK NLTLK官方文档地址:http://www.nltk.org/ ...
  • 【计算机基础】03-Word知识

    万次阅读 2020-05-09 13:41:13
    Office 2010组件包括Word(文字处理软件)、Excel(电子表格软件)、PowerPoint(幻灯片制作软件)、Outlook(个人信息管理软件)、Access(关联式数据库管理软件)、Publisher(桌面出版应用软件)、InfoPath...
  • word宏、宏编程以及VBA

    万次阅读 多人点赞 2018-12-03 19:55:37
    微软的office软件允许用户自己编写,叫VBA的脚本来增加其灵活性,进一步扩充它的能力。 如完成一个一打开word文件同时要打开某个文件的功能,必须要自己编写一段称之为宏的脚本。 具体做法是在菜单栏点击开发工具-...
  • Word 通过添加Package 实现word藏毒

    千次阅读 2017-01-15 20:15:02
    刚刚倒腾了好久,找到了解决方案了,可以直接利用第三方软件,比如本机上装了AAA产品,分析发的升级请求调用格式(这个地方有的保护了,有的没保护),然后直接调用他就没事了,不过这个地方就自然引入了一个局限性...
  • java操作word/excel/pdf等文件技术方案

    千次阅读 2017-03-15 17:07:41
    最近项目中遇到很多对word/excel/pdf等文件的操作,解决方案有好多,开源免费有:利用openoffice组件(需要安装openoffice软件),poi,itext等。也有收费的服务:aspose(特别好用,也有点贵)。 我项目中需求可以...
  • 使用Python自动化Microsoft Excel和Word

    千次阅读 多人点赞 2021-04-17 09:19:30
    毫无疑问,微软的Excel和Word是公司和非公司领域使用最广泛的两款软件。它们实际上是“工作”的同义词。通常情况下,每一周我们都会将两者结合起来,并以某种方式发挥它们的优点。虽然一般的日常用途不会要求自动化...
  • 5.3 OBJECT-BASED DECOMPOSITION5.3 基于对象的分解 The case for using objects (or more precisely, as seen below, object types) as the key to system modularization is based on the quality aims defined ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,087
精华内容 21,234
关键字:

word软件主要处理对象是