精华内容
下载资源
问答
  • 文章目录背景步骤确定流程编写伪代码编写正式的代码最终的代码...所以弄好一份表就自动让机器代替人工黏贴到word文档,自动生成会相对舒服且快速,有什么问题直接修改excel即可。 ps:因为苦于unioffice库的问题,所


    关键字: word go语言 办公软件 自动化 excel office

    背景

    近来因为工作需要,经常性要重复地写报告,搞安全的就是苦逼啊。每次都需要人工查这查那,还要复制黏贴。 重复地复制黏贴会比较烦人。所以弄好一份表就自动让机器代替人工黏贴到word文档,自动生成会相对舒服且快速,有什么问题直接修改excel即可。

    ps:因为苦于unioffice库的问题,所以重新找了两个库来实现,发现生成后的文件小了很多,而且文档及库的使用极度方便。

    步骤

    我是用go语言进行开发的。
    go的版本:go version go1.14.4 windows/amd64

    github.com/360EntSecGroup-Skylar/excelize/v2
    github.com/nguyenthenguyen/docx

    命令进行安装:
    go get -v github.com/xxx

    ps:
    这两个库相对简单,excel的手册地址:https://xuri.me/excelize/zh-hans/workbook.html#SetDocProps
    docx就暂时没有手册,但是提供的函数不多。研究一下即可。
    注意两个函数:ReplaceRaw和Replace ,这两个的区别是ReplaceRaw直接动docx底层文件xml;Replace只是把你想要替换的内容给替换。

    确定流程

    其实最好先确定一下程序的处理流程和具体人工处理的步骤,因为偷懒我这里就不提供了,因为我也是画着画着就没有弄了。
    该项目的步骤:
    1、先填写好一个excel表,作为程序的数据输入。
    2、打开模板docx,程序处理,输出修改后的报告。
    3、输出写好的数据到一个汇总的表进行统计和闭环。

    编写伪代码

    在vscode上编写具体的流程伪代码

    编写正式的代码

    按照自己的思路,确定好变量、常量、具体的处理流程等等,按照伪代码进行一步一步的代码编写。

    最终的代码

    package main
    
    import (
    	"log"
    	"os"
    	"strconv"
    	"strings"
    	"time"
    
    	"github.com/360EntSecGroup-Skylar/excelize/v2"
    	"github.com/nguyenthenguyen/docx"
    )
    
    type biaozhi struct {
    	yeMeiTime  string // 页眉的时间编号
    	neiRouTime string // 内容的时间格式
    
    	sjmc   string   // 事件名称
    	sjjb   string   // 事件级别(漏洞、风险、应急)
    	ipaddr string   // 告警对象(应急)
    	gjlj   []string // 告警路径(应急、风险)
    	tms    string   // 告警数量(应急)
    	gjxx   string   // 告警描述(漏洞、风险)
    	czjy   []string // 处置建议(漏洞、风险)
    	sjly   string   // 事件类型(应急)
    	llmc   string   // 漏洞名称(漏洞)
    	yxbb   []string // 影响版本(漏洞)
    	ywxt   string   // 业务系统(应急、风险)
    	ywdw   string   // 业务单位(漏洞、应急、风险)
    	fxms   string   // 风险验证描述(风险)
    	kyfx   string   // 可疑分析(可疑)
    
    	czjyStr   string // 写入excel的处置建立
    	lujingStr string // 写入excel中的路径
    	lcw       string // 另存为文件的名称
    }
    
    var (
    	// Baogao 要打开的报告类型
    	Baogao string
    	// SaveFile 要保存的报告类型
    	SaveFile string
    	dataList biaozhi
    	// qiantou这个比较重要。
    	/*
    	我不知道什么原因,这两个参数我已经第二次修改了,可能是因为docx的问题,所以建议如果你要动程序之前,最好先自己测试一下docx的这两个参数对不对。直接解压docx看就可以了。
    	*/
    	qiantou string = `<w:p><w:pPr><w:rPr><w:rFonts w:hint="eastAsia" w:ascii="仿宋_GB2312" w:hAnsi="仿宋_GB2312" w:eastAsia="仿宋_GB2312" w:cs="仿宋_GB2312"/><w:sz w:val="24"/><w:szCs w:val="24"/><w:lang w:val="en-US" w:eastAsia="zh-CN"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:hint="eastAsia" w:ascii="仿宋_GB2312" w:hAnsi="仿宋_GB2312" w:eastAsia="仿宋_GB2312" w:cs="仿宋_GB2312"/><w:sz w:val="24"/><w:szCs w:val="24"/><w:lang w:val="en-US" w:eastAsia="zh-CN"/></w:rPr><w:t>`
    	jiewei  string = `</w:t></w:r><w:bookmarkStart w:id="0" w:name="_GoBack"/><w:bookmarkEnd w:id="0"/></w:p>`
    )
    
    // 1.判断输出的是什么通告
    func tonggao() {
    	cl, err := excelize.OpenFile("素材.xlsx")
    	if err != nil {
    		log.Println("打开素材文件错误!")
    		return
    	}
    	SaveFile, _ = cl.GetCellValue("需要填写的资料", "B1")
    	switch SaveFile {
    	case "可疑行为":
    		Baogao = "安全可疑行为通告模板.docx"
    	case "风险预警":
    		Baogao = "安全风险预警通告模板.docx"
    	case "应急预警":
    		Baogao = "安全事件应急通告模板.docx"
    	case "漏洞预警":
    		Baogao = "安全漏洞预警通告模板.docx"
    	default:
    		log.Println("请检查(素材.xlsx)文件(需要填写的资料)表中报告类型是否正确!")
    	}
    
    	// 获取相关的数据
    	dataList.事件名称, _ = cl.GetCellValue("需要填写的资料", "B2")   // 风险预警:获取事件名称
    	dataList.sjjb, _ = cl.GetCellValue("需要填写的资料", "B3")   // 所有预警:获取事件级别
    	dataList.ipaddr, _ = cl.GetCellValue("需要填写的资料", "B4") // 应急预警:告警对象
    	gjlj, _ := cl.GetCellValue("需要填写的资料", "B5")
    	dataList.gjlj = strings.Split(gjlj, "\n")           // 告警路径
    	dataList.tms, _ = cl.GetCellValue("需要填写的资料", "B6")  // 告警数量
    	dataList.gjxx, _ = cl.GetCellValue("需要填写的资料", "B7") // 告警描述
    	dataList.czjyStr, _ = cl.GetCellValue("需要填写的资料", "B8")
    	dataList.czjy = strings.Split(dataList.czjyStr, "\n") // 所有预警:获取处置建议
    	dataList.sjly, _ = cl.GetCellValue("需要填写的资料", "B9")   // 应急预警:事件类型
    	dataList.llmc, _ = cl.GetCellValue("需要填写的资料", "B10")  // 漏洞预警:漏洞名称
    	yxbb, _ := cl.GetCellValue("需要填写的资料", "B11")
    	dataList.yxbb = strings.Split(yxbb, "\n")            // 漏洞预警:影响版本
    	dataList.ywxt, _ = cl.GetCellValue("需要填写的资料", "B12") // 风险预警:业务系统名称
    	dataList.ywdw, _ = cl.GetCellValue("需要填写的资料", "B13") // 风险预警:业务单位名称
    	dataList.fxms, _ = cl.GetCellValue("需要填写的资料", "B14") // 风险预警:风险验证描述
    	dataList.kyfx, _ = cl.GetCellValue("需要填写的资料", "B15") // 可疑行为:可疑分析
    
    }
    
    // 2.处理并输出报告
    func baogao() {
    	// 打开一个已有格式的文档,这个是要打开的文档路径。
    	filesDir := "./template/" + Baogao
    	// 添加页眉
    	r, err := docx.ReadDocxFile(filesDir)
    	if err != nil {
    		log.Printf("打开word文档错误,错误信息: %s", err)
    	}
    	log.Println("打开报告完成")
    	defer r.Close()
    	docx1 := r.Editable()
    	docx1.ReplaceHeader("页眉日期", dataList.yeMeiTime)
    
    	switch SaveFile {
    	case "应急预警":
    		log.Println("当前正在处理应急预警类型的报告")
    		docx1.Replace("事件名称:", "事件名称:"+dataList.sjmc, -1)
    		docx1.Replace("事件类型:", "事件类型:"+dataList.sjly, -1)
    		docx1.Replace("事件级别:", "事件级别:"+dataList.sjjb, -1)
    		docx1.Replace("告警对象:", "告警对象:"+dataList.ipaddr, -1)
    		docx1.Replace("所属系统:", "所属系统:"+dataList.ywxt+"系统,隶属于"+dataList.ywdw, -1)
    		docx1.Replace("告警内容:", "告警内容:"+dataList.gjxx, -1)
    		docx1.Replace("应急描述", dataList.neiRouTime+",发现业务(IP:"+dataList.ipaddr+")产生"+dataList.tms+"条“"+dataList.sjmc+"”日志告警信息。经云主机资产确认,该主机为“"+dataList.ywxt+"系统,隶属于"+dataList.ywdw+"。", -1)
    		// 告警路径切片写入
    		var shuZu []string
    		for _, t := range dataList.gjlj {
    			t = strings.Replace(t, "<", "&lt;", -1)
    			t = strings.Replace(t, ">", "&gt;", -1)
    			shuZu = append(shuZu, t+jiewei+qiantou)
    		}
    		shuZu = append(shuZu, jiewei)
    		st1 := strings.Join(shuZu, "")
    		docx1.ReplaceRaw("告警路径", st1, -1)
    		// 处置建议切片写入
    		var shuZu2 []string
    		for _, t := range dataList.czjy {
    		// 加了转换验证解决特殊符号导致的错误问题。
    			t = strings.Replace(t, "<", "&lt;", -1)
    			t = strings.Replace(t, ">", "&gt;", -1)
    			shuZu2 = append(shuZu2, t+jiewei+qiantou)
    		}
    		shuZu2 = append(shuZu, jiewei)
    		st2 := strings.Join(shuZu2, "") //把切片装回string类型的字符串
    		docx1.ReplaceRaw("应急处置建议", st2, -1)
    	case "漏洞预警":
    		log.Println("当前正在处理漏洞预警类型的报告")
    		docx1.Replace("漏洞名称填写", dataList.llmc, -1)
    		docx1.Replace("风险等级填写", dataList.sjjb, -1)
    		docx1.Replace("风险描述填写", dataList.gjxx, -1)
    		// 影响版本切片写入
    		var shuZu []string
    		for _, t := range dataList.yxbb {
    			t = strings.Replace(t, "<", "&lt;", -1)
    			t = strings.Replace(t, ">", "&gt;", -1)
    			shuZu = append(shuZu, t+jiewei+qiantou)
    			//shuZu = append(shuZu, t)
    		}
    		shuZu = append(shuZu, jiewei)
    		st1 := strings.Join(shuZu, "")
    		// ReplaceRaw该函数是直接修改底层的xml文件。而Replace只是单纯的替换你想替换的内容,不修改格式。
    		docx1.ReplaceRaw("影响版本填写", st1, 1)
    
    		// 处置建议切片写入
    		var shuZu2 []string
    		for _, t := range dataList.czjy {
    			t = strings.Replace(t, "<", "&lt;", -1)
    			t = strings.Replace(t, ">", "&gt;", -1)
    			shuZu2 = append(shuZu2, t+jiewei+qiantou)
    		}
    		shuZu2 = append(shuZu, jiewei)
    		st2 := strings.Join(shuZu2, "")
    		docx1.ReplaceRaw("处置建议填写", st2, -1)
    	case "可疑行为":
    		log.Println("当前正在处理可疑行为类型的报告")
    		docx1.Replace("行为概述填写", dataList.neiRouTime+",资产:"+dataList.ipaddr+"产生"+dataList.tms+"条"+dataList.sjmc+"日志告警信息。经云主机资产确认,该主机为“"+dataList.ywxt+"”系统,隶属于“"+dataList.ywdw+"”。", -1)
    		docx1.Replace("疑点分析填写", dataList.kyfx, -1)
    		// 处置建议切片写入
    		var shuZu []string
    		for _, t := range dataList.czjy {
    			t = strings.Replace(t, "<", "&lt;", -1)
    			t = strings.Replace(t, ">", "&gt;", -1)
    			shuZu = append(shuZu, t+jiewei+qiantou)
    		}
    		shuZu = append(shuZu, jiewei)
    		st2 := strings.Join(shuZu, "")
    		docx1.ReplaceRaw("处置建议填写", st2, -1)
    	default:
    		log.Println("正在处理默认的表格内容")
    		docx1.Replace("事件名称填写", dataList.sjmc, -1)
    		docx1.Replace("风险等级填写", dataList.sjjb, -1)
    		docx1.Replace("风险描述填写", dataList.gjxx, -1)
    		docx1.Replace("业务所属", "经云主机资产确认,该主机为"+dataList.ywxt+"系统,隶属于"+dataList.ywdw, -1)
    		docx1.Replace("风险验证描述", dataList.fxms, -1)
    		// 风险验证路径切片写入
    		var shuZu []string
    		for _, t := range dataList.gjlj {
    			t = strings.Replace(t, "<", "&lt;", -1)
    			t = strings.Replace(t, ">", "&gt;", -1)
    			shuZu = append(shuZu, t+jiewei+qiantou)
    		}
    		shuZu = append(shuZu, jiewei)
    		st1 := strings.Join(shuZu, "")
    		docx1.ReplaceRaw("风险验证路径", st1, -1)
    		// 处置建议切片写入
    		var shuZu2 []string
    		for _, t := range dataList.czjy {
    			t = strings.Replace(t, "<", "&lt;", -1)
    			t = strings.Replace(t, ">", "&gt;", -1)
    			shuZu2 = append(shuZu2, t+jiewei+qiantou)
    		}
    		shuZu2 = append(shuZu, jiewei)
    		st2 := strings.Join(shuZu2, "")
    		docx1.ReplaceRaw("处置建议填写", st2, -1)
    	}
    
    	switch SaveFile {
    	case "可疑行为":
    		dataList.lcw = "【" + dataList.sjmc + "】" + "(" + dataList.ywdw + ")" + "安全可疑行为预警通告" + dataList.yeMeiTime + ".docx"
    	case "风险预警":
    		dataList.lcw = "【" + dataList.sjmc + "】" + "(" + dataList.ywdw + ")" + "安全风险预警通告" + dataList.yeMeiTime + ".docx"
    	case "应急预警":
    		dataList.lcw = "【" + dataList.sjmc + "】" + "(" + dataList.ywdw + ")" + "安全事件应急通告" + dataList.yeMeiTime + ".docx"
    	case "漏洞预警":
    		dataList.lcw = "【" + dataList.llmc + "】" + "(" + dataList.ywdw + ")" + "安全漏洞预警通告" + dataList.yeMeiTime + ".docx"
    	}
    
    	sp := "./report/" + dataList.lcw
    	err = docx1.WriteToFile(sp)
    	if err != nil {
    		os.Mkdir("./report", os.ModePerm)
    		log.Println("当前目录中没有report报告文件夹,现在创建文件夹成功!!!")
    		docx1.WriteToFile(sp)
    		log.Println("保存docx文件成功!!!")
    	}
    	log.Println("保存docx文件成功!!!")
    }
    
    func exc() {
    	f, err := excelize.OpenFile("预警通报汇总表.xlsx")
    	if err != nil {
    		log.Println(err.Error())
    	}
    
    	//告警函编号、业务单位、业务系统、告警状态、漏洞名称、告警类型、告警级别、告警对象、告警描述、应急处置方法、发生时间、结束时间、告警根治处置方法建议、安全处置联系人、支撑人员、修复方法描述、修复时间、修复验证描述、修复验证人、修复验证时间
    
    	// 非应急预警的格式
    	exStr := []string{dataList.yeMeiTime, dataList.ywdw, dataList.ywxt, "未修复", dataList.llmc, dataList.事件名称, dataList.sjjb, dataList.ipaddr, dataList.gjxx, "", dataList.neiRouTime, "", dataList.czjyStr, "", "xxx", "", "", "", dataList.ywdw, SaveFile}
    
    	// 检查A列一千行,判断是否有值,如果有值就不写。没有值就整行填写记录
    	for n1 := 1; n1 < 1000; n1++ {
    		s1 := strconv.Itoa(n1)
    		lie := "A" + s1
    		// 获取当前表,固定表格的值
    		cell, _ := f.GetCellValue("Sheet1", lie)
    		if cell == "" { // 判断是否为空
    			// 为空就提交单元格编号并跳出循环
    			f.SetSheetRow("Sheet1", lie, &exStr)
    			// celSave = lie
    			break
    		}
    	}
    	// 保存文件
    	f.Save()
    	log.Println("通告内容已经写入“预警通报汇总表.xlsx”表中!!!")
    }
    
    func main() {
    	// 获取符合我们格式的时间。
    	dataList.neiRouTime = time.Now().Format("2006年01月02日15时04分")
    	dataList.yeMeiTime = time.Now().Format("200601021504")
    
    	// 判断是什么报告类型,提取素材exels里面的内容
    	tonggao()
    
    	// 将获取到的数据写入word并保存文件
    	baogao()
    
    	// 将获取到的数据写入到汇总excel里面
    	exc()
    
    	// 等待时间查看日志
    	time.Sleep(time.Minute * 999)
    
    }
    
    
    

    以前的久问题

    如果使用了unioffice库会出现以下问题:
    1.页眉其实有排版和字体问题,可惜时间太短用了一天时间写了这个程序,因为是新手所以大神勿喷。
    2.word读取的时候存在问题,需要docx清除所有格式才能如你所愿地识别出来字段,举个有问题的例子:

    以下是word文档的两个段:
    	恶意告警
    	攻击事件经过分析还存在其他问题,1:端口继续对外开放;2:漏洞未被修复。
    

    如果这个文档有自己的格式如:仿宋字体;加粗;四号等等。。。
    那么识别就会出现问题,识别结果如下:

    恶意
    告警
    攻击事件
    经过
    分析还存在其它问题,
    1
    :端口继续对外开放;2:漏洞未被修复。
    

    那么识别出来的字段就会有问题,不能按照我们关键字的方式进行识别并替换。
    如我想识别出恶意告警,作为关键字,再替换为我想要的写的内容。但是这样的情况下就无法做了。

    3.excel读出数据之后,可以读取成切片,变成数组,通过unioffice这个库的AddBreak()函数进行换行,继续写入内容。示例代码如下:(目前已经不用该库了。直接动xml文件)

    for _, t := range dataList.chuzhijianyi { //重复执行
    	r.AddText(t) //写入内容
    	r.AddBreak() //换行
    }
    

    新的注意点

    针对以上的旧问题,已经不再是问题了,通过新的库已经解决。

    注意的点

    模版的问题

    这里要说一下,docx是基于xml格式的文本文档;使用压缩软件打开docx文件:
    在这里插入图片描述
    在这里插入图片描述
    这个就是docx的内容,看到下面还有页眉页尾的文件。打开后的内容,关注的是关键字的连续,如图:
    在这里插入图片描述
    硬件性能这个关键字,我们可以拿来作为替换;要注意的是,有可能这个关键字不一定是连续的。不连续的情况下,要重新删除内容,重新写,如图:
    在这里插入图片描述
    再用压缩软件检查,是否已经连续。不然后面会无法替换原文档内容。

    插入的内容

    因为文档是docx,所以要使用doc库里面的ReplaceRaw函数,该函数插入的内容是不经过转换的。

    • 所以需要添加xml的前缀内容:<w:p><w:pPr><w:rPr><w:rFonts w:hint=“eastAsia” w:ascii=“仿宋_GB2312” w:hAnsi=“仿宋_GB2312” w:eastAsia=“仿宋_GB2312” w:cs=“仿宋_GB2312”/><w:sz w:val=“24”/><w:szCs w:val=“24”/><w:lang w:val=“en-US” w:eastAsia=“zh-CN”/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:hint=“eastAsia” w:ascii=“仿宋_GB2312” w:hAnsi=“仿宋_GB2312” w:eastAsia=“仿宋_GB2312” w:cs=“仿宋_GB2312”/><w:sz w:val=“24”/><w:szCs w:val=“24”/><w:lang w:val=“en-US” w:eastAsia=“zh-CN”/></w:rPr><w:t>
    • 后缀内容是:</w:t></w:r><w:bookmarkStart w:id=“0” w:name="_GoBack"/><w:bookmarkEnd w:id=“0”/></w:p>
      中间内容就是你想替换的内容啦。详情可以看我的源码。挺简单的。

    特殊符号

    在实践中,发现xml并是无脑地插入文本,特别是遇到符号的时候,
    如果无脑代入,会在打开docx的时候报错,实际上,就是因为符号引起。
    举个例子:
    在这里插入图片描述
    原因如下:

    更正一下图片中的内容:“大于号这四个字符组成的 & g t ;” 小于号是这四个字符组成的"& l t ;"

    在这里插入图片描述
    以下这个图是正常能打开的docx截图:
    在这里插入图片描述
    正常的docx的xml如下:

    与什么空格并没有什么关系。

    在这里插入图片描述
    在这里插入图片描述
    PS:这个问题,目前已经找到折衷办法,使用strings.Replace()函数,把大小于号都替换就可以了。

    • 在 XML 中,有 5 个预定义的实体引用:
    转义后的字符 需要被转义的字符 备注
    &lt; < less than
    &gt; > greater than
    &amp; & ampersand
    &apos; apostrophe
    &quot; " quotation mark

    注释:在 XML 中,只有字符 “<” 和 “&” 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。

    总结

    1、检查好自己的模版文档。
    2、检查好输入输出的excel文档。
    3、调试好程序的输出。
    4、可以使用日志告警作为程序的接入、数据库表作为资产查询的输出。看个人喜欢。

    至于图片的插入,目前需要用到的是unioffice库,我还没有研究过。

    最终成果:
    在这里插入图片描述

    展开全文
  • 如同word中的自动编号功能一样 2,可以实现在freemarker中直接调用生成方法,得到正确的编号 目标:即在freemarker代码中通过一个方法调用即可得到当前章节的编号 1 1.1 1.2 2 2.1 2.1.1 2.1.2 2.2 2.2.1 3 3.1 3.1.1 ...

    功能需求:

    1,根据章节和当前标题数量,获得下一个编号,满足不同等级编号需求.如同word中的自动编号功能一样

    2,可以实现在freemarker中直接调用生成方法,得到正确的编号

    目标:即在freemarker代码中通过一个方法调用即可得到当前章节的编号

    1
    1.1
    1.2
    2
    2.1
    2.1.1
    2.1.2
    2.2
    2.2.1
    3
    3.1
    3.1.1
    3.1.1.1
    3.2


    思路:

    1,编号整体上是树形结构,因此要用树来管理整个列表

    2,有一个方法可以根据最大值,获取下一个(比如:最大值3,下一个4,最大值四,下一个五),这种增量方式是可以扩展和重新定义的.

    3,章节间的分隔符是可以指定的,在定义过程中应该指定.

    不多说,上代码:

    public abstract class Number {
    	public abstract String produceNext(String crrnt);
    
    	public String rootNumber() {
    		return "0";
    	}
    
    	public String firstNumber() {
    		return "1";
    	}
    }
    编号抽象类,定义编号的元素类(如1,2,3或一,二,三)

    实现类:

    public class SerialNumber extends Number {
    
    	@Override
    	public String produceNext(String crrnt) {
    
    		String next = "0";
    		if (crrnt != null) {
    			try {
    				int crrntNum = Integer.parseInt(crrnt);
    				next = String.valueOf(crrntNum + 1);
    			} catch (Exception e) {
    				System.err.println("非数字类型的字符串!");
    			}
    		}
    		return next;
    	}
    }

    节点类:

    public class Node implements Comparable<Node> {
    	private String id;
    	private String number;
    	private String text;
    	private String parentId;
    	private int level;
    
    	public Node(String id, String number, String parentId, int level) {
    		this.id = id;
    		this.number = number;
    		this.parentId = parentId;
    		this.level = level;
    	}
    
    	public Node() {
    
    	}
    
    	public String getId() {
    		return id;
    	}
    
    	public void setId(String id) {
    		this.id = id;
    	}
    
    	public String getNumber() {
    		return number;
    	}
    
    	public void setNumber(String number) {
    		this.number = number;
    	}
    
    	public String getText() {
    		return text;
    	}
    
    	public void setText(String text) {
    		this.text = text;
    	}
    
    	public String getParentId() {
    		return parentId;
    	}
    
    	public void setParentId(String parentId) {
    		this.parentId = parentId;
    	}
    
    	public int getLevel() {
    		return level;
    	}
    
    	public void setLevel(int level) {
    		this.level = level;
    	}
    
    	@Override
    	public int compareTo(Node o) {
    		if (this.level != o.level) {
    			return o.level - this.level;
    		} else {
    			if(this.number==null){
    				return -1;
    			}
    			return this.number.compareTo(o.number);
    		}
    	}
    
    	@Override
    	public String toString() {
    
    		return "id=" + this.id + " pId=" + this.parentId + " number=" + this.number + " text=" + this.text + "\r\n";
    	}
    }

    具体操作过程:

    public class NumberTree {
    	private String id;
    	private List<Node> nodeList;
    	private String separator;
    	private int idSeq;
    
    	private Number number;
    
    	public NumberTree() {
    		init();
    	}
    
    	public NumberTree(String separator, Number number) {
    		init();
    		this.separator = separator;
    		this.number = number;
    
    	}
    
    	public void init() {
    		idSeq = 0;
    		this.separator = ".";
    		if (this.nodeList == null) {
    			nodeList = new ArrayList<Node>();
    		}
    	}
    
    	public String getId() {
    		return id;
    	}
    
    	public void setSerialId(String id) {
    		this.id = id;
    	}
    
    	public String getSeparator() {
    		return separator;
    	}
    
    	public void setSeparator(String separator) {
    		this.separator = separator;
    	}
    
    	public List<Node> getNodeList() {
    		return nodeList;
    	}
    
    	public void setNodeList(List<Node> nodeList) {
    		this.nodeList = nodeList;
    	}
    	/**
    	 * 
    	  * <p>功能描述:根据父节点获取所有子节点。</p>	
    	  * @param pNode
    	  * @return
    	  * @since JDK1.6。
    	  * <p>创建日期:2015-4-23 下午8:20:47。</p>
    	  * <p>更新日期:[日期YYYY-MM-DD][变更描述]。</p>
    	 */
    	public List<Node> getChildNodes(Node pNode) {
    		String pId = pNode.getId();
    		return getChildNodes(pId);
    	}
    
    	/**
    	 * 
    	  * <p>功能描述:根据父节点获取所有子节点。</p>	
    	  * @param pId
    	  * @return
    	  * @since JDK1.6。
    	  * <p>创建日期:2015-4-23 下午8:21:02。</p>
    	  * <p>更新日期:[日期YYYY-MM-DD][变更描述]。</p>
    	 */
    	public List<Node> getChildNodes(String pId) {
    		List<Node> childNodes = new ArrayList<Node>();
    		for (Node n : nodeList) {
    			if (pId.equals(n.getParentId())) {
    				childNodes.add(n);
    			}
    		}
    
    		return childNodes;
    	}
    
    	/**
    	 * 
    	  * <p>功能描述:本级最大节点的下一个。</p>	
    	  * @param level
    	  * @return
    	  * @since JDK1.6。
    	  * <p>创建日期:2015-4-23 下午7:44:15。</p>
    	  * <p>更新日期:[日期YYYY-MM-DD][变更描述]。</p>
    	 */
    	public Node generateNextNodeForThisLevel(Node node) {
    		Node nextNode = null;
    		Node maxNode = getMaxNodeForThisLevel(node);
    		String nextNumber = number.firstNumber();
    		int level = node.getLevel();
    		if (maxNode != null && !"0".equals(maxNode.getId())) {//本级存在子节点,且非根节点
    			nextNumber = number.produceNext(maxNode.getNumber());
    			level = maxNode.getLevel();
    		}
    		nextNode = new Node(String.valueOf(++idSeq), nextNumber, node.getId(), level);
    
    		generateNodeText(nextNode, nextNumber);
    		return nextNode;
    	}
    
    	/**
    	 * 
    	  * <p>功能描述:获取本级值最大的节点。</p>	
    	  * @param level
    	  * @return
    	  * @since JDK1.6。
    	  * <p>创建日期:2015-4-23 下午7:43:26。</p>
    	  * <p>更新日期:[日期YYYY-MM-DD][变更描述]。</p>
    	 */
    	public Node getMaxNodeForThisLevel(Node pNode) {
    		List<Node> childList = getChildNodes(pNode);
    		Node root = getRoot(nodeList);
    		if (childList.size() <= 0) {
    			return null;
    		}
    		int level = pNode.getLevel();
    		Node maxNode = root;
    		for (Node node : childList) {
    			if (maxNode.getNumber().compareTo(node.getNumber()) < 0) {
    				maxNode = node;
    			}
    		}
    		return maxNode;
    	}
    
    	/**
    	  * 
    	  * <p>功能描述:根据内容获取节点。</p>	
    	  * @param text
    	  * @return
    	  * @since JDK1.6。
    	  * <p>创建日期:2015-4-23 下午8:34:44。</p>
    	  * <p>更新日期:[日期YYYY-MM-DD][变更描述]。</p>
    	  */
    	public Node getNodeByText(String text) {
    		Node node = null;
    		for (Node n : nodeList) {
    			if (text.equals(n.getText())) {
    				node = n;
    			}
    		}
    
    		return node;
    	}
    
    	/**
    	 * 
    	  * <p>功能描述:生成下一个子节点。</p>	
    	  * @param node 父节点或兄弟节点 生成根节点时设为null
    	  * @return
    	  * @since JDK1.6。
    	  * <p>创建日期:2015-4-23 下午10:22:58。</p>
    	 */
    	public Node generateNextChildNode(Node node) {
    		Node newNode = generateNextNodeForThisLevel(node);
    
    		return newNode;
    	}
    
    
    	/**
    	 * 
    	  * <p>功能描述:获取父节点。</p>	
    	  * @param node
    	  * @return
    	  * @since JDK1.6。
    	  * <p>创建日期:2015-4-23 下午8:44:50。</p>
    	 */
    	public Node getParentNode(Node node) {
    		for (Node n : nodeList) {
    			if (node.getParentId() == n.getId()) {
    				return n;
    			}
    		}
    		return node;
    	}
    
    	/**
    	  * 
    	  * <p>功能描述:生成节点路径。</p>	
    	  * @param node
    	  * @return
    	  * @since JDK1.6。
    	  * <p>创建日期:2015-4-23 下午7:42:45。</p>
    	  * <p>更新日期:[日期YYYY-MM-DD][变更描述]。</p>
    	  */
    	public void generateNodeText(Node node, String text) {
    
    		if (node == null || "0".equals(node.getId())) {
    			return;
    		}
    		
    		Node pNode = getParentNode(node);
    
    		if (!"0".equals(pNode.getId())) {
    			text = pNode.getText() + separator + text;
    		}
    
    		node.setText(text);
    	}
    
    	/**
    	 * 
    	  * <p>功能描述:遍历所有树节点。</p>	
    	  * @param node
    	  * @since JDK1.6。
    	  * <p>创建日期:2015-4-24 上午9:39:13。</p>
    	  * <p>更新日期:[日期YYYY-MM-DD][变更描述]。</p>
    	 */
    	public void traverseNodeList(Node node) {
    		if(node==null){
    			node = getRoot(nodeList);
    		}
    		List<Node> childNodes = getChildNodes(node);
    		System.out.println(node.getText());
    		if (childNodes.size() > 0) {
    			for (Node n : childNodes) {
    				traverseNodeList(n);
    			}
    		}
    	}
    	public static void main(String[] args) {
    		Number number = new SerialNumber();
    		NumberTree treeNode = new NumberTree(".", number);
    
    		addSomeNodes(treeNode);
    		treeNode.traverseNodeList(null);
    	}
    
    	/**
    	 * 
    	  * <p>功能描述:获取根节点。</p>	
    	  * @param nodeList
    	  * @return
    	  * author zhangxl 
    	  * @since JDK1.6。
    	  * <p>创建日期:2015-5-17 下午6:09:23。</p>
    	 */
    	public Node getRoot(List<Node> nodeList) {
    		Node root = null;
    		if (nodeList.size() <= 0 || (root = getNodeById(nodeList, "0")) == null) {
    			root = createRoot();
    			nodeList.add(root);
    		}
    		return root;
    	}
    
    	private Node getNodeById(List<Node> nodeList, String id) {
    		Node node = null;
    		if(id!=null){
    			for (Node n : nodeList) {
    				if (id.equals(n.getId())) {
    					node = n;
    					break;
    				}
    			}
    		}
    		return node;
    	}
    
    	private Node createRoot() {
    		Node root = new Node("0", number.rootNumber(), "-1", 0);
    		root.setText("0");
    		return root;
    	}
    	
    	/**
    	 * 
    	  * <p>功能描述:测试添加节点。</p>	
    	  * @return
    	  * @since JDK1.6。
    	  * <p>创建日期:2015-4-24 上午10:53:22。</p>
    	  * <p>更新日期:[日期YYYY-MM-DD][变更描述]。</p>
    	 */
    	private static Node addSomeNodes(NumberTree tree) {
    		Node root = tree.getRoot(tree.nodeList);
    		Node node1 = getNextNode(tree, root);//1
    		Node node2 = getNextNode(tree, root);//2
    		Node node3 = getNextNode(tree, root);//3
    		Node node11 = getNextNode(tree, node1);//1.1
    		Node node12 = getNextNode(tree, node1);//1.2
    		Node node21 = getNextNode(tree, node2);//2.1
    		Node node211 = getNextNode(tree, node21);//2.1.1
    		Node node212 = getNextNode(tree, node21);//2.1.2
    		Node node22 = getNextNode(tree, node2);//2.2
    		Node node221 = getNextNode(tree, node22);//2.2.1
    		Node node31 = getNextNode(tree, node3);
    		Node node32 = getNextNode(tree, node3);
    		Node node311 = getNextNode(tree, node31);
    		Node node3111 = getNextNode(tree, node311);
    		return root;
    	}
    	
    	public static Node getNextNode(NumberTree tree, Node pNode) {
    		Node node = tree.generateNextChildNode(pNode);
    		if (node != null) {
    			tree.nodeList.add(node);
    		}
    		return node;
    	}
    }

    getNextNode(NumberTree tree, Node pNode)
    该方法设计成静态方法,是为了在freemarker中调用方便.把NumberTree注册到freemarker中,就可以实现随意调用了.

    dataMap.put("numberTree", FtlUtil.getHelperClass("com.report.bctcms.number.NumberTree"));

    public class FtlUtil {
    	public static TemplateHashModel useStaticPackage(String packageName) {
    		TemplateHashModel fileStatics = null;
    		try {
    			BeansWrapper wrapper = BeansWrapper.getDefaultInstance();
    			TemplateHashModel staticModels = wrapper.getStaticModels();
    			fileStatics = (TemplateHashModel) staticModels.get(packageName);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return fileStatics;
    	}
    
    	public static TemplateHashModel getHelperClass(String clazz) {
    		TemplateHashModel useStaticPackage = FtlUtil.useStaticPackage(clazz);
    		return useStaticPackage;
    	}
    }

    freemarker代码:

    <#assign numberTree = root.numberTree />--注册的类
    <#assign numberTreeObj = root.numberTreeObj />--当前的操作对象
    <#assign rootNode = root.rootNode /><span style="font-family: Arial, Helvetica, sans-serif;">--从进入freemarker开始的其实节点</span>
    <#assign num1 = numberTree.getNextNode(numberTreeObj,rootNode)/>--生成的标题对象(Node)

    不足之处:

    1,暂时只支持生成子节点的编号,不支持兄弟节点编号

    2,生成一个编号对象需要的依赖比较多,稍显繁琐,但根据目前的需求只能如此




    展开全文
  • word贴心自动智能功能

    千次阅读 2012-11-24 16:05:34
    Word提供了一些贴心的自动智能功能,比如,当你在文档中键入“1、”,然后输入内容并按回车键后,Word将在下一段的段首自动出现“2、”,这就是Word提供的键入时自动套用编号列表功能。  当使用自动编号列表功能时...

    转自:http://bbs.ruoren.com/thread-641578-1-1.html

    Word提供了一些贴心的自动智能功能,比如,当你在文档中键入“1、”,然后输入内容并按回车键后,Word将在下一段的段首自动出现“2、”,这就是Word提供的键入时自动套用编号列表功能。
      当使用自动编号列表功能时,不仅仅是节省了你输入编号的时间,更为重要的是,自动编辑列表能够在你删除和插入某个编号时,自动对现有编号进行调整,以适应新的编号顺序,从而提高你的编辑效率。
    编辑文档时,有时你可能需要使用多级编号,以使文档结构严谨、层次清晰。此时,请如此操作:按下回车键出现当前级别的编辑后,在键入内容前,按下Tab键,则可将当前编号降为下一级编号。与之相反,按下“Shift+Tab”组合键,则可以将当前编号升为上一级编号。当想调整多级编号中某一编号的级别时,可以将插入点移动到该编号后的文本前,然后按Tab键或“Shift+Tab”组合键。 
    把文字替换成图片 

    首先把图片复制到 剪贴板中,然后打开替换对话框,在“查找内容”框中输入将被替换的文字,接着在“替换为”框中输入“^c”(注意:输入的一定要是半角字符,c要小写),单击替换 即可。说明:“^c”的意思就是指令WordXP以剪贴板中的内容替换“查找内容”框中的内容。按此原理,“^c”还可替换包括回车符在内的任何可以复制到剪贴板的可视内容,甚至Excel表格。


    三招去掉页眉那条横线

    1、在页眉中,在“格式”-“边框和底纹”中设置表格和边框为“无”,应用于“段落”

    2、同上,只是把边框的颜色设置为白色(其实并没有删的,只是看起来没有了,呵呵)

    3、在“样式”栏里把“页眉”换成“正文”就行了——强烈推荐!

    会多出--(两个横杠) 这是用户不愿看到的,又要多出一步作删除--

    解决方法:替换时在前引号前加上一个空格问题就解决了


    插入日期和时间的快捷键

    Alt+Shift+D:当前日期

    Alt+Shift+T:当前时间

    批量转换全角字符为半角字符

    首先全选。然后“格式”→“更改大小写”,在对话框中先选中“半角”,确定即可

    Word启动参数简介

    单击“开始→运行”命令,然后输入Word所在路径及参数确定即可运行,如“C:\PROGRAM FILES \MICROSOFT Office \Office 10\ WINWord.EXE /n”,这些常用的参数及功能如下:


    /n:启动Word后不创建新的文件。

    /a:禁止插件和通用模板自动启动。

    /m:禁止自动执行的宏。

    /w:启动一个新Word进程,独立与正在运行的Word进程。

    /c:启动Word,然后调用Netmeeting。

    /q:不显示启动画面。

    另外对于常需用到的参数,我们可以在Word的快捷图标上单击鼠标右键,然后在“目标”项的路径后加上该参数即可。

    快速打开最后编辑的文档

    如果你希望Word在启动时能自动打开你上次编辑的文档,可以用简单的宏命令来完成:

    (1)选择“工具”菜单中的“宏”菜单项,单击“录制新宏”命令打开“录制宏”对话框;

    (2)在“录制宏”对话框中,在“宏名”输入框中输入“autoexec”,点击“确定”;

    (3)从菜单中选择“文件”,点击最近打开文件列表中显示的第一个文件名;并“停止录制”。保存退出。下次再启动Word时,它会自动加载你工作的最后一个文档。

    格式刷的使用

    1、设定好文本1的格式。

    2、将光标放在文本1处。

    3、单击格式刷按钮。

    4、选定其它文字(文本2),则文本2的格式与文本1 一样。

    若在第3步中单击改为双击,则格式刷可无限次使用,直到再次单击格式刷(或按Esc键)为止。

    删除网上下载资料的换行符(象这种“↓”)

    在查找框内输入半角^l(是英文状态下的小写L不是数字1),在替换框内不输任何内容,单击全部替换,就把大量换行符删掉啦。


    选择性删除文件菜单下的最近使用的文件快捷方式。

    工具→选项→常规把“列出最近使用文件数改为0”可以全部删除,若要选择性删除,可以按ctrl+Alt+ -三个键,光标变为一个粗减号后,单击文件,再单击要删除的快捷方式就行了。

    建立一个矩形选区:

    一般的选区建立可用鼠标左键,或用shift键配合pgup、pgdn、home、end、箭头等功能键,当复制一个规则的矩形区域时,可先按住Alt键,然后用鼠标左键来选。我一般用此来删除段首多余的成块的空格。大家试一试*^_^*

    将字体快速改为上标或下标的方法:

    本人在一次无意间发现了这个方法,选定你要下标的字,然后在英文状态下按住Ctrl,再按一下BASKSPACE旁的+/=的键,就可以了。上标只要在按Ctrl的同时也按住Shift,大家可以试试。

    让Word表格快速一分为二

    将光标定位在分开的表格某个位置上,按下“Ctrl+Shift+Enter”组合键。这时你就会发现表格中间自动插入一个空行,这样就达到了将一个表格一分为二的目的。

    快速删除段前段后的任意多个空格

    选定这些段段落,单击居中按钮,然后再单击原来的那种对齐方式按钮(如果原来是居中对齐的,先单击其它对齐方式按钮,再单击居中按钮就行了),是不是这些空格全不见了?

    只要打开WORD新建一个空文档的时候,出现的不是空的文档,而是我以前打的一份文档

    首先:将资源管理器设置为显示所有文件和文件夹;

    然后:

    C:\Documentsand Settings\Administrator\Application Data\Microsoft\Templates文件夹下将所有Normal.doc文件删掉;


    然后:OK(XP系统) 

    快速输入平方的方法

    先输入2,然后选重后,按ctrl加shift加+就可以了.

    WORD中表格的选择性录入

    1.设置好表格,选定表格-视图-工具-窗体-插入下拉型窗体域

    2.输入数据,完成

    3.点击锁按钮,保护,输入完后再点击进行其它的输入.

    标点符号的全角/半的转换用:Ctrl+.

    数字字母的全角/半的转换用:Shift+空格

    轻松了解工具栏按钮的作用

    按下“shift+F1”键,鼠标指针旁多了一个“?”号,想知道哪个按钮

    的作用,就用鼠标单击哪个。

    要经常在文档中插入自己公司的信息

    公司名称

    公司住址

    联系电话

    联系人姓名

    QQ号码

    可以先选定这些内容,再单击工具→自动更正→在替换框中输入标记名称(如“公司信息”)→添加→确定,以后凡是在文档中要用到这个信息的地方键入“公司信息”(不要引号)这几个字后就自动替换成:

    公司名称

    公司住址

    联系电话

    联系人姓名

    QQ号码

    说明:有些输入法不支持这个功能,键入标记名称后要按一下空格才行。

    快速换页的方法

    双击某页的右下脚,光标即可定位在那里,然后按回车直到换页。ctrl+回车点插入按纽,分隔符,选中分页符,然后确认就OK了 !!!

    表格的简单调整宽度

    鼠标放在表格的右边框上带鼠标变成可以调整大小的时候

    双击

    根据表格内的内容调节表格大小

    代替金山词霸

    点工具——语言——翻译,在右边出现的搜索框中输入要查的单词,回车就可以翻译了。可以选择英语翻成中文或中文翻成英语。

    第一次使用可能要安装。

    [Alt]键实现标尺的精确定位

    如果你经常使用水平标尺来精确定位标签、页边框、首字缩进及页面对象的位置,那么你点击标尺设置页边框或标签时,您只可以将其设置为1字符或2字符,但不能设为1.5字符!要想设置更为精确的度量单位(例如百分之几字符),在按住[Alt]键的同时,点击并移动标尺或边框,此时标尺将用数字精确显示出当前的位置为百分之几字符位置。


    用“记事本”去除格式

    网页上COPY下来的东西往往都是有网格的,如果直接粘贴在WORD中会杂乱无章。粘贴到记事本当中,再粘贴到WORD中,就可以去除网格等格式,再全选选择清除格式,居中再取消居中即可取消所有格式。可以直接在WORD中进行:(菜单)编辑/选择性粘贴……/无格式文本/确定。这样省事多了。

    快速将文档转换成图片

    先把欲想转换的文档保存退出.如:保存在桌面

    然后新建一个文件.把想转换的文档(鼠标左建按住该文档不放)直接施放在页面上

    恢复office的默认设置

    比如不小心把word设置乱了(如删了菜单栏等等).

    查找normal.dot直接删除.

    下一次启动word会恢复默认值.

    让Word只粘贴网页中的文字而自动去除图形和版式

    方法一、选中需要的网页内容并按“Ctrl+C”键复制,打开Word,选择菜单“编辑”→“选择性粘贴”,在出现的对话框中选择“无格式文本”。

    方法二、选中需要的网页内容并按“Ctrl+C” 键复制,打开记事本等纯文本编辑工具,按“Ctrl+V”键将内容粘贴到这些文本编辑器中,然后再复制并粘贴到Word中。

    ctrl+alt+f可以输入脚注

    这个对于经常写论文的朋友应该有点帮助。

    将阿拉伯数字转换成中文数字或序号

    1、先输入阿拉伯数字(如1234),全选中,单击“插入/数字/数字类型(壹、贰……)/确定”,即变为大写数字(如壹仟贰佰叁拾肆),会计朋友非常适用。

    2、其他像一千二百三十四,甲、乙……,子、丑……,罗马数字等的转换,可参考上法。

    Word中的常用快捷键吧

    “字体”对话框 Ctrl+D

    选择框式工具栏中的“字体”框 Ctrl+Shift+F

    加粗 Ctrl+B

    倾斜 Ctrl+I

    下划线Ctrl+U

    “上标”效果 Ctrl+Shift+=

    “下标”效果 Ctrl+=

    “关闭”命令 Ctrl+W

    Word快捷键一览表 

    序号 快捷键CTRL+ 代表意义

    1…………Z…………撤消

    2…………A…………全选

    3…………X…………剪切

    4…………C…………复制

    5…………V…………粘贴

    6…………S…………保存

    7…………B…………加粗

    8………… Q…………左对齐

    9…………E…………据中

    10…………R…………右对齐

    11…………]…………放大

    22…………[…………缩小

    12…………N…………新建文档

    13…………I…………字体倾斜

    14…………W…………退出

    15…………P…………打印

    16…………U…………下划线

    17…………O…………打开

    18…………k…………插入超级连接

    19…………F…………查找

    20…………H…………替换

    21…………G…………定位

    23…Ctrl+Alt+L……带括号的编号

    24…Ctrl+Alt+.________…

    25…Alt+数字………区位码输入

    26…Ctrl+Alt+Del………关机

    27…Ctrl+Alt+Shift+?……¿

    28…Ctrl+Alt+Shift+!……¡

    29…Alt+Ctrl+E……………?

    30…Alt+Ctrl+R……………®

    31…Alt+Ctrl+T……………?

    32…Alt+Ctrl+Ctrl…………©

    33……Ctrl+D……………格式字体

    34……Ctrl+Shift+= ………上标

    35……Ctrl+=………………下标

    36……Ctrl+Shift+>……放大字体

    37……Ctrl+Shift+



    Word双面打印技巧

       我们平时用电脑的时候可能都少不了打印材料,Word是我们平常用的最多的Office软件之一。有时我们要用Word打印许多页的文档,出于格式要求或为了节省纸张,会进行双面打印。

      我们一般常用的操作方法是:选择“打印”对话框底部的“打印”下拉列表框中的“打印奇数页”或“打印偶数页”,来实现双面打印。我们设定为先打印奇数页。等奇数页打印结束后,将原先已打印好的纸反过来重新放到打印机上,选择该设置的“打印偶数页”,单击“确定”按钮。这样通过两次打印命令就可以实现双面打印。

      我们也可以利用另一种更灵活的双面打印方式:打开“打印”对话框,选中“人工双面打印”,确定后就会出现一个“请将出纸器中已打印好的一面的纸取出并将其放回到送纸器中,然后'确定’按键,继续打印”的对话框并开始打印奇数页,打完后将原先已打印好的纸反过来重新放到打印机上,然后按下该对话框的“确定”按键,Word就会自动再打印偶数页,这样只用一次打印命令就可以了。
      
    word经常出现的小问题的解决方法 

      自动缩进两个汉字

      我们中国人写东西都有段首空两个汉字?俗称低两格的习惯,如果每次都要在段首敲四个空格半角键,实在是太麻烦了,Word 2000为我们提供了更为方便的办法,选中所要设置缩进的段落,打开“格式”菜单中的“段落”设置,在“特殊格式”下拉框中选择“首行缩进”,在“度量值”中选择“2字符”。当然,最方便的办法还是在默认模板中设置段落“首行缩进”为“2字符”。

      删除行首行尾空格 

      由于网页排版中的“低两格”都是通过插入空格来实现的,所以我们从网上拷贝下来的文章段落在Word 2000中进行段落重排时,由于我们已经设置了自动“首行缩进”两个汉字,再加上这两个全角空格,就成了段首四个汉字空格,手工进行删除实在是太麻烦,这时我们可以选中要去掉行首行尾空格的段落,然后按下工具栏中的“居中”按钮,使段落的对齐方式为居中,这时行首行尾的空格就都被去掉了,最后再按“左对齐”按钮,使段落恢复原来的对齐方式。

      删除空行 

      对于文章中的空行,手工删除也是一件很麻烦的事情,其实想一下空行的特点,也就是多个“段落标记”连在一起,那么我们用Word 2000的替换功能就可实现删除文章中的空行。打开“编辑”菜单中的“替换”对话框,把光标定位在“查找内容”输入框中,按下“高级”按钮,选择“特殊字符”中的“段落标记”两次,在输入框中会显示为“^p^p”,在“替换为”输入框中用上面的方法插入一个“段落标记”,即“^p”,然后按下“全部替换”按键,可删除单行的空行,对于多行空行,可进行重复替换,直到删除全部的空行为止。

      WORD里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同? 

      分节,每节可以设置不同的页眉。文件–页面设置–版式–页眉和页脚–首页不同

      word中怎样让每一章用不同的页眉?怎么我现在只能用一个页眉,一改就全部改了?


      在插入分隔符里,选插入分节符,可以选连续的那个,然后下一页改页眉前,按一下”同前”钮,再做的改动就不影响前面的了。简言之,分节符使得它们独立了。这个工具栏上的”同前”按钮就显示在工具栏上,不过是图标的形式,把光标移到上面就显示出”同前”两个字来了

      如何合并两个WORD文档,不同的页眉需要先写两个文件,然后合并,如何做? 

      页眉设置中,选择奇偶页不同/与前不同等选项

      WORD编辑页眉设置,如何实现奇偶页不同?比如:单页浙江大学学位论文,这一个容易设;双页:(每章标题),这一个有什么技巧啊?

      插入节分隔符,与前节设置相同去掉,再设置奇偶页不同

      怎样使WORD文档只有第一页没有页眉,页脚? 

      页面设置-页眉和页脚,选首页不同,然后选中首页页眉中的小箭头,格式-边框和底纹,选择无,这个只要在”视图”–”页眉页脚”,其中的页面设置里,不要整个文档,就可以看到一个”同前”的标志,不选,前后的设置情况就不同了。




      如何从第三页起设置页眉?


      在第二页末插入分节符,在第三页的页眉格式中去掉同前节,如果第一、二页还有页眉,把它设置成正文就可以了

      ●在新建文档中,菜单-视图-页脚-插入页码-页码格式-起始页码为0,确定;

      ●菜单-文件-页面设置-版式-首页不同,确定;

      ●将光标放到第一页末,菜单-文件-页面设置-版式-首页不同-应用于插入点之后,确定。

      第2步与第三步差别在于第2步应用于整篇文档,第3步应用于插入点之后。这样,做两次首页不同以后,页码从第三页开始从1编号,完成。

      WORD页眉自动出现一根直线,请问怎么处理?

      格式从”页眉”改为”清除格式”,就在”格式”快捷工具栏最左边;选中页眉文字和箭头,格式-边框和底纹-设置选无

      页眉一般是———,上面写上题目或者其它,想做的是把这根线变为双线,WORD中修改页眉的那根线怎么改成双线的? 

      按以下步骤操作去做:

      ●选中页眉的文字,包括最后面的箭头

      ●格式-边框和底纹

      ●选线性为双线的

      ●在预览里,点击左下小方块,预览的图形会出现双线

      ●确定

      ▲上面和下面自己可以设置,点击在预览周围的四个小方块,页眉线就可以在不同的位

      置

      Word中的脚注如何删除?把正文相应的符号删除,内容可以删除,但最后那个格式还在,应该怎么办?


      步骤如下:

      1、切换到普通视图,菜单中”视图”–”脚注”,这时最下方出现了尾注的编辑栏。

      2、在尾注的下拉菜单中选择”尾注分隔符”,这时那条短横线出现了,选中它,删除。

      3、再在下拉菜单中选择”尾注延续分隔符”,这是那条长横线出现了,选中它,删除。

      4、切换回到页面视图

      尾注和脚注应该都是一样的

      Word里面有没有自动断词得功能?常常有得单词太长了,如果能设置一下自动断词就好了 

      在工具-语言-断字-自动断字,勾上,word还是很强大的

      如何将word文档里的繁体字改为简化字?

      工具-语言-中文简繁转换

      怎样微调WORD表格线?WORD表格上下竖线不能对齐,用鼠标拖动其中一条线,可是一拖就跑老远,想微调表格竖线让上下对齐,请问该怎么办?

      选定上下两个单元格,然后指定其宽度就可以对齐了,再怎么拉都行

      press”Alt”,打开绘图,其中有个调整坐标线,单击,将其中水平间距与垂直间距都调到最小值即可。

      打开绘图,然后在左下脚的绘图网格里设置,把水平和垂直间距设置得最小。

      亦可以如下操作:

      ●按住ctl键还是shift,你haveatry

      ●doubleclicktheline,tryit

      ●打开绘图,设置一下网格(在左下角)。使水平和垂直都为最小,试一把!?

      ●press”Alt”

      怎么把word文档里已经有的分页符去掉? 

      先在工具–>选项–>视图–>格式标记,选中全部,然后就能够看到分页符,delete就ok了。

      Word中下标的大小可以改的吗? 

      格式-字体

      Word里怎么自动生成目录啊? 

      用”格式>>样式和格式”编辑文章中的小标题,然后插入->索引和目录

      Word的文档结构图能否整个复制?论文要写目录了,不想再照着文档结构图输入一遍,有办法复制粘贴过来吗? 

      可以自动生成的,插入索引目录。

      做目录的时候有什么办法时右边的页码对齐?比如:

      1.1标题………………………….1

      1.2标题………………………….2

      画表格,然后把页码都放到一个格子里靠右或居中,然后让表格的线条消隐就可以了,打印出来就很整齐。

      怎样在word中将所有大写字母转为小写?比如一句全大写的转为全小写的

      格式->更改大小写->小写

      在存盘的时候,出现了问题,症状如下:磁盘已满或打开文件过多,不能保存,另开新窗口重存也不管用。如何解决?


      把word文档全选,然后复制,然后关掉word,电脑提示你粘贴板上有东西,要不要用于别的程序,选是,然后,再重新打开word,然后粘贴,然后,保存。

      用word写东西时字距老是变动,有时候自动隔得很开,有时候进入下一行的时侯,上一行的字距又自动变大了,这是为什么?怎么纠正啊?


      是因为自动对齐的功能,格式–>段落–>对齐方式可以选。还有允许断字的功能如果check上,就不会出现你说的情况了。

      在使用WORD的样式之后,如标题1、标题2之类的,在这些样式前面总会出现一个黑黑的方块,虽然打印的时候看不到,但看着总是不舒服,有没有办法让它不要显示呢?


      “视图”-->”显示段落标志”,把前面的勾去掉。其实这个很有用,可以便于知道哪个是标题段落



      文章第一页下面要写作者联系方式等。通常格式是一条短划线,下面是联系方式,基金支持等。这样的格式怎么做出来?就是注明页脚吗?


      插入–脚注和尾注

      文字双栏,而有一张图片特别大,想通栏显示,应该怎么操作?


      可以选择的内容,按双栏排。选择其他内容,按单栏排。

      Word里面如何不显示回车换行符? 

      把视图->显示段落标记的勾去掉或工具->选项->视图->段落标记

      有没有方法把WORD里的软回车一下子替换掉?识别出来的文字全带着软回车,能把他们一次全删掉吗??


      查找+替换,按CTRL+H;软回车好象是^l,在特殊字符里有

      在WORD里的框框里怎么打勾? 

      画个文本框,文本框里写一个钩,然后拖过去;或者先在WORD里插入符号”√”,然后选中”√”,到-》格式-》中文版式-》带圈字符-》选”□”

      还是不行,这样拷过去的框框字体是windings的,而原来的是宋体的,两者有很大的区别。

      根据模板新建专业型传真,里面有框,双击后打勾,copy就ok

      Word中怎么在一个英文字母上打对号? 

      透明方式插入图片对象,内容是一个√

      WORD里怎么显示修订文档的状态?文档修订后,改后标记很多,但是在菜单里没有”显示修订最终状态”等,怎么调出来?


      工具->自定义->命令->类别(工具)->命令(修订)->把”修订”等拖到工具栏上

      怎样把许多分开的word文档合并成一个文档。我的论文是按照章节分开写的,但现在图书馆要提交电子版的学位论文,是一个文档的,我找了很多选项但好象不能合并,选择插入文件功能,可以加入内容,但文档中的页眉却插不进去,有谁有高见?


      acrobat6可以直接把多个文档打印成一个pdf文档。可以提交pdf格式的论文,先一个一个word文档转换为pdf格式的,然后在pdf文档菜单的文件菜单中,选上作为pdf格式打开,追加上就可。

      Word里面要写方程式怎么办啊? 

      插入-对象-公式编辑器equation,如果没有公式编辑器Equation,要自己从光盘中安装,或者安装Mathtype公式编辑器

      按右键把它拖出来--插入--命令--自定义--工具

      应该是倒过来

      想在WORD里面表示矩阵,怎样才能画出那个很大的矩阵括号? 

      装公式编辑器mathtype好了~:)

      Word的公式编辑器怎么安装?

      工具-自定义-插入-公式编辑器,把它拖到工具条上即可;或者安装OFFICE后,再次安装,选增加功能吧,会有提示的

      Word2000下调用公式编辑器的快捷键? 

      点击菜单[工具]->[自定义],点击对话框下方[键盘],在[类别]里选择[插入],在命令里选择[InsertEquation],指定你的快捷方式

      WORD中出现公式的行往往要比只有文字的行来得宽,如何把这些行改的跟只有文字的行一样宽?


      段落行距设为固定值即可。这样会有一个问题,比如设置为18磅,有些公式符号(特别是有下标的)不能全部显示打印稿可以显示。怎么解决这个问题?这个如何解决还需要考虑。

      我的文档就是公式多,应该怎么办?


      公式多的时候,最好的消除这个问题的办法就是每打几个公式就要存盘,如果连续打太多,就会出现这个问题。出现问题的时候:

      ●选中所有内容,ctrl+C

      ●把WORD所有文档关闭,

      ●最关键:出现一条信息,务必选择”是”

      ●重新打开WORD编辑器,

      ●ctrl+V,粘贴

      ●ctrl+S

      特殊符号的输入方法 

      怎样在EXCEL里面快速输入立方米、平方米?也很简单哦

      ALT+178-(平方米)输入平方米 ALT+179-(立方米)输入立方米

      Alt+137-------‰(千分号) Alt+177-------±(正负、误差)

      在word里面

      你在M后面输入一个3,然后选中它,"shift"+"Ctrl"+"+",OK?

      如果你经常使用上、下标,就干脆将“上标”与“下标”做到工具栏上,想用的时候点一下就成:

      右键点击工具栏上任意按钮,选“自定义”-选“命令”标签-在左边的“类别”中选“格式”-将右边“命令”中的“上标”与“下标”用鼠标拖到工具栏你喜欢的位置。

      在WORD文件中,我在这里打个比喻,如果想输入2的三次方的话: 

      1.输入23 

      2.然后把3反白

      3.在菜单中拉开"格式",然后选择"字体" 

      4.在打开的"字体"的窗口里,在效果一栏中选择"上标"这个复选框

      5.按"确定"即可完成

      把WORD 里的换行符(向下的箭头)换成回车符(常用回车符) 

      使用WORD里的高级替换功能。

      编辑-替换-高级-特殊字符


      “人工换行符”替换为“段落标记”


      或直接输入由“^l”替换为“^p” 

      按下“替换所有”即可

    展开全文
  • Sphinx是一组可以用来从...使用它内建的功能,生成一个真正精细的浏览系统,以及一个简单但足够用的客户端javascript搜索引擎。 使用方法: 1.easy_install Sphinx 2.sphinx-quickstart #生成目录结构,一路y

    Sphinx是一组可以用来从文本树生成一个HTML结构的脚本和docutils扩展。这个工具可以用来创建python文档,现在很多项目都使用它来制作文档。使用它内建的功能,生成一个真正精细的浏览系统,以及一个简单但足够用的客户端javascript搜索引擎。

    使用方法:

    1.easy_install Sphinx

    2.sphinx-quickstart   #生成目录结构,一路yes,回车

    生成的source目录下会有一个index.rst文件,使用reStructured格式编辑它就可以了

    3.运行make html #将会生成html文件,在build目录下

    4.运行build/html目录下的index.html文件即可

    reStructuredText 简明教程
    060724 17:58

     

    作者:
    Laurence
    邮箱:
    2999am@gmail.com
    ID:
    Kardinal @ Ubuntu.org.cn论坛
    版权:
    This document has been placed in the public domain
    参考:
    《结构化文本入门(Karron Qiu)》 《Quick reStructuredText》 《VimreStructuredText》 《reStructuredText Interpreted Text Roles》

    • WYTIWYG & WYSIWYG
      • 所见即所得
      • 所想即所得
    • reStructuredText
    • 基本元素
      • 字串元素
      • 行元素
      • 块元素
    • 特殊元素
      • 页面元素
      • 行块元素
      • 超级块元素
      • 物件元素
      • 自定义元素
    • 对象
      • 标题
      • 行内
      • 脱字符
      • 链接
      • 物件别名
      • 列表
      • 表格
      • 脚注
      • 提示符引用
      • 预定义
    • 项目管理
    • 搭建reStructuredText环境
      • Linux
      • Windows
    • reStructuredText命令
    • 定制
    • 代码风格
      • 缩进
      • 空行
      • 下划线
      • 标题
      • 标题链接
      • 表格
      • 别名
      • 链接
      • 列表
    • 编辑器设定
      • Vim
      • Emacs
    • FAQ
      • 空行
      • 消除空格
      • 缩进和空格
    WYTIWYG & WYSIWYG
    所见即所得
    WYSIWYG ( What You See Is What You Get )
    这个概念非常流行。就是说制作过程中所见到的,和最终所得到的结果一致。
    比如我用DW编辑一个网页文件,在编辑的过程中,我可以设定内容的格式、排版、色彩等属性,而最终得到的网页,完全符合了我的愿望。
    我们都知道,网页文件使用的是 Html 标记语言。比如加粗某处文字,我们要使用标签 <b> ,然后是我们要加粗的文字,比如 粗体 最后再使用标签 </b> 来结束它,不然的话, 粗体 后面的文字也要被加粗了…… 因为 Html 解析器 (一般来说,就是浏览器)没法子判断到底在哪儿结束“加粗”这一行为。源文件大致是这样的:
    <b>粗体</b>
    一个完整的Html文件就是由许许多多这样的标签构成的。标签和标签之间可以嵌套。比如:
    <html>
    <head>头部</head>
    <body>
    <p>    正文                                               </p>
    <p>    这里是段落2                                          </p>
    <p>    这里是<b>粗体</b>,这里是<font color=red>红色字体</font></p>
    </body>
    </html>
    当然了,大多数时候,Html的源文件比较复杂,远远没有这么简单。可不要被它可怕的外表吓坏了,一个Html文件,无论多么复杂,它总是具有这种结构,只要您熟悉了足够多的标签,Html对于您来说,完全是纸老虎:)
    必须承认的是,如果没有所见即所得的工具,比如 DW ,直接使用Html语言编写网页文件,那应该不会是一种享受-_-#
    可能有许多高手会讲: 我就是喜欢直接编辑Html代码,那绝对是一种享受!
    是啊,可能那是一种享受,但是你享受的是编写代码,而不是设计页面。 Html并不是编程,代码不是决定因素,而外观设计才是重要的。所见即所得把开发者从代码中解救出来,使它们把心思都用在设计上,这才是它的伟大之处!
    同样的,Word之类的工具,也是一种所见即所得的工具。不同的是,doc 文件的复杂程度要远远高于 Html,您不太可能直接编辑它。
    所想即所得
    WYTIWYG ( What You Think Is What You Get )
    我们已经知道了,所见即所得偏重的是外观设计,而不是代码。看起来不错,不过这种模式也有一些缺点。
    比如我想强调某事,我可能就会有点犹豫……我是应该用粗体呢?还是应该用红色的字体?还有什么其它更好的方法么?
    假如现在我使用的是白色的背景,我使用红色的字体来表示强调。由于各种可能的原因,我需要把这些内容转移到另外一个地方,不巧的是,那个页面的背景使用的颜色和红色比较接近,比如说粉红色吧,如此一来,我的红色的文字反而没有正文的黑色文字醒目,本来是表示强调的,反而成了忽视……
    如果手动修改这些地方,可能会非常的麻烦,因为我可能用红色表示强调,用粗体表示感叹…… 而这些内容可能会出现在许多不同的场合,这可怎么办啊?
    这个问题很容易解决,答案就是 所想即所得 !例如:
    这里是<强调>强调</强调>,这里是<感叹>感叹</感叹>
    ……
    再使用一个样式定义,例如:
    强调 = 红色字体
    感叹 = 粗体
    ……
    然后使用转换程序,根据预先定义的样式,自动将 <强调> 转换为 <b> ,将 <感叹> 转换为 <font color=red> 就可以了。
    如果我们想将强调改用绿色,只要将样式定义改一下:
    强调 = 绿色字体
    也可以方便的转换为其它文件,比如 pdf 或者其它格式──只要有相应的转换程序就可以了。
    所见即所得工具不需要编写代码,将开发者从代码只解救出来,使其专注于设计;而所想即所得工具不需要设计外观,把设计者从外观中解救出来,使其专注行思考!
    事实上,这种使用标签的模式比较接近 DocBook ,当然了,标签不会是中文的。从国际主义精神的角度,我们要照顾到外国友人──据说外国友人的中文普遍不太好:)
    从通用性的角度来考虑,标签基本上使用英文;从减少输入的角度考虑,标签应该尽量简短 ──很多标签使用缩写。
    不过标签这种方式本身就很麻烦,特别是使用尖括号的标签。能不能再简单一些呢?
    reStructuredText
    reStructuredText,重构建文本,是一种优秀的写作工具,对于元素的定义已经不只是简化,而是进行了充分的优化。
    上面我们提到了元素,我们把它理解为一个对象的基本组成部分。例如 <b>粗体</b> 、 <强调>强调</强调> 都是元素,只是组成的方式不同而已,一种是所见即所得,另一种是所想即所得。
    <bold> 到 <b> 是一种简化,不过还是很麻烦。使用一些不常用而且又容易输入的符号,例如 ** 就是优化了
    在 reStructuredText 中,正是使用 ** 来表示强调!

     

    原始内容
    显示结果
    *强调*
    强调
    **特别强调**
    特别强调
    ``*原文引用*``
    *原文引用*
    /*原文*
    *原文*

    基本元素
    这一部分内容十分重要,理解透彻后便能够无往而不利。
    不然的话,在实际使用的过程中,您可能会觉得 reStructuredText 比较莫名其妙,有点怪怪的……
    字串元素
    连续的字符串构成的元素,为字串元素。 看下面的例子
    **强调** 就是一个字串元素。普通文本也是一个字串元素。
        第三个字串元素
    **强调** 是第一个字串元素;它后面的文本,是第二个字串元素。
    如果您够细心,您会发现,字串元素之间使用 空格 分隔。在字串元素的级别, 缩进 和 换行符 也能够分隔字串元素。
    严格来说,字串元素 空格 和 . , ? ! 等英文标点结束
    行元素
    下划线(有时包括上划线)和文本构成的元素,例如标题、表格
    标题
    ====
    表格:
    ===== ===== ======
       Inputs     Output
    ------------ ------
    A      B    A or B
    ===== ===== ======
    False False False
    True   False True
    False True   True
    True   True   True
    ===== ===== ======
    行元素中,下划线使用符号构成,例如
    Chapter 1 Title
    ===============
    Section 1.1 Title
    -----------------
    Subsection 1.1.1 Title
    ~~~~~~~~~~~~~~~~~~~~~~
    构成下划线的符号长度,应不小于文本长度。(一个汉字占两个字符)
    块元素
    具有相同缩进的元素为块元素,例如段落、表格
    ┊   第一行
    ┊   第二行
    ┊   第三行
    ┊   第二段
    块元素使用一个 空行 结束,也就是一个 垂直分隔符 。上面的例子中包含了两个块元素。
    连续出现多个空行时,作为一个空行处理。
    可以使用 Line Blocks 增加空行,使单独一行中只有一个 | 符号即可
    (前后都要有空行,因为它也是一个 块元素)
    见 行块元素
    技巧: 只要没有空行,不管换多少次行,都会处理为一行。建议您将每行的内容控制在50个汉字或者100个字母之内,尽量在标点符号处手动换行,以增加源文件的可读性。
    块元素也允许逐行增加缩进,例如
    ┊   第一行
    ┊   第二行
    ┊     第三行
    ┊                        第四行
    相同缩进的行处理为一行;不同缩进,无论缩进多少,都处理为一个缩进。上面文本实际显示为
    ┆    第一行第二行
    ┆        第三行
    ┆            第四行
    段落的缩进由其首行缩进决定
    事实上,这种形式属于 定义列表
    注意: 字串元素 可以作为 行元素 的子集,它们都可以作为 块元素 的子集。
    特殊元素
    这部分内容稍微复杂,建议您动起手来,摸着石头过河。
    搭建reStructuredText环境 和 reStructuredText命令部分内容,您可以先参考一下:)
    当然了,前面部分的内容,尽管看起来比较简单,不过您还是可以实验一下,多少会有一些帮助的……
    页面元素
    类似行元素,但是不包含缩进,例如标题、分隔线
    ==============
    文档标题
    ==============
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (分隔线)
    章节标题
    ===========
    二级章节标题
    -----------
    二级章节标题
    -----------
    章节标题
    ===========
    行块元素
    在某些情况下,一个段落中需要用逐行向外缩进,比如中文排版;
    段落首行
    第二行向外缩进
    其它行和第二行相同
    或者手动换行而不分段,甚至是更加复杂的装饰性文字……
    <>
    < >
    < <> >
    < >
    <>
    而段落中只能逐行向内缩进;相同的缩进会自动合并为一行,不能手动换行
    这些问题可以使用 行块元素 来解决。
    在每一行起始处添加引导符 | 和 缩进
    |          段落首行
    |       第二行向外缩进
    |       其它行和第二行相同
    相邻的行块元素,它们的引导符缩进应相同。
    行块引导符后的一个空格为分隔符,是必须的!处理时忽略
    超级块元素
    类似块元素,但是可以包含空行,并且内部可以随意缩进。例如注释、块引用
    包含有超级块引导符的行为引导行。超级块起始时相对引导行向内缩进;结束时使用一个空行,并且向外缩进等于或者超过引导行
    外部块
    引导行 <引导符>
          向内缩进
        超级块内部可以自由缩进
        可以使用空行
    新的开始.这一行前需要空行,起码与引导行缩进相同,或者更外
    注释
    注释是以 .. 起始的超级块元素,注释中的内容只在源文件中显示,并不在结果中显示
    .. 注释
    第二行
    第三行
    第二段
    第六行
    新的开始
    引导符 .. 前不能有其它字符,之后要有一个空格与注释内容分隔开( .. 同时是一个字串元素,前后都要有分隔符)
    块引用
    块引用是以 :: 起始的超级块元素,块引用的内容不作任何处理,以原文显示
    块引用 ::
    第一行
    第二行
    第四行
    新的开始
    引导符 :: 后必须有一个空行
    物件元素
    用来定义一个物件,物件元素由行内字串元素或注释中的块元素构成
    以 _ 结尾的字串元素,例如 链接_ [脚注]
    以 | 包裹的字串元素,例如 |别名|
    它们都需要在注释中进行解释:
    这里是一个 链接_ 。 [脚注]_
    .. _链接: http://xxx
    .. [脚注] xxxxxx
    .. note:: 注意
    一些具有特殊功能的物件,比如索引 contents:: ,被直接写到注释中去
    .. image:: 图片
    .. contents:: 索引
    参见 预定义
    自定义元素
    例如文档信息,实际效果见页面顶部
    :作者: Laurence
    :邮箱: 2999am@gmail.com
    :ID: Kardinal
    :版权: This document has been placed in the public domain
    :参考: 《Quick |rst| 》《结构化文本入门(Karron Qiu)》
    .. 技巧:: 自定义
    使用以下格式
    :<名称>:`字符串`
    .. <名称>:: 字符串
    在Html输出中添加
    <span class="<名称>">字符串</span>
    reStructuredText系统内建了许多预定义对象,来完成特定功能。见 预定义
    对象
    标题
    reStructuredText会根据下划线读取文档的标题,并且可以自动组织索引
    =====================
    文档标题
    =====================
    --------
    子标题
    --------
    章节标题
    ========
    ...
    具有同样带修饰线类型的标题,属于树状索引的同一层级
    带有上划线的标题,和不带上划线的标题是不同类型。上面例子中,文档标题和章节标题就不属于同一层级
    自上而下,越先出现的标题类型,层级越高
    为了简单起见,我们只写标题的修饰线
    ===
    ---
    ---
    ^^^
    ^^^
    ^^^
    ---
    ---
    ^^^
    我们可以看到,自上而下,最先出现的标题是 === ,所以它处于最高层级;然后是 --- ,所以它处于第二层;最后是 ^^^
    如果画成树形图,就是这样的
    ===
    ├ ---
    ├ ---
    │   ├ ^^^
    │   ├ ^^^
    │   └ ^^^
    ├ ---
    ├ ---
    │   └ ^^^
    行内
    多表示语气,如 **强调**

     

    源文本
    显示结果
    说明
    *强调*
    强调
    通常显示为斜体
    **特别强调**
    特别强调
    通常显示为粗体
    `字符串`
    字符串
    字符串内包含空格和标点符号时,处理为单个字串
    ``行内引用``
    行内引用
    显示为等宽字体,保留空格,不断行
    简单链接_
    简单链接
    简单的链接名称 <链接名称>_
    `词组 链接`_
    词组链接
    带空格、标点的链接名称
    无名链接__
    ....Ubuntu.......
    链接目标中不使用名称。适合大段文字的链接
    _`链接目标`
    链接目标
    链接的实际指向 _<链接名称>:
    |物件别名|
    用来给物件指定一个别名。文本、图片、链接及其它
    脚注名称 [1]_
    [1]
    见脚注
    引文名称 [引文]_
    [引文]
    见引文
    http://...
    http://...
    独立链接

    .. _简单链接:
    .. _`词组 链接`:
    __ http://forum.ubuntu.org.cn/    无名链接
    .. |物件别名| image:: http://forum.ubuntu.org.cn
       /templates/subSilver/images
       /folder_big.gif

     

    [1]
    脚注1

    .. [1] 脚注1

     

    [引文]
    内容

    .. [引文] 内容
    脱字符
    reStructuredText使用 / 作为脱字符,脱字符引导的字串元素不具有特殊涵义,以本来面目显示

     

    **强调**
    强调
    /**强调**
    **强调**

    输入 / 字符,可以使用 //
    Tip
    使用 脱字符+空格 (/_)作为分隔符,可以消除字串元素之间的空格
    链接
    链接主要包括以下几种
    独立链接 , reStructuredText 会自动将网址转换为链接。
    例如 http://www.ubuntu.org.cn/
    http://www.ubuntu.org.cn/
    命名链接 ,为链接命名,有助记忆和减少空间占用。
    在正文中使用 <链接名>_ ,注释中使用 _<链接名>: [链接目标]
    例如 Ubuntu
    Ubuntu_
    .. _Ubuntu: http://www.ubuntu.org.cn/
    如果链接名中出现空格和标点符号,可以使用 ` 将链接名包裹起来
    `Ubuntu cn`_
    .. _`Ubuntu cn`: http://www.ubuntu.org.cn/
    无名链接 ,不使用链接名的链接
    主要用于将大段文字转换为链接。如果将这部分文字作为链接名,链接名也将被写进注释中……
    `主要用于将大段文字转换为链接。如果将这部分文字作为链接名,
    链接名也将被写进注释中……`__
    __ http://www.ubuntu.org.cn/
    无名链接经常与命名链接一起使用
    `这里是一大段文字………………`__
    __ 一个命名链接_
    可以在任意位置定义这个命名链接
    .. _一个命名链接:
    锚点 ,链接的目标地址留空,可以在当前位置标记锚点。
    跳转到 锚点_
    .. _锚点:
    <页面位置>
    点击锚点名称跳转到锚点标记处。
    标题链接 ,跳转到文章内部的标题
    reStructuredText定义标题的同时,还定义了一个标题链接,在正文中使用 标题名称_ 可以跳转相应标题
    标题名称
    ========
    跳转到 标题名称_
    嵌入式链接 ,链接目标嵌入到链接中。(reStructuredText 中没有通过,不建议使用)
    `Ubuntu <http://www.ubuntu.org.cn>`_
    物件别名
    为一个物件元素定义一个别名
    |H2O|
    .. |H2O| replace:: H/ :sub:`2`/ O
    输入 |别名| 便可以得到所定义的内容
    上面例子中,输入 |H2O| ,得到 H/ :sub:`2`/ O ,也就是 H2O
    可以定义别名的元素有 文本 链接 图像 Unicode字符 日期时间等
    链接:
    .. |别名| replace:: 字符串 (可以是独立链接)
    .. _链接: 目标地址
    .. |别名| replace:: 链接_
    为链接创建别名时,使用命名链接,则别名替换为链接名称;使用独立链接,则别名替换为目标地址。
    为链接创建别名的时候,可以随意修改目标地址,但是链接名称要使两处保持一致,不够方便;并且使用别名时一定要带链接,不够灵活
    我们建议您使用 别名链接 ,它能够方便的修改链接名称和目标地址,并且可以灵活的输出各种格式
    别名链接 ,使用一个别名,定义链接名称和目标地址。
    这是一个 |别名链接|_
    .. |别名链接| replace:: 实际显示的链接名称
    .. _别名链接: http://目标地址
    实际相当于先定义一个别名,然后定义别名的链接。
    Note
    ·         |别名链接| 输出replace定义的字符串
    ·         别名链接_ 输出使用别名作为链接名称的链接
    ·         |别名链接|_ 输出链接名称定义的链接
    图片:
    .. |图片名称| image:: 图片路径
       :width: 宽度
       :height: 高度
       :target: 目标链接
    Unicode字符:
    .. |别名| unicode:: U+211
    .. |200E| unicode:: 200 U+20AC
    时间日期:
    .. |当前时间| date:: %H:%M
    列表
    列表中,相同的层级使用相同的缩进。列表中的所有条目都是块元素,要使用空行分隔
    列表中同一层级不需要空行分隔。不同层级起始处必须有空行
    列表:
    条目
    条目
          - 条目
          - 条目
    条目
    ·   如果不包含复杂的层级,只要使用缩进开始列表,并且不需要空行
    ·   如果层级复杂,那么最好所有条目都以空行分隔,避免发生混乱
    要点列表 以 - + ** 和一个空格作引导符,条目不计数
    ·   第一条
    o      子条目一
    §第三级
    §第三级
    o      子条目二
    ·   第二条还是第一行
    第二条第二行
    o      子条目
    ·   第三条
    代码如下 :
    第一条
    子条目一
         - 第三级
         - 第三级
    子条目二
    第二条
    还是第一行
    第二条第二行
    子条目
    第三条
    枚举列表 使用一个数字或者字符,后跟 . ) 或者使用 () 括起来,加一个空格
    1. 数字
    A. 大写字符
    a. 小写字符
        3. 用不同数字开始的子列表
        4. 确认数字有正确的序号!
    I.大写的罗马字符
    i.小写的罗马字符
    (1) 再来一个数字
    1) 再来
    可以使用 # 代替数字, reStructuredText 会自动排序
    #) 
    #) 
    #) 
    1.    
    2.    
    3.    
    定义列表 为列表中的条目定义一个名称
    要点列表
    只列出要点,条目不记数
    定义列表
    为列表中的条目定义一个名称
    枚举列表
    条目进行计数
    要点列表
    只列出要点,条目不记数
    定义列表
    为列表中的条目定义一个名称
    枚举列表
    条目进行计数
    区块列表 ,常用作联系薄
    :作者: Laurence
    :邮箱: 2999am@gmail.com
    :ID: Kardinal @ Ubuntu.org.cn论坛
    :版权: This document has been placed in the public domain
    :参考: 《结构化文本入门(Karron Qiu)》
          《Quick |rst|/ 》
          《Vim |rst|/ 》
          《/ |rst| Interpreted Text Roles》

     

    作者:
    Laurence
    邮箱:
    2999am@gmail.com
    ID:
    Kardinal @ Ubuntu.org.cn论坛
    版权:
    This document has been placed in the public domain
    参考:
    《结构化文本入门(Karron Qiu)》《Quick reStructuredText》《Vim reStructuredText》《reStructuredText Interpreted Text Roles》

    表格
    表格使用一条带有分隔符的上划线,和最少一条下划线构成
    ========   ==========
    表格        表格
    ========   ==========
    上划线下面为多行缩进相同的 行元素,行元素的下划线应不短于行字符。
    表格同一列的下划线,长度应相等。
    上划线(顶部)的分隔符是必须的,它决定了表格可以拥有的列数,但是不影响相邻列的合并。
    合并相邻的列,只要取消下划线的分隔符就可以了。
    底部的下划线,应和上划线使用同样符号
    ===== ===== ===== ===== =====   以空格作分隔符,间距均匀。决定了这个表格最多可以有5列
    11    12    13    14    15
    ----------- -----------------   下划线的长度应不小于字符长度
    21    22    23    24    25
    ----- ----- ----- ----- -----   每一行的下划线,决定了相信列是否合并
    31    32    33    34    35
    ----- ----------- -----------   如果不打算合并列,可以取消表内分隔线
    41    42    42    44    45
    =============================   底线必须与上划线使用相同符号

     

    11 12
    13 14 15
    21
    22
    23
    24
    25
    31
    32 33
    34 35
    41 42 42 44 45

    如果想制作更复杂的表格,例如合并相邻行,则需要使用列分隔线
    +------------+------------+-----------+
    | Header 1   | Header 2   | Header 3 |
    +============+============+===========+
    | body row 1 | column 2   | column 3 |
    +------------+------------+-----------+
    | body row 2 | Cells may span columns.|
    +------------+------------+-----------+
    | body row 3 | Cells may | - Cells   |
    +------------+ span rows. | - contain |
    | body row 4 |            | - blocks. |
    +------------+------------+-----------+
    脚注
    脚注使用方括号包裹起来
    这里是一个脚注 [1]_
    .. [1] 这里是脚注的内容
    行内脚注后面也有一个 _ 符号,它是当作一个链接处理的。
    脚注的名称可以使用 数字 # 和 * ,使用数字时需要手机排列
    推荐使用 # 作为脚注名称, reStructuredText 会自动计数。使用 * 作为脚注名称,reStructuredText 会把它们替换成一些花哨的符号
    提示符引用
    使用 >>> 作为引导符,模仿交互式命令提示行
    >>> rst2html -r 4 --stylesheet-path=/home/user/html4css1.css rst html
    引用块不能空行
    原文本
    >>> rst2html -r 4 --stylesheet-path=/home/user/html4css1.css rst html
    预定义
    reStructuredText中内建了许多字串元素作为功能对象
    标准。行内使用:
    :emphasis:
    *强调*
    :emphasis:`强调`
    :literal:
    ``原文``
    :literal:`原文`
    :strong:
    **特别强调**
    :strong:`特别强调`
    :subscript:`下标`
    :sub:`下标`
    :superscript:`上标`
    :sup:`上标`
    :title-reference:`标题`
    :title:`标题`
    :t:`标题`
    特殊。注释中使用:
    .. contents:: 索引
       :depth: 3 标题搜索深度
    .. image :: (路径)/image.png
        :target: http://ubuntu.org.cn
    .. figures :: 形状/figures.png
    .. sidebar:: 侧边栏标题
       :subtitle: 子标题
         These lines are sidebar content interpreted
         as body elements.
    .. rubric:: 醒目提示(内容)
    .. topic:: 话题
    .. tip:: tip内容
    .. note:: note内容
    .. warning:: warning内容
    .. important::
    .. attention::
    .. danger::
    .. error::
    .. caution::
    字串元素间使用脱字符和空格作为分隔符,可以不显示空格,例如:
    H2O
    H/ :sub:`2`/ O
    项目管理
    编写一个较大规模的文档时,使用单一源文件,编辑起来可能十分吃力。
    reStructuredText允许使用一个文件,在转换时将其它文件的内容读取进来,以便更好的管理文档项目
    .. header:: 源文件路径,读取到文件头部
    .. include:: 源文件路径,按顺序读取
    .. footer:: 源文件路径,读取到文件尾部
    例如:
    .. header:: dir/header.rst
    .. include:: dir/1.rst
    .. include:: dir/2.rst
    .. include:: dir/3.rst
    .. footer:: footer.rst
    Note
    不能够递归读取
    搭建reStructuredText环境
    Linux
    Ubuntu或者 Debian 系统中,使用APT安装
    >>> sudo apt-get install python-docutils
    /usr/share/python-docutils/ 目录中包含了相关的工具,我们经常要用到的工具是 rst2html.py 。
    在安装好之后,系统通常自动为它建立了链接,直接运行 rst2html 命令即可。
    Windows
    reStructuredText命令
    rst2html [参数] <源文件.rst> [目标文件.html]
    如果不指定目标文件,而输出Html代码,并不生成文件
    -r <levle> 设定报告级别,默认为 2
    --tab-width=<width> 设定输出的缩进宽度,默认8个空格
    --stylesheet-path=<file> 指定CSS文件
    --embed-stylesheet 使用嵌入式CSS
    --footnote-references=<format> 脚注格式。 barckets方括号 superscript上标
    --compact-lists 忽略列表中多余的空行,默认 enabled
    --config=<file> 指定配置文件
    --footnote-backlinks 允许从脚注跳回原文,默认选项
    --toc-top-backlinks 允许从标题跳回索引,默认选项
    定制
    /usr/share/python-docutils/docutils.conf为配置文件
    # These entries affect all processing:
    [general]
    source-link: yes
    datestamp: %Y-%m-%d %H:%M UTC
    generator: on
    # These entries affect HTML output:
    [html4css1 writer]
    # Required for docutils-update, the website build system:
    stylesheet-path: ../docutils/writers/html4css1/html4css1.css
    embed-stylesheet: no
    field-name-limit: 20
    代码风格
    缩进
    尽量使用固定长度的空格作为缩进,推荐您使用 4 个空格作为一个缩进
    虽然在理论上,缩进可以使用任意长度,但是那样容易引起混乱,例如:
    空行
    有些情况下,空行并不是必须的,比如标题和之后的内容。
    不过我们建议您还是尽量使用空行,以免不必要的麻烦。
    下划线
    理论上,下划线只要和文字的长度相同就可以了,不过我们建议主您使用比较长,且长度固定的下划线 例如 50
    标题
    下划线使用的符号比较重要。
    如果能够养成一个固定的习惯,在处理较大规模的文档时,可以避免许多麻烦
    推荐以下几套

     

    #####
    =====
    ^^^^^
    +++++
    -----
    >>>>>
    *****
    ~~~~~
    <<<<<

    建议您使用带上划线的第一级符号作为文章标题
    全部可选符号包括
    = - ` : ' " ~ ^ _ * + # < >
    标题链接
    请尽量避免重复的标题,特别是存在大量标题链接的情况下。
    如果同时存在多个名称相同的标题,并且有指向该名称的标题链接, reStructuredText 无法确定哪一个标题是真正的目标,这时就会发生错误。
    而使用标题链接链接越多,发生这种错误的几率越大~
    表格
    表格尽量使用空格作分隔符
    如果没有特殊要求,表格包含上划线和底线就可以了,例如:
    ======= =======
    aaaaaa   111111
    bbbbb    2222222
    cccc     3
    ======= =======
    别名
    建议将别名定义放在页面顶部,便于维护
    链接
    请尽量使用独立链接、无名链接、标题链接和别名链接
    定义别名链接的两行注释中间不要空行,便于阅读
    .. |bmlj| replace:: **别名链接**
    .. _bmlj:
    **别名链接**
    列表
    如无必要,请尽量使用要点列表和定义列表。枚举列表更适合作为章节
    编辑器设定
    Vim
    下载 vst.vim 文件,拷贝到Vim的插件目录即可。
    Emacs
    安装 rst.el 插件
    将如下内容添加到 ~/.emacs 文件中
    ;;RST
    (require 'rst)
    (add-hook 'text-mode-hook 'rst-text-mode-bindings)
    (setq auto-mode-alist
    (append '(("//.rst$" . rst-mode)
    ("//.rest$" . rst-mode)) auto-mode-alist))
    FAQ
    空行
    可以使用 Line Blocks 增加空行,使单独一行中只有一个 | 符号即可(前后都要有空行,因为它也是一个 块元素)
    消除空格
    使用 /_ (脱字符和空格)代替空格作为分隔符,可以消除空格。
    缩进和空格
    它们是等效的,如果不怕麻烦,您大可以完全使用空格,而不使用缩进
    展开全文
  • Word中的页眉数字自动累加

    千次阅读 2019-02-01 16:36:55
    #笔记 将光标移动到你要插入的累加数字的地方,连按两次“Ctrl+F9”快捷键(不同电脑可能不同)...生成如下累加页眉 1 3 5 …… 类似修改代码为“{={Page}}” 得到累加页眉数 1 2 3 4…… 统计 共{={NumPages}}页 ...
  • 巧用VBA自动处理Word表格

    千次阅读 2006-06-08 10:45:00
    巧用VBA自动处理Word表格 来源:http://www.52wg.org  Microsoft Word 是大家熟悉的文字处理软件,强大的功能为我们的工作提供了很大的帮助。...下面介绍几则使用VBA编程自动处理Word表格的例子。
  • 开题报告 一、课题题目 基于HTML模拟系统自动报告生成技术的研究与开发 二、课题内容及任务要求本课题的主要目的是自动生成HTML格式的分析报告文档: 1.对华铸CAE数据可以自动获取 2.自动生成HTML文件 3.开发...
  • 最近在完成论文的写作,无论是硕博士的大论文还是日常发布的小论文,精美的排版都会让评阅人心情舒畅,一个良好的word模板也会让论文写作变得简单容易。正所谓工欲善其事必先利其器,拿出半天的时间去为自己 ...
  • word使用技巧大全

    热门讨论 2011-03-18 20:37:53
    十二、在word自动生成目录 9 十三、如何用制作出书籍目录效果 10 十四、Word中如何分节 10 1 Word中节的作用 10 2 分节符的使用 11 3分节后的页面设置 11 4分节与页码编号 11 5分节后文档的页眉与页脚的设置方法 11 ...
  • Python实现Office办公自动化Pycharm 2018(Mac版)的下载功能快捷键如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不...
  • 作者王丽娟2006年 1 EXCEL 1 ...2.6.1 自动生成目录的前提 2.6.2 自动生成目录的操作 2.7 格式刷 2.8 查找替换 2.9 文档结构图 2.10 标题行重复 2.11 超链接 2.12 分节 2.13 奇偶页眉页脚 2.14 修改模板
  • word技巧

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

    2018-09-18 11:02:23
    折叠内容 有时候内容太多,使得我们查阅起来并不是那么的方便。这里,我们可以将内容折叠起来,只留一个标题。想要看的时候,只需展开,不想看就折叠起来。...但如果你没有文字内容,我们可以利用此功能来自动生成...
  • 推荐 Word、EXCEL必备工具箱

    千次阅读 2019-09-20 09:41:36
    EXCEL必备工具箱: EXCEL必备工具箱是一个同时支持EXCEL/WPS插件,自带免费多标签(类似于OfficeTab),安装后就可以使用,与...EXCEL必备工具箱智能识别当前是32/64位的EXCEL还是WPS,自动屏蔽WPS已有功能,额外增...
  • Word技巧

    2012-12-13 17:23:21
    采用合适的编辑方法会方便地做到整齐,规范,自动排序和交叉引用。  1.以尾注的方式插入第一个参考文献。  将光标定位于word文档中将要插入参考文献的位置,按“插入/引用/脚注和尾注”。出现一菜单,选择“尾注”...
  • WORD经典实用!

    千次阅读 2016-07-21 17:30:31
    WORD经典实用!较全面!
  • Word学习笔记分享

    千次阅读 2019-02-22 13:57:10
    第一章、Word 的常规排版 1-5 文字选择 Ctrl+鼠标选取——多选 Alt+鼠标选取——框选 1-11 文字效果 为文字添加填充与边框 1-13 字体其他效果 为字体添加着重号、删除线、上下标等效果 Ctrl+D ——打开字体选项栏 1-...
  • Word 对象模型概述

    2015-01-17 22:52:56
    了解 Word 对象模型 Word 提供了数百个您可与之交互的对象。这些对象排列在一个与用户界面密切相关的层次结构中。层次结构顶部的对象是 Application 对象。 此对象表示 Word 的当前实例。...
  • word使用技巧

    2019-09-22 01:01:53
    封面 删除题目等右侧的下划线,重新填入文字,并设置格式为...目录页做到这步,暂时不管他,一会自动生成目录。 正文 包括前言,正文,结论。这一部分自成一节。在录入时或录入后,设置一二三级别的标题的格式...
  • 60个WORD使用小技巧

    千次阅读 2013-05-03 14:02:16
    1、 Word表格自动填充   在Word表格里选中要填入相同内容的单元格,单击“格式→项目符号和编号”,进入“编号”选项卡,选择任意一种样式,单击“自定义”按钮,在“自定义编号列表”窗口中“编号格式”栏内输入...
  • Word 2003域应用完全手册

    千次阅读 2014-01-24 19:50:08
     简单地讲,域就是引导Word在文档中自动插入文字、图形、页码或其他信息的一组代码 。每个域都有一个唯一的名字,它具有的功能与Excel中的函数非常相似。下面以Seq和Dat e域为例,说明有关域的一些基本概念。 ...
  • 写入 操作Excel 8.1 pip安装pandas 8.2 pandas 读写 Excel 修订历史 更新日期 版本号 备注 修改者 2020.8.15 v1.0 新建,包含7个库的实战操作 tangxing07 2020.8.20 v2.0 新增各个库基本操作,增加图表操作 tangxing...
  • 计算机二级word

    2021-01-26 15:00:01
    计算机二级word 一,字体 1,按下图中的按钮功能: (1)分别修改中文和英文的字体 (2)修改字符间距(高级或直接显示是字符间距) 2,如何进行不连续的选择 先选中要选的内容,再按Ctrl键跳过不想选的内容,选择...
  • 接口用例智能生成,需要根据相应信息生成对应的字段值,比如自动生成手机号、姓名、身份证号等等,一开始的方案是手动撸代码 def random_gbk2312(self,length): """ 生成指定长度常见的随机汉字 """ str = '' ...
  • WORD 编辑

    千次阅读 2011-09-05 14:34:53
    如果你希望Word在启动时能自动打开你上次编辑的文档,可以用简单的宏命令来完成: (1)选择“工具”菜单中的“宏”菜单项,单击“录制新宏”命令打开“录制宏”对话框; (2)在“录制宏”对话框中,在“宏名”...
  • 课时010【视频】01 别说...文档目录怎么自动生成;怎么为图片自动编号;制作300张席卡怎么最快; 课时012.【视频】02-1.三步搞定活动策划书排版 # 样式菜单: 样式中的标题,内置了文字级别,能够快速将内容区分...
  • Word的域应用

    千次阅读 2019-08-10 16:19:24
    WORD是文字处理软件,我们在日常处理一些文字时经常遇到一些问题,如:各种公式的录入,尽管Word都提供了“公式编辑器”,但其插入的却是“对象”,有时排版会感觉不方便,而且也不适合大量、重复的公式录入。...
  • word编辑技巧

    千次阅读 2010-05-10 18:04:00
    1.2 编辑排版技巧(1)1.2.1 页面设置快速进行调整要对Word进行页面调整,通常大家采用的方法是选择“文件→页面设置”选项的方法进行,请问有没有更快速方便的方法呢?答:有,如果要进行“页面设置”,只需用鼠标...
  • Clerk Ma ,LuaTeX-ja开发者 ...不过对于我来说,这几种战争都跟我没关系,尤其是LaTeX和Word,我都用。 LaTeX和Word完全不是一个类型的排版工具,但是目的一样:排版。 LaTeX是仿照Scribe

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,019
精华内容 3,607
关键字:

word自动生成连续日期