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卡四个地方.本节主要讲解它们的用法以及相关限制性.另外包括本地数据库的使用方式 ...
随机推荐
- kibana操作
一些KIBANA的操作,记录下,免下次重复写 #创建索引名为kb_question的索引,并添加mapping,即各字段属性 PUT kb_question { "mappings" ...
- 『Python』matplotlib常用函数
1. 绘制图表组成元素的主要函数 1.1 plot()--展现量的变化趋势 import numpy as np import matplotlib.pyplot as plt import matp ...
- Springboot --- Bug集
一. 启动springboot报错:找不到或无法加载主类 解决:直接选中项目,在ecplise选中"project",点击clean 清理项目再运行 问题解决. 二.报错:Fail ...
- golang实现一个简单的websocket聊天室
基本原理: 1.引入了 golang.org/x/net/websocket 包. 2.监听端口. 3.客户端连接时,发送结构体: {"type":"login" ...
- VUE自学日志02-应用与组件实例
准备好了吗? 我们刚才简单介绍了 Vue 核心最基本的功能--本教程的其余部分将更加详细地涵盖这些功能以及其它高阶功能,所以请务必读完整个教程! 应用 & 组件实例 创建一个应用实例创建一个应 ...
- npm install失败或者进度卡住解决办法 以及 nrm的使用
今天在使用npm install安装url-loader时,遇到下载进度条停止问题 因为已经提前更换了 淘宝的镜像,应该不是网络问题,通过 npm config set loglevel info 显 ...
- 踩坑系列《十二》解决连接云服务器的redis失败
在本地连接服务器redis的时候,发现连接失败,这是因为服务器上的redis开启保护模式运行,该模式下是无法进行远程连接的.只需要修改redis目录下的redis.conf文件,找到 protecte ...
- JVM学习笔记——方法区
方法区 Method Area 方法区在逻辑上属于堆的一部分,但可以看做是一块独立于 Java 堆的内存空间.所有的字段和方法字节码,以及一些特殊的方法,如构造函数,接口代码在此定义.所有定义方法的信 ...
- InstallSheild相关
一.关于使用InstallSheild制作安装包的总结. 1.定制化制作需要了解InstallScript语法,相关资料可以去网上查找,后续提供比较好的资料. 2.有些软件运行是需要一些环境的,譬如使 ...
- SpringMVC 获得请求数据
获得请求参数 客户端请求参数的格式是:name=value&name=value- - 服务器端要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数: 基本类型 ...