OpenXml SDK学习笔记(4):设置文件级别的样式
观察上一段日记最后的代码:

这里的样式基本可以理解为行内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):设置文件级别的样式的更多相关文章
- OpenXml SDK学习笔记(1):Word的基本结构
能写多少篇我就不确定了,可能就这一篇就太监了,也有可能会写不少. OpenXml SDK 相信很多人都不陌生,这个就是管Office一家的文档格式,Word, Excel, PowerPoint等都用 ...
- Windows phone 8 学习笔记(2) 数据文件操作
原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...
- matlab学习笔记5--低级文件输入输出函数
一起来学matlab-matlab学习笔记5 低级文件输入输出函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 感谢张 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- thinkphp学习笔记2—入口文件
原文:thinkphp学习笔记2-入口文件 在thinkphp中有两个入口文件,一个是项目的入口文件,是index.php在主目录里面,还有一个是thinkphp框架的的入口文件,放在框架目录下面如: ...
- WPF 学习笔记-设置属性使窗口不可改变大小
原文:WPF 学习笔记-设置属性使窗口不可改变大小 调整Windows下的ResizeMode属性: ResizeMode = NoResize Resize属性是控制Windows是否可以改变大小, ...
- 使用elementUI的时候,使用Upload 上传的时候,使用 list-type 属性来设置文件列表的样式,before-upload方法失效
最近在做项目的时候,使用elementUI的时候,使用Upload 上传的时候,before-upload方法失效. 情况下:使用 list-type 属性来设置文件列表的样式. 最终的优化之后:(演 ...
- [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Windows phone 8 学习笔记(2) 数据文件操作(转)
Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方.本节主要讲解它们的用法以及相关限制性.另外包括本地数据库的使用方式 ...
随机推荐
- 搞定 NodeJS 开发调试
代码调试有时候是一种充满挑战的工作,如果有一个趁手的调试工具的话,往往可以做到事半功倍的效果.得益于这些年的快速发展,在 NodeJS 生态中已经有了多种调试工具可以使用.我们今年就来分享几个常用的调 ...
- Javascript 常见的高阶函数
高阶函数,英文叫 Higher Order function.一个函数可以接收另外一个函数作为参数,这种函数就叫做高阶函数. 示例: function add(x, y, f) { return f( ...
- 深入浅出WPF-06.Binding(绑定)01
Binding(绑定) 先上图,再解释 针对这个图,我们先来说说什么是Binding. Binding就是一个桥梁,建立在数据和UI之间的桥梁.既然是数据驱动,那么我们就把数据称之为"源&q ...
- String(char[] value, boolean share) {
记录一下今天被蠢到 1. 在观察StringBuffer类的toString方法时,发现了个没见过的方法 return new String(toStringCache, true); @Overri ...
- mybatis 配置问题查找
mybatis配置问题记录 org.apache.ibatis.binding.BindingException: Type interface com.xx.dao.UserDao(自己项目的文件) ...
- 定制input元素
定制input元素 input元素可以用来生成一个供用户输入数据的简单文本框.其缺点在于用户在其中输入什么值都可以.有时这还不错,但是有时设计者可能希望让用户输入特定类型的数据.在后一种情况下,可以对 ...
- .NET下使用ufun函数取CAM操作的进给速度
UF_PARAM_ask_subobj_ptr_value,这个函数在封装的时候,给了很大一个坑啊. NXOpen.UF.UFParam.AskSubobjPtrValue(ByVal param_t ...
- Golang通脉之数组
数组是同一种数据类型元素的集合.数组在内存中都是连续存放的. 在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化. 基本语法: // 定义一个长度为3元素类型为int的数组 ...
- Unity——EasyTouch摇杆插件使用
EasyTouch摇杆插件使用 Demo展示 双指缩放在电脑端无法掩饰,竖屏将就看看吧: 插件名叫EasyTouch,有需要给我留言,不想开仓库传了: 创建摇杆点这里: 初始化 On_Joystick ...
- (六)、Docker 之 Dockerfile
1.什么是Dockerfile Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本. 2.Dockerfile解析过程 前提认知: 每条保留字指令都必须为大写字母 ...