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卡四个地方.本节主要讲解它们的用法以及相关限制性.另外包括本地数据库的使用方式 ...
随机推荐
- Python return self
在Python中,return self的作用为: Returning self from a method simply means that your method returns a refer ...
- 深度理解JVM
1. 环境搭建 安装jdk 2. 内存溢出场景模拟 public class Test01 { public static void main(String[] args) { //测试内存溢出 ...
- 从产业链、架构和技术三个层面,看元宇宙与RPA的发展关系
你可能还不知道,元宇宙也将带动RPA高速发展 一文读懂RPA如何赋能元宇宙,虚拟空间更需要RPA无处不在 三个层面,解读元宇宙如何利好RPA行业发展 从产业链.架构和技术三个层面,看元宇宙与RPA的发 ...
- Spring自动装配歧义性笔记
Spring自动装配歧义性笔记 如果系统中存在两个都实现了同一接口的类,Spring在进行@Autowired自动装配的时候,会选择哪一个?如下: // 一下两个类均被标记为bean @Compone ...
- Java基础之(三):IDEA的安装及破解
IDEA的安装 IDEA官网:IDEA 点击IJ 找好操作系统,点击下载 双击打开,自己找个安装路径 勾选这两个即可 旗舰版破解及汉化 上面是个人社区版,是免费的,但是如果想要使用汉化版的,需要寻找插 ...
- Java初步学习——2021.10.11每日总结,第六周周一
(1)今天做了什么: (2)明天准备做什么? (3)遇到的问题,如何解决? 今天继续学习菜鸟教程Java实例 字符串 9.字符串小写转大写--toUpperCase方法 public class Ma ...
- NX开发库版本问题
有做NX二次开发的朋友经常问我这样的问题:我在NX8.0上开发的程序,可以在NX9.0上运行吗? 由于NX的开发库随着版本的更新也会不断更新,会增加新的方法,同时有些也会过时或者消失. 如下图:NX8 ...
- 你对微信小程序的理解?优缺点?
一.是什么 2017年,微信正式推出了小程序,允许外部开发者在微信内部运行自己的代码,开展业务 截至目前,小程序已经成为国内前端的一个重要业务,跟 Web 和手机 App 有着同等的重要性 小程序是一 ...
- 使用ShardingSphere-JDBC完成Mysql的分库分表和读写分离
1. 概述 老话说的好:选择比努力更重要,如果选错了道路,就很难成功. 言归正传,之前我们聊了使用 MyCat 实现Mysql的分库分表和读写分离,MyCat是服务端的代理,使用MyCat的好处显而易 ...
- Golang通脉之包的管理
在工程化的开发项目中,Go语言的源码复用是建立在包(package)基础之上的. 包(package)是多个Go源码的集合,是一种高级的代码复用方案,Go语言提供了很多内置包,如fmt.os.io等. ...