观察上一段日记最后的代码:

这里的样式基本可以理解为行内CSS。那么既然有行内的样式,就肯定有外部的样式。那这部分就对应笔记1里说的style.xml文件。这个文件对应的是Document.MainDocumentPart.StyleDefinitionsPart这个部分,文档是 https://docs.microsoft.com/zh-cn/dotnet/api/documentformat.openxml.packaging.styledefinitionspart 。这部分里面有一个重要属性 Styles 。这个属性里存着的就是整个文档里所有用到的样式,包括显示在界面上的,和不显示在界面上的。Styles属性里,所有内容都是Style的对象。在学习这个对象前,先要了解Word里有几种样式。在Word中,选择编辑任何一个样式,就可以看到:

这样的界面,他们归纳一下,也就是文档中提到的WordprocessingML的六大样式:

  • 段落样式

  • 字符样式

  • 链接样式(段落 + 字符)[注释:通过链接元素实现 (§17.7.4.6)。注释结束]

  • 表样式

  • 编号样式

  • 默认段落 + 字符属性

其中,在本需求中会用到的就是“段落样式”和“字符样式”。所以,只需要学习这两种样式的实现方式即可。那么,再观察Style对象。这个对象的初始化大致是长这样的:

ParagraphStyle = new Style()
{
CustomStyle = true,
Type = StyleValues.Paragraph,
StyleName = new StyleName()
{
Val = Name
},
StyleId = paraId,
StyleParagraphProperties = new StyleParagraphProperties(),
StyleRunProperties = new StyleRunProperties()
};

其中,CustomStyle指的是用户自定义样式,直接设置为true就可以。Type是样式的类型,一个枚举,直接设置为Paragraph就可以。再接下来,StyleName就是显示在窗口中“名称”一栏的名字。StyleId则是内部用于识别样式的编号,这个属性和StyleName都不能重复。接着,StyleParagraphProperties指的是窗口里下拉栏中“段落”对应的内容,StyleRunProperties指的是窗口里设置文字字体字号这些内容。

在声明样式之后,需要将样式先保存在Document.MainDocumentPart.StyleDefinitionsPart.Styles属性里。之后,再应用这些样式。应用时,需要使用到样式的ID,所以要将Style转换为样式ID:

internal ParagraphStyleId ParagraphStyleId => new ParagraphStyleId()
{
Val = ParagraphStyle.StyleId
}; internal RunStyle RunStyleId => new RunStyle()
{
Val = ParagraphStyle.StyleId
};

这两个属性分别给谁用是非常明确的。那么,在WordParagraph里,书写一个函数用于适用样式:

protected override CompositeElementBase SetStyleSafe(WordStyles style)
{
Properties.ParagraphStyleId = style.ParagraphStyleId;
foreach (var item in Children)
{
(item as WordRun)?.SetStyle(style);
} return this;
}

Run里面也需要一个这样的函数,不过用的就是RunStyle,内容是一样的就不重复了。

最后呢,修改一下AppendParagraph等方法,让样式更容易使用就行了。这一篇笔记结束的样子是这样的:

和上一章笔记结束时不太一样的地方是,我发现这个原文居然有左侧缩进2.23字符。于是我无奈新加了SetLeftChars和SetRightChars方法用来处理这些情况,非常尴尬。所以,做的时候读需求非常重要。另外开发过程中,为了保证使用简单,我把代码重构了好几次,倒也花了不少时间。最坑的是还不是这些,下篇笔记会讲这里的调试。

OpenXml SDK学习笔记(4):设置文件级别的样式的更多相关文章

  1. OpenXml SDK学习笔记(1):Word的基本结构

    能写多少篇我就不确定了,可能就这一篇就太监了,也有可能会写不少. OpenXml SDK 相信很多人都不陌生,这个就是管Office一家的文档格式,Word, Excel, PowerPoint等都用 ...

  2. Windows phone 8 学习笔记(2) 数据文件操作

    原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...

  3. matlab学习笔记5--低级文件输入输出函数

    一起来学matlab-matlab学习笔记5 低级文件输入输出函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 感谢张 ...

  4. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  5. thinkphp学习笔记2—入口文件

    原文:thinkphp学习笔记2-入口文件 在thinkphp中有两个入口文件,一个是项目的入口文件,是index.php在主目录里面,还有一个是thinkphp框架的的入口文件,放在框架目录下面如: ...

  6. WPF 学习笔记-设置属性使窗口不可改变大小

    原文:WPF 学习笔记-设置属性使窗口不可改变大小 调整Windows下的ResizeMode属性: ResizeMode = NoResize Resize属性是控制Windows是否可以改变大小, ...

  7. 使用elementUI的时候,使用Upload 上传的时候,使用 list-type 属性来设置文件列表的样式,before-upload方法失效

    最近在做项目的时候,使用elementUI的时候,使用Upload 上传的时候,before-upload方法失效. 情况下:使用 list-type 属性来设置文件列表的样式. 最终的优化之后:(演 ...

  8. [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. Windows phone 8 学习笔记(2) 数据文件操作(转)

    Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方.本节主要讲解它们的用法以及相关限制性.另外包括本地数据库的使用方式 ...

随机推荐

  1. ul li 标签

    去除制表符: li{ list-style:none; } ul{ /* 靠左*/ padding-left: 5px; }

  2. CF643F-Bears and Juice【组合数学】

    正题 题目链接:https://www.luogu.com.cn/problem/CF643F 题目大意 题目有点奇怪就直接放翻译了 有 \(n\) 只熊和若干桶果汁和恰好一桶酒,每一天每只熊会选择一 ...

  3. windows terminal+wsl+neovim配置过程杂记

    长期记录,草稿 coc依赖于node,直接sudo apt intsll node得到的版本是10.x,无法满足要求, 这篇博客介绍了安装新版node的方法https://www.cnblogs.co ...

  4. 【Spring技术原理】Aspectj和LoadTimeWeaving的动态代理技术实现指南

    前提介绍 当我们聊到Spring框架的项目实际开发中,用的强大的功能之一就是(面向切面编程)的这门AOP技术.如果使用得当,它的最大的作用就是侵入性比较少并且简化我们的工作任务(节省大量的重复性编码) ...

  5. UDP用户数据报

    UDP 用户数据报协议UDP只在IP的数据报服务之上增加了很少的一个功能,就是复用,分用,差错检测功能.UDP的主要特点是: UDP是无连接的,即在发送数据报之前不需要建立连接(当然发送数据结束的时候 ...

  6. Parcel Fabric Tools(宗地结构工具)

    宗地结构工具 1.图层和表视图 # Process: 创建宗地结构图层 arcpy.MakeParcelFabricLayer_fabric("", 输出图层) # Process ...

  7. SpringBoot入门02-配置类

    引入 Spring Boot的底层已经有了Spring MVC Spring Boot习惯优先的思想,很多配置都是可省的 不需要配置web.xml文件 不需要服务层的xml配置 不需要dao层的xml ...

  8. 重学c#系列——字典(十一)

    前言 重学c#系列继续更新,简单看一下字典的源码. 看源码主要是解释一下江湖中的两个传言: 字典foreach 顺序是字典添加的顺序 字典删除元素后,字典顺序将会改变 正文 那么就从实例化开始看起,这 ...

  9. ClickHouse 存算分离架构探索

    背景 ClickHouse 作为开源 OLAP 引擎,因其出色的性能表现在大数据生态中得到了广泛的应用.区别于 Hadoop 生态组件通常依赖 HDFS 作为底层的数据存储,ClickHouse 使用 ...

  10. UE4蓝图AI角色制作(七)之追逐玩家

    15.追逐玩家 现在我们的AI无法做出任何决策,它总是执行相同的决策.我们先把感知系统中的相关信息提供给AI,让AI知道如何做出决策,然后我们会修改行为树.我们首先需要创建新的黑板键,这样我们就能在行 ...