精华内容
下载资源
问答
  • word目录无法定位到内容
    千次阅读
    2021-07-26 02:45:07

    在 Word 中,如果要求编排好的内容自动生成目录,编排时需要把章节按级设置为不同的标题样式,章要设置为一级标题,节要设置为二级、三级、四级标题;另外,目录和内容要独立编排页码,即它们的页码都要从 1 开始,因此还需要分节。

    自动生成目录后,如果又添加了新内容,需要把所加内容的章节添加到目录中,只需更新目录或把目录改为另一种自动生成目录样式。如果想取消目录,可以把它们删除。以下就是Word怎么生成目录的具体步骤,共分为五步,操作所用版本为 Word 2016。

    一、Word目录怎么自动生成第 1 步:设置章节样式

    1、选中一级标题“第一章 Word 基本操作”,当前选项卡为“开始”,单击窗口右上角“样式”上面的“标题”,把选中文字设置为“标题”样式;单击“字号”下拉列表框,在弹出的选项中选择“一号”,把一级标题的字号设置大一些。2、选中二级标题“1.1 基本设置”,单击“其他样式(即一横 + 小倒三角图标)”,在展开的样式中选择“标题1”,把选中文字的样式设置为“标题1”。

    3、选中三级标题“1.1.1 定时保存设置”,单击“样式”右上角的小倒三角翻到下一页,选择“标题2”,把所选文字设置为该样式,同样方法把“1.1.2 显示设置”也设置为“标题2”。操作过程步骤,如图1所示:

    图1

    提示:以上只设置了部分标题,剩余的标题也需要按“章”设置为“标题”、第一级“节”设置为“标题1”、第二级“节”设置为“标题2”,如果还有第三级“节”,可以把它们设置“标题3”,其它的以此类推。

    4、说明:设置章节样式主要是把书的标题分级以便于自动生成目录,Word自动生成目录时,按标题级别从高到低依次生成。

    二、Word目录怎么自动生成第 2 步:设置分节符

    1、单击“第一章”前面把光标定位到那里,选择“布局”选项卡,单击“分隔符”,在弹出的菜单中选择“分节符”下的“下一页”,则在下一页插入分节符(即在目录与内容之间插入分节符,以实现目录与内容单独设置页码);

    2、往下拖右边的滑块移到上一页,选择“开始”选项卡,单击“显示/隐藏编辑标记”图标,则显示“分节符(下一页)”,说明成功插入分节符,再次单击“显示/隐藏编辑标记”图标,把分节符隐藏起来,如图2所示:

    图2

    3、说明:设置分节符的目的是便于把目录页与内容页都从 1 开始设置页码,否则它们的页码会连起来,即内容的页码会接目录的页码。

    三、Word目录怎么自动生成第 3 步:设置页码

    1、选择“插入”选项卡,单击“页码”,在弹出的菜单中选择“页面底端”,在展开的页码样式中选择“普通数字 2”,则所有页插入页码;每节的页码是按顺序相接的,第一节为第 1 页,往下拖右边的滑块,一直移到第二节,选中页码 2,单击窗口左上角的“页码”,在弹出的菜单中选择“设置页码样式”;

    2、打开“页码格式”窗口,“页码编号”选择“起始页码”,输入框中保留 1,单击“确定”,则第二节从第 1 页开始编号,往下拖右边的滑块,移到下一页,第二节的第二页页码已经变为 2;操作过程步骤,如图3所示:

    图3

    3、如果觉得页码字体太小,选择“开始”选项卡,单击“字号”下拉列表框,选择一种合适的字号即可;如果要改字体,单击“字体”下拉列表框,选择一种字体即可。

    四、Word目录怎么自动生成第 4 步:生成目录

    1、单击“关闭页眉和页脚”,退出页眉和页脚的编辑状态,往上拖右边的滑块移到第一页,单击一下第一页,选择“引用”选项卡,单击窗口左上角的“目录”,在弹出的目录样式中,选择“自动目录 1”,则全书按所选目录样式自动生成目录;操作过程步骤,如图4所示:

    图4

    2、提示:生成目录前一定要关闭页眉和页脚,否则会生成多个重复的目录,由于生成目录会占用大量的电脑资源,一次生成多个目录会使电脑无响应。

    五、Word目录怎么自动生成第 5 步:设置目录样式

    1、将“目录”二字居中与调整行距。选中“目录”二字,单击“水平居中”图标,则“目录”居中;在“第一章”前面单击,把光标定位到哪里,往下拖右边的滑块一直拖到目录末尾,按住 Shift,单击一下目录末尾,选中所有目录,单击“行和段落间距”图标,在弹出的选项中选择 1.5,则目录行距设置为 1.5 磅;操作过程步骤,如图5所示:

    图5

    2、设置章样式。选中“第一章 Word 的基本操作”,按住 Ctrl,再选中“第二章 文字基本操作”,单击“字号”下拉列表框,在弹出的选项中选择“小三”,把“章”的字号设置为“小三”,单击粗体 B,再把它们加粗;操作过程步骤,如图6所示:

    图6

    六、Word自动生成目录的更新、更改与删除

    1、更新目录。如果又添加了新的章节,需要把它们添加到目录中,只需更新目录即可,方法为:单击“目录”任意位置选中它们,单击目录左上角的“更新目录”,在打开的窗口中,选择“更新整个目录”,单击“确定”,则新添加的章节也更新到目录中;操作过程步骤,如图7所示:

    图7

    提示:更新目录后,之前设置的所有样式都没有了,需要重新设置。

    2、更改与删除目录。单击一下目录任意位置选中它们,单击“目录”左上角的图标,在弹出的目录样式中选择“自动目录 2”,则目录更改为所选样式,原来设置的样式也没有了;再次单击该图标,在弹出的菜单中选择最下面的“删除”,则目录被删除;操作过程步骤,如图8所示:

    图8

    提示:更改自动生成的目录必须选择“自动目录”(即不能选择“手动目录”),否则无法按章节自动生成目录。

    更多相关内容
  • 右击属性 位置怎么知道word的安装位置解决怎么...4.此时就会看到已经打开了软件的安装目录,并且定位在软件的启动程序上。5.软件的整个安装目录在上面都有显示。这样就解决了怎么知道word的安装位置的问题了。如何...

    右击属性 位置

    4cbc88f9f4d2dd419b66169faeffddcf.png

    怎么知道word的安装位置

    解决怎么知道word的安装位置的步骤如下:

    1.在桌面程序的快捷方式上右键单击,然后选择属性。

    9f73734100c401aa9991aee78ec1ded8.png

    2.或者在开始程序的菜单中右键单击程序图标,然后选择属性。

    804cbfa5602ae5545432f816ca8aeffb.png

    3.在属性的快捷方式中点击打开文件夹位置然后确定。

    b247305e2ab3d8edc21d712c498ae4d4.png

    4.此时就会看到已经打开了软件的安装目录,并且定位在软件的启动程序上。

    239a04c5ebd9faa6cf49dfd4cdef083b.png

    5.软件的整个安装目录在上面都有显示。这样就解决了怎么知道word的安装位置的问题了。

    475821da6fc2caf9dd9cc9efcd5ea844.png

    如何查找word程序在电脑的什么位置

    不知道你用的是XP 还是win7不过应该错不多。

    你在开始——>所有程序——>microsoft office word ——>右击属性 在这里找

    怎样查找word2007的根目录?

    你说的是安装启动该程序的启动文件WINWORD.EXE所在的目录吧,最简单的办法就是用win操作系统的搜索文件功能,搜索该WINWORD.EXE文件,就可知道了该目录了。

    win7时,我安装在C:盘下的目录是:C:\Program Files (x86)\Microsoft Office\Office12

    怎么查看一个打开的word文档的保存路径

    恢复受损Word文档四种方法

    Word是我们日常工作中使用最普遍的文档处理工具之一,但是很多朋友在使用时对碰到的文档出错,常常无计可施。难道只能眼睁睁的看着急需的文档无法打开而放弃吗?当然不能,其实在真正放弃之前,不防先看看我们的拯救行动方案。

    一、第一方案:自动恢复

    如果在编辑文档时,突然遭遇程序停止响应、死机,甚至死电等情况,而文档又未能及时保存时,这时不防按正常操作方法重新启动电脑,然后打开Word 2003,这样Word会自动弹出一个文档恢复操作窗口,在窗口中选择一个较晚的自动保存项目进行恢复。这样可以将损失降到最低点。

    不过要想提高自动恢复的成功率,你还必须提前做好相应的设置工作。即打开Word“工具”菜单下的“选项”命令,切换到“保存”选项卡,然后选中“允许后台保存”和“自动保存时间间隔”选项,同时在“自动保存时间间隔”后设置一个时间间隔,该时间不宜太长。保存设置后,就可以代替粗心的朋友及时保存编辑的文档了。

    二、第二方案:打开修复

    对于以前保存的文档,若碰到双击鼠标试图打开时,却弹出了文档出错无法查看的提示,这时不防改变其打开方式。

    首先从程序菜单中启动Word 2003,然后单击“工具栏”上的“打开”按钮,在弹出的对话框“查找范围”选择欲打开的文档所在文件夹,然后选中该文档,再单击右下角“打开”按钮一侧的小箭头按钮,在弹出的菜单中选择“打开并修复”命令,这样Word会自动把一些错误修复并恢复文档的正常打开。

    三、第三方案:修改启动

    由于Word文档支持宏命令,因此一些文档的原作者在里面使用宏命令进行加密,或者加载其中的宏命令出错,同样会导致文档无法打开。这时我们不防通可修改Word启动参数,禁止宏运行的方式来打开文档。

    进入Word 2003安装目录,然后找到其中的Winword.exe,将其发送到桌面快捷方式。打开该快捷方式的属性窗口,然后在“目标”栏后面加上“/m”,保存修改的快捷方式,然后拖动文档放置到该快捷方式图标上,文档中的宏命令即无法运行了。

    四、第四方案:恢复文本

    如果上面的方法都不行,那么就只能试试“从任意文件中恢复文本”转载器来尽最大限度救出Word文档中的文字内容了。

    启动Word后打开“工具”菜单下的“选项”命令,在“常规”标签中选中“打开时确认转换”选项,然后再打开“文件”菜单下的“打开”命令,在“查找范围”中选择文档保存路径,然后在下方的“文本类型”中选择“从任意文件中恢复文本”,接下来再选中欲打开的文档,单击“打开”按钮,这样即可从文档中恢复文本内容,不过这时恢复的文本格式就丢失了。

    其实在文档无法打开的时候,大家还可以尝试使用低版本、记事本或者一些第三方的文档编辑软件来打开,另外还可以使用杀毒软件进行病毒查杀,一般情况都是可以恢复的。

    如何查看office的安装路径

    找到桌面上的OFFICE随便 快捷方式 比如 word的 ——右键——属性——查看文件位置。打开就是你word 安装路径了。

    怎样在Word中精确查找文字 快速定位到需要的位置

    具体方法为:点击菜单栏的“编辑”---查找, 这时可以有两种方法了,一是逐一显示查到的文字,做法是:1、查找内容:填写你要找的文字,然后点击“查找下一处”(每查找到一处你都可以对文字进行修改),直至到文档末尾,会查找到所有你要找的文字;还有第二个方法就是一次性突出显示出所有你要找的文字,具体做法是:同样是先在“查找内容”中输入你要找的文字,然后在对话框“突出显示所有在该范围找到的项目”在前面打上钩,这样就会把你要找的文字一下都“涂黑”,从而突出显示出来,两个方法其实原理是一样的,就看你怎么选了。(特殊说明,我是以word2003为例的,2007,2010,2013等原理是一样的)

    在电脑上要怎样找到已经安装的word软件

    在电脑上找已经安装的word软件的具体步骤如下:

    我们需要准备的材料分别是:电脑、word软件。

    1、首先我们打开电脑,点击打开左下角的开始图标。

    c04b67fc0b89b54b2ed1851d8cd9fb63.png

    2、然后我们在弹出来的页面中点击“搜索程序和文件”的搜索框。

    3121d059ec1477853767e0d25080d928.png

    3、然后输入“word”,即可在最顶上看到word软件。

    2ca034581367f93cc12c5be971d547aa.png

    展开全文
  • 解决word生成目录-页码-字体问题

    千次阅读 2019-10-25 12:02:59
    1.word独立生成目录页码 2.word从正文第一页开始自动生成目录 1.word独立生成目录页码 (1). 一般而言,我们写好的文档会是这样的 (2). 给文档的各级标题添加 标题样式 ,根据需要... 光标定位到封皮空白处,选择...

    1.word独立生成目录页码

    2.word从正文第一页开始自动生成目录

    3.word自动生成目录,出现部分文字后面省略号疏密不一致的问题

    1.word独立生成目录页码

    (1). 一般而言,我们写好的文档会是这样的
    在这里插入图片描述
    (2). 给文档的各级标题添加 标题样式 ,根据需要设置的标题等级依次选用不同的样式。
    首先添加”一级标题“(也可以直接在段落中设置)。在这里插入图片描述
    (3). 然后按添加一级标题的方法添加”二级标题“、三级标题等。
    在这里插入图片描述
    (4). 光标定位到封皮空白处,选择 页面布局 – 分隔符 —下一页,生成一页空白在这里插入图片描述
    (5). 在正文第一页,双击页脚,取消“链接到前一条页眉”,然后选择页码 – 设置页码格式
    在这里插入图片描述
    在这里插入图片描述
    (6). 然后,页码–页面底端–确定
    在这里插入图片描述
    (7).生成页码如下图所示
    在这里插入图片描述

    2.word从正文第一页开始自动生成目录

    (1).目录生成有两种,一种是直接选择现有的模板
    在这里插入图片描述
    (2).效果为:
    在这里插入图片描述
    (3).但我们经常遇到的目录级别不止三层,需要自定义生成的目录级别,但目录二字无法生成,所以需要先写上(不写的话不利于后面的排版),然后选择 引用 – 目录 – 插入目录:
    在这里插入图片描述
    (4).通过预览窗口可以看到效果,通过常规功能区可设置格式,一般都为 来自模板 ,并且选择需要显示的目录数
    在这里插入图片描述
    (5).效果为:
    在这里插入图片描述
    (6).在这里,一级标题为 加粗体 ,如果需要修改,点击 修改 按钮
    在这里插入图片描述
    (7).在这里我们选择将加粗标记去除掉就好了
    在这里插入图片描述

    3.word自动生成目录,出现部分文字后面省略号疏密不一致的问题

    在这里插入图片描述
    这是由于省略号被设置成了宋体或者其他字体,导致省略号是中文习惯,间隔偏大。

    选中目录,将其设置成Times New Roman即可解决问题。
    在这里插入图片描述

    展开全文
  • vue展示word目录

    目录

    背景

    思考过程

    word转markdown

    用node的express框架搭建服务器

    展示md文件到页面上

    提取目录

    引入element树

    纯前端展示

    完整目录结构


    背景

    当前所做项目(vue-cli+element)有一个需求,做一个帮助文档,把word文档在页面中展示出来,要求能目录跳转。

    思考过程

    拿到这个需求,感觉这个难点在于目录跳转,word就算读取也全是字,无法识别哪里是目录,然后去提取目录和做定位。年前做项目时,因为项目中公共组件比较多,就想写个使用说明,专门去学过markdown的语法,在markdown中,1个到6个#号分别对应html标签中h1-h6,如果能把word转成markdown,不就可以根据#提取出一个目录了吗?所以要做的第一部就是把word转成markdown。

    word转markdown

    word转markdown的首先想的是找找有没在线工具,不用下载直接用还是比较舒服的。在网上倒是找到了一个,但是说实话,效果不太好。之前玩游戏要自己做一个筛选页面,因为excel看着实在太费劲了,需要把ecexl表格转JSON数据,然后再处理成组件需要的格式,那会也是找了好多在线的都不好用,最后用的是一个excel自带的插件,名字叫excel to json,还是非常好用的。对了,那个筛选页面我扔到码云上了,已发布到网上,点击这里查看,上面那个筛选组件(我叫选项卡)是我手写的,有需要的可以联系我。所以最后考虑word有没自带的插件能把它转成一个md文件,最后还真找到了一个插件 Writage 转md文件效果特别好,会把word文档里的图片提取到一个文件夹里,打开md文件,所有图片均能正常显示,15000+字的文档只有一处错误,手动改了。Writage 安装好之后,最上面就能看到。

    安装好之后点文件,另存为,选择存放位置,选择格式,这里格式一定要选md。

    然后你就可以在之前选择的位置找到它的md格式版,同时还会有一个目录,用来存放文档中所有涉及到的图片,至于help.js是干什么的后面会解释。

     到这里有两种选择,一种是md文件和media文件夹都放在服务器上,通过请求后端接口来展示,另一种是都放在前端,纯前端展示。这里先说第一种,都放在服务器上,通过接口请求md内容,然后再做展示。

    用node的express框架搭建服务器

    这里的代码啥意思就不说了,直接上代码

    // express-static得用npm下载 npm i express-static --save
    const express = require("express");
    const expressStatic = require("express-static");
    const fs = require('fs');
    
    var server = express();
    server.listen(5566);
    console.log('服务器启动成功地址是: localhost:5566');
    
    // 配置请求头
    server.all('*', function (req, res, next) {
        res.header("Access-Control-Allow-Origin", "*")
        res.header("Access-Control-Allow-Headers", "X-Requested-With")
        res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS")
        res.header("X-Powered-By", ' 3.2.1')
        res.header("Content-Type", "application/json;charset=utf-8")
        next()
    });
    
    // 读取help.md里的内容并返回给前端
    server.use("/getHelp", function (req, res) {
        // 同步读取文件
        let helpData = fs.readFileSync("./document/help.md");
        res.send(helpData);
    });
    
    // 静态文件目录
    server.use(expressStatic("./document"));
    
    
    
    

    终端启动服务器,后面是目录结构

    后端服务写好了,现在让我们来写前端代码,因为是要做demo,所以直接在app.vue里写,这里用的是axios(npm i axios -S)进行的请求。

    mehtods里

        getHelp() {
          this.$axios
            .get("http://localhost:5566/getHelp")
            .then((res) => {
              console.log(res.data);
            })
            .catch((err) => {
              console.log(err);
            });
        },

    created里调用这个方法,我们就拿到了help点md里的内容。接下来考虑怎么把md格式的内容展示到页面上。

    展示md文件到页面上

    把md文件展示到页面上我们需要借助一个插件 marked.js 这个插件可以把md格式转换成html,我们就可以直接通过插值表达式或者v-html去渲染到页面上了,用法也很简单

    npm i marked --save 然后再引入使用就可以了,我这里是在main里引入,然后绑定到全局了

    import marked from "marked";
    Vue.prototype.$marked = marked;

    对getHelp方法进行改造

      getHelp() {
          this.$axios
            .get("http://localhost:5566/getHelp")
            .then((res) => {
              // 原始md文件内容
              this.helpData = res.data;
              // 转换后的html
              this.help = this.$marked(res.data);   
            })
            .catch((err) => {
              console.log(err);
            });
        },

     然后我们之间在页面上去渲染help属性就好了。这里有个坑是图片的,因为用Writage转md后,所有图片的引入链接全是 media/943f402e73aecc2c08ffaeb88de41720.png ,需要手动全局替换目录地址,可以另外打开一个页面能成功看到图片,然后再做全局修改,这里我是这么做的。

    接下来就是提取目录,然后目录跟页面内容一一对应起来。说实话,刚开始到这确实没有思路,直到看到了md转换成html后的内容,发现会自动给每个h标签添加一个id,其id值为标题内容,但是稍微有点坑,坑后面再说。这样的话,我们可以提取出来一个目录结构,然后通过锚点(创建一个a标签,href值为#标题名,点击这个a标签)跳转到对应的部分。这个目录我用的是element的树结构,所以先从原始md文件内容提取出来一个符合其树结构的数据格式的目录吧。

    提取目录

    我这里卡的比较久,可能是因为js基础不够扎实。因为md中,1个#到6个#是一一对应的,所以并且是按顺序的,所以我们一定可以通过代码来生成我们需要的目录。这里直接放代码(注释全写代码里了),你们如果有其他更好的方式可以分享出来,让我学习学习。

       // 获取目录树
        getTitle() {
          // 提取出所有#和后面标题,放到一个数组中
          let titleList = this.helpData.match(/#+.+/g);
          // 把每个标题出现次数统计出来,必须保证标题唯一,全部使用1.1.1.1这是一个好办法
          // 因为marked会把#后面的内容添加为id,如果标题重复,锚点跳转会只跳第一个
          let count = titleList.reduce((obj, name) => {
            if (name in obj) {
              obj[name]++;
            } else {
              obj[name] = 1;
            }
            return obj;
          }, {});
          // 删除只出现了一次的
          for (let item in count) {
            if (count[item] == 1) {
              delete count[item];
            }
          }
          // console.log(count);
          // 能保证标题唯一的话,可以不用加这行代码
          titleList = titleList.map((item, index) => (item = index + "$" + item));
          // console.log(titleList);
          // 最后一个各级别的标题
          let nowLabel = [];
          // 生成的标题
          let title = [];
          // 当前对象
          let cur;
          for (let item of titleList) {
            // 当前目录级别
            let level = item.match(/#+/)[0].length;
            // 其父级目录文字
            let label = nowLabel[level - 2];
            // 更新当前目录文字
            nowLabel[level - 1] = item;
            // console.log(item, nowLabel, "===============");
            if (level == 1) {
              cur = {
                level: level,
                label: item,
                value: item,
                children: [],
              };
              title.push(cur);
            } else {
              let obj = this.getObj(label, cur, level);
              // console.log(obj);
              // 把当前目录添加到其父级目录对象的children里
              obj.children.push({
                level: level,
                label: item,
                value: item,
                children: [],
              });
            }
          }
          // 这里是去除标题里的#和空格(如果上面没添加$和索引的话)
          this.titleData = this.removeTitleData(title);
        },
        // 该方法根据传入参数,返回其父级目录对象
        // 当前目录父级目录,当前一级目录对象,当前目录级别
        getObj(label, cur, level) {
          if (level - 1 > cur.level) {
            for (let item of cur.children) {
              let res = this.getObj(label, item, level);
              if (res) {
                return res;
              } else {
                continue;
              }
            }
          } else {
            if (cur.label == label) {
              return cur;
            } else {
              return false;
            }
          }
        },
        // 去除目录中无用的部分
        removeTitleData(title) {
          return title.map((item) => {
            // 这里因为标题里添加$和索引了,如果没有添加,可以不需要这行
            item.label = item.label.split("$")[1];
            item.label = item.label.replace(/#+\s+/, "");
            if (item.children.length > 0) {
              item.children = this.removeTitleData(item.children);
            }
            return item;
          });
        },

    gethelp方法里调用方法获取目录

      getHelp() {
          this.$axios
            .get("http://localhost:5566/getHelp")
            .then((res) => {
              // 原始md文件内容
              this.helpData = res.data;
              // 转换后的html
              this.help = this.$marked(res.data);  
              // 获取目录
              this.getTitle(); 
            })
            .catch((err) => {
              console.log(err);
            });
        },

    data里是这样的

     data() {
        return {
          // md原始数据
          helpData: "",
          // md转成html标签后的数据
          help: "",
          // 目录数据
          titleData: [],
          // 目录树配置
          defaultProps: {
            children: "children",
            label: "label",
          },
          // 是否使用本地数据
          isLocalFile: true,
        };
      },

     接下来引用element树,做渲染

    引入element树

    <!-- accordion是用手风琴效果了 --> 
    <el-tree
          class="titleTree"
          :data="titleData"
          accordion
          :props="defaultProps"
          @node-click="toTitle"
     ></el-tree>

    树节点点击toTitle方法 

        // 目录跳转的方法
        toTitle(data) {
          // console.log(data);
          // 新建一个a标签用来做跳转
          let a = document.createElement("a");
          // 这里就是marked自动添加id的坑 1.2.1.2会变成 1212 ,把点会去掉
          // 第二个坑是会把空格转成 "-"
          console.log(data.label.replace(" ", "-").replace(/[.]{1}/g, ""));
          // 设置锚点,这里直接用label是因为我重新手动设置id为内容了
          a.href = "#" + decodeURI(data.label);
          // 触发a的点击事件进行跳转
          a.click();
        },

     重新手动设置id的方法

        // 手动修改所有h标签的id
        resetId() {
          for (let i = 1; i < 7; i++) {
            let h = document.getElementsByTagName("h" + i);
            for (let j = 0; j < h.length; j++) {
              h[j].setAttribute("id", h[j].innerHTML);
            }
            // console.log(h);
          }
        },

     getHelp方法里调用

      getHelp() {
          this.$axios
            .get("http://localhost:5566/getHelp")
            .then((res) => {
              this.helpData = res.data;
              this.help = this.$marked(res.data);
              this.getTitle();
              // 必须在页面渲染完后再执行这个方法,不然会获取不到
              this.$nextTick(() => {
                this.resetId();
              });
            })
            .catch((err) => {
              console.log(err);
            });
        },

    还有其他可以优化的地方,比如:树结构标题超长可以换行或者省略号展示,加载一次后把目录数据存在本地等,这里就不赘述了。接下来我们来讨论另一个,把md文档和对应图片放在本地,纯前端做展示。

    纯前端展示

    纯前端展示其实跟接口返回是一样的,这里我们得把md数据放在一个js文件中导出,然后在app中引入,这里图片地址同样得改,需要注意的是,media文件夹必须放在static里才能正常展示,其他地方没试。

    <!-- 这里是 help.js 里的内容 -->
    // 修改完图片地址后,直接把md文件的内容全粘到反引号里就可以了
    let data = `  `
    
    export default data;
    

    app.vue 完整代码如下,我是把使用本地资源还是接口数据写了一个变量做切换,电脑还是app显示也做了一个变量(就是把目录给隐藏了),app目录得用其他方式进行展示。目录文字超长这里我做了两种处理,折行显示或超出部分显示省略号。

    <template>
      <div id="app">
        <el-tree
          v-if="!isApp"
          class="titleTree"
          :data="titleData"
          accordion
          :props="defaultProps"
          @node-click="toTitle"
        ></el-tree>
        <div :class="[{ content: !isApp }]" v-html="help"></div>
    
      </div>
    </template>
    
    <script>
    import help from "@/document/help.js";
    export default {
      name: "App",
      created() {
        if (this.isLocalFile) {
          this.helpData = help;
          this.help = this.$marked(help);
          this.getTitle();
          this.$nextTick(() => {
            this.resetId();
          });
          return;
        }
        this.getHelp();
      },
      data() {
        return {
          // md原始数据
          helpData: "",
          // md转成html标签后的数据
          help: "",
          // 目录数据
          titleData: [],
          // 目录树配置
          defaultProps: {
            children: "children",
            label: "label",
          },
          // 是否使用本地数据
          isLocalFile: false,
          // App显示还是电脑
          isApp: false,
        };
      },
      methods: {
        getHelp() {
          this.$axios
            .get("http://localhost:5566/getHelp")
            .then((res) => {
              this.helpData = res.data;
              this.help = this.$marked(res.data);
              this.getTitle();
              // 必须在页面渲染完后再执行这个方法
              this.$nextTick(() => {
                this.resetId();
              });
            })
            .catch((err) => {
              console.log(err);
            });
        },
        // 获取目录树
        getTitle() {
          // 提取出所有#和后面标题,放到一个数组中
          let titleList = this.helpData.match(/#+.+/g);
          // 把每个标题出现次数统计出来,必须保证标题唯一,全部使用1.1.1.1这是一个好办法
          // 因为marked会把#后面的内容添加为id,如果标题重复,锚点跳转会只跳第一个
          let count = titleList.reduce((obj, name) => {
            if (name in obj) {
              obj[name]++;
            } else {
              obj[name] = 1;
            }
            return obj;
          }, {});
          // 删除只出现了一次的
          for (let item in count) {
            if (count[item] == 1) {
              delete count[item];
            }
          }
          // console.log(count);
          // 能保证标题唯一的话,可以不用加这行代码
          titleList = titleList.map((item, index) => (item = index + "$" + item));
          // console.log(titleList);
          // 最后一个各级别的标题
          let nowLabel = [];
          // 生成的标题
          let title = [];
          // 当前对象
          let cur;
          for (let item of titleList) {
            // 当前目录级别
            let level = item.match(/#+/)[0].length;
            // 其父级目录文字
            let label = nowLabel[level - 2];
            // 更新当前目录文字
            nowLabel[level - 1] = item;
            if (level == 1) {
              cur = {
                level: level,
                label: item,
                value: item,
                children: [],
              };
              title.push(cur);
            } else {
              let obj = this.getObj(label, cur, level);
              // 把当前目录添加到其父级目录对象的children里
              obj.children.push({
                level: level,
                label: item,
                value: item,
                children: [],
              });
            }
          }
          // 这里是去除标题里的#和空格(如果上面没添加$和索引的话)
          this.titleData = this.removeTitleData(title);
        },
        // 该方法根据传入参数,返回其父级目录对象
        // 当前目录父级目录,当前一级目录对象,当前目录级别
        getObj(label, cur, level) {
          if (level - 1 > cur.level) {
            for (let item of cur.children) {
              let res = this.getObj(label, item, level);
              if (res) {
                return res;
              } else {
                continue;
              }
            }
          } else {
            if (cur.label == label) {
              return cur;
            } else {
              return false;
            }
          }
        },
        // 去除目录中无用的部分
        removeTitleData(title) {
          return title.map((item) => {
            // 这里因为标题里添加$和索引了,如果没有添加,可以不需要这行
            item.label = item.label.split("$")[1];
            item.label = item.label.replace(/#+\s+/, "");
            if (item.children.length > 0) {
              item.children = this.removeTitleData(item.children);
            }
            return item;
          });
        },
        // 手动修改所有h标签的id
        resetId() {
          for (let i = 1; i < 7; i++) {
            let h = document.getElementsByTagName("h" + i);
            for (let j = 0; j < h.length; j++) {
              h[j].setAttribute("id", h[j].innerHTML);
            }
            // console.log(h);
          }
        },
        // 目录跳转的方法
        toTitle(data) {
          // console.log(data);
          // 新建一个a标签用来做跳转
          let a = document.createElement("a");
          // 这里就是marked自动添加id的坑 1.2.1.2会变成 1212 ,把点会去掉
          // 第二个坑是会把空格转成 "-"
          // console.log(data.label.replace(" ", "-").replace(/[.]{1}/g, ""));
          // 设置锚点,这里直接用label是因为我重新手动设置id为内容了
          a.href = "#" + decodeURI(data.label);
          // 触发a的点击事件进行跳转
          a.click();
        },
      },
      components: {
        VueMarkdown,
      },
    };
    </script>
    
    <style>
    #app {
      font-family: "Avenir", Helvetica, Arial, sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      color: #2c3e50;
      margin-top: 60px;
      display: flex;
    }
    .titleTree {
      width: 300px;
      min-height: 100vh;
      background-color: #fafafa;
      position: fixed !important;
      left: 0;
      top: 0;
      border-right: 1px solid #e8e8e8;
    }
    .el-tree-node {
      white-space: normal;
      padding: 1px 0;
      padding-right: 10px;
      /* overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
      padding-right: 10px; */
    }
    .el-tree-node__content {
      height: 100%;
      align-items: start;
    }
    .content {
      width: calc(100% - 310px);
      margin-left: 310px;
      background-color: #fff;
    }
    img {
      max-width: 100%;
    }
    </style>
    

    最终效果如下:

    完整目录结构

    别问我为啥还有个2,因为本身使用的文档保密,所以废了好大劲重新找了一个。如果本文章帮助到你了,记得回来加个关注哦!博主前端菜鸟一个,目前只会vue,如果有实现不了的需求,可以在下面进行评论,我有时间了会尝试去实现。

    展开全文
  • 看上博客上一个作者的文章,想一次性下载一个word文件中,并且可以设置好目录,通过word的“导航窗格”快速定位单篇文章。一劳永逸,从此再也不用去博客上一篇一篇地翻阅了。整理一下步骤:先获取所有文章的标题...
  • 每个需要写毕业论文的同学都会发现,修改... 将光标定位word文档中将要插入参考文献的位置,按“插入/引用/脚注和尾注”。出现一菜单,选择“尾注”,“文档结尾”,编号格式为“1,2,3”。按“插入”按钮。 2.按...
  • 如何使用poi解析word生成html目录结构

    千次阅读 2020-09-26 16:47:28
    java使用POI转换word为Html的文章有很多,但是很少有涉及到目录解析的,包括一些付费的,开源的,甚至是office自带的另存为...功能都没有涉及生成目录的。 本篇将介绍目录生成的基本原理和代码实现,windows,linux...
  •  支持检索pdf包含的文字并替换,可做目录定位  不足:  1,html标签需要严格书写,如meta,img的结束符必须书写,标签需要配对  2,div中若中文太长超过一行生成pdf无法自动换行,导致丢失内容  2.1,工具是外国人...
  • 如何快速把word里的多个图片设置成一样大小如何快速把word里的多个图片设置成一样大小 如何快速把word里的多个图片设置成一样大小呢?这样有些时候似乎会让画面更有秩序感 1.按住Ctrl,选择所有图片: 2.单击鼠标右键,...
  • Word文件转HTML

    千次阅读 2020-08-31 16:05:32
    第一步:使用word文档打开文件,将文档另存为 "筛选过的网页(*.htm,*.html)"格式 “a文件夹” 下 此时的 “a文件夹” 下会多出一个文件和文件夹: 文件:包含html内容、js脚本、css样式,点击可通过浏览器直接...
  • 思路: 1、Word建书签,不会的自己百度; 2、EXCEL中复制; ....0 Object Library”,否则一些Word中的类无法使用的。 Sub test() Dim Sheet As Worksheet Set Sheet = ThisWorkbook.Shee...
  • Word板书设计怎么写

    千次阅读 2021-07-26 05:00:43
    2回答回答:在WPS中,那个大括号使用的是形状:在插入选项卡中选择形状命令,在基本形状中找到左大括号,其实就是一个自选图形,后面可以使用段落,也可以使用文本框输入内容。2回答回答:1.用自选图形单击菜单...
  • 本篇文章将继续介绍通过Java来操作Word书签的方法,即替换Word中已有书签,包括用新的文本、图片、表格等替换原有书签处的内容。 使用工具:Free Spire.Doc for Java Jar文件获取及导入: 方法1:通过官网下载...
  • 1.打开模板word文件 , 在对应地方打上书签; 2.在php.ini中加上 extension=php_com_dotnet.dll ; 目前只支持windows系统 3.代码如下  用数组来记录书签和表字段的对应关系 如果经常变动也可以用数据库来记录 ...
  • word中怎么去掉页面上方的横线去除页眉中的横线在文档中加入页眉时,往往会在页眉的下面出现一条横线,看上去很不舒服,如果不想在页眉留下任何信息也无法自动去除此横线,这时可以执行如下操作。一确认插入点位置于...
  • 前言用Word编辑长文档(比如学位论文、标书、项目总结报告)是件非常耗时耗力的活儿,主要体现在内容的创作(及复制粘贴和组合)上,但后期的排版也会让不少人困扰,无法流畅地排出自己想要的版式。经过多年的间歇性主动...
  • Word分节符的一些常见问题及解决办法分节符的关键作用是,将文档分为不同的部分,每一个部分都可以有不同的页眉页脚、不同的页面设置(不同的页面大小、纸张方向、页边距等)。分节符在长文档的排版中是肯定会用到,...
  • Word2016中的自动编号问题

    千次阅读 2018-11-29 11:35:56
    目录   前言: 第一步 设置标题 x格式: 1.格式样例 2.设置标题名称(默认标题 x) 3.后续设置 第二步 设置多级列表: 1.多级标题功能 2.多级标题1修改 2.多级标题2修改 3.多级标题3修改 4.多级标题4...
  • 推荐 Word、EXCEL必备工具箱

    千次阅读 2019-09-20 09:41:36
    8、处理工具→处理→新增功能“Word转Excel”,用于最大程度保留word原有格式,直接将Word文档转excel文档。 9、“查找功能”改进:能够不区分字符大小写进行EXCEL必备工具箱的功能查找,更加方便。 10、汇总工具...
  • 首先我们要了解文档最基本的信息和设置: 因为是国外编辑的类库,存在对中文支持的问题,使用前,我们需要进行一些修正:1、解决编码问题,PHPword 会对输入的文字进行utf8_encode编码转化,如果你使用GBK、GB2312...
  • 经典Office 2003专升本复习题(Word、Excel、PowerPoint) 一、Word 2003 1. 启动 Word 是指: 将 Word 从硬盘中调入主存执行 2. 菜单栏: 文件( F )、编辑( E )、视图( V )、插入( I )、格式( O )、...
  • Java后端生成Echarts并渲染Word转PDF

    千次阅读 2021-09-01 18:07:07
    文件中包含循环嵌套写入的内容 文件需要后端生成echarts图表数据 基于以上几点考虑 技术选取 方式一 itext7是一款用于生成PDF文档的一个java类库,通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件...
  • (6) POI定位word表格

    千次阅读 2012-04-14 15:58:39
    这里可以读word目录,word表格,word图片。当然不只是读出来,而是将word转成html。(我们的还要将word内容进行分页显示) 我在前两篇里已经写如何读word的表格,word的图片。 这里边涉及两个定位问题,一是...
  • 问:一般论文中分为几大部分,即封面、摘要、目录、正文、结论、文献、致谢、附录,那么如何定位到其中的某个部分位置呢?(因为目前只是完成了对正文部分的格式校验,所以下面会详述如何定位正文部分) 答:我是...
  • 2019-12-04:新增:动态刷新内置Excel数据 2020-04-07:新增:更新插入的文本框内容(感谢博友:输过败过但不曾怕过啊) 2020-04-10:新增:新增一个定位图表的方式(感谢博友:输过败过但不曾怕过啊) 2020-04-11...
  • Word课程笔记(秋叶系列课程)

    千次阅读 2019-06-09 19:04:00
    课时010【视频】01 别说你会Word,你可能用错了! # 贯通三个核心: 大量重复的工作懂得批量处理;反复要做的固定操作固化成“模板”“套路”;碰到异常情况知道准确高效的解决; # 三个问题: 文档目录怎么自动...
  • PhpWord的一些简单用法

    万次阅读 热门讨论 2018-11-14 20:49:33
      因为最近项目需要一个生成Word文档的功能,开始折腾起来,找到PhoWord这个类库,PhpWord是一个可以用PHP生成word的类库,用composer安装就可以用了。   搞了半天,终于生成了Word文档,现在来记录一下一些用法...
  • word技巧

    千次阅读 2018-03-01 21:40:22
    word 高效经典教程(整理版)目录一分钟驾驭word 高效经典教程(整理版)... 6A、基础知识... 61、度量单位... 62、WORD中文字字号与磅的对应关系... 63、字体文件格式... 7B、文本编辑... 71、快速移动文档... 72、...
  • 展开全部问:WORD里边怎样设置每页不同32313133353236313431303231363533e59b9ee7ad9431333264643764的页眉?如何使不同的章节显示的页眉不同?答:分节,每节可以设置不同的页眉。文件——页面设置——版式——页眉...
  • Word 2013中,文档并将光标定位到需要跳转的位置,在“插入”选项卡的“链接”组中单击“书签”,输入一个书签名称,单击“添加”。如下图在“abc.docx”文档中添加了一个名称为“书签1”的书签。2、在Excel 2013...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,469
精华内容 7,787
热门标签
关键字:

word目录无法定位到内容