为有中文需求的客户提供多渠道中文技术支持.

Wed Oct 12, 2022 12:45 am

您好,

我经常需要处理, 满足特定格式或样式的段落, 能大致提供一下如下描述的示例代码吗?
刚上手不久, 对组件的一些功能使用还不是很熟悉, 示例代码可在很大程度上帮助理解相关的逻辑和功能, 提前感谢!
_____________________________________________________________________________________________________
某个 正文样式 的段落 中 (非标题段落):

A. 如果里面的文字 字号 有多种, 则将该段落做如下处理: (如示例中的第1 第3 第7 段)
文字格式: 将中文字体: 设为 宋体, 西文字体: 设为 Consolas , 字号: 统一设为14磅
段落格式: 段前0.5行, 段后1行, 行距: 固定值16磅
注意: 文字和段落的其它原有的格式不得变动

B. 如果里面有紫色的文字, 则将该段落做如下处理: (如示例中的第5 第7 段)
文字格式: 将中文字体: 设为 微软雅黑体, 西文字体: 设为Consolas , 字号: 统一设为10磅
段落格式: 添加 0.5磅宽度 蓝色 的边框线
注意: 第7段同时满足A和B两种情况, 先处理A, 再处理B

C.如果它的段落格式: 段前0.5行且段后0.5行且行距: 固定值12磅, 则将该段落做如下处理: (如示例中的第11 第13 段)
文字格式: 将中西文字体: 设为 黑体, 字号: 统一设为11磅, 字颜色: 设为黑色
段落格式: 添加 1磅宽度 红色 的边框线

_____________________________________________________________________________________________________
某个 标题1样式 的段落 中 (非正文段落):
如果标题中有红颜色的文字, 则将该标题中所有文字颜色改为蓝色 (如示例中的第二章 第三章 的标题)

_____________________________________________________________________________________________________
将文章中的楷体字体 全改为 隶书字体 (如示例中的第三章下的红色字段落)

keLi1680
 
Posts: 30
Joined: Sun Oct 02, 2022 2:35 am

Wed Oct 12, 2022 10:00 am

您好,

感谢您的留言。
对于您的提出的需求,我将相应代码放在附件中了。另外,对于您提出的“需求A”和“需求C“中的段前、段后0.5行,抱歉,目前我们产品仅仅支持已“磅”为单位来设置和获取段前、段后的值,所以对于您的“需求C“我将原文档中段前、段后值改为“磅”为单位来操作的。
我们的网站上也提供了大量的参考文档,您可以从下面链接访问。

https://www.e-iceblue.cn/tutorials.html

Sincerely
Abel
E-iceblue support team
User avatar

Abel.He
 
Posts: 1010
Joined: Tue Mar 08, 2022 2:02 am

Thu Oct 13, 2022 1:10 am

Abel.He wrote:您好,

感谢您的留言。
对于您的提出的需求,我将相应代码放在附件中了。另外,对于您提出的“需求A”和“需求C“中的段前、段后0.5行,抱歉,目前我们产品仅仅支持已“磅”为单位来设置和获取段前、段后的值,所以对于您的“需求C“我将原文档中段前、段后值改为“磅”为单位来操作的。
我们的网站上也提供了大量的参考文档,您可以从下面链接访问。

https://www.e-iceblue.cn/tutorials.html

Sincerely
Abel
E-iceblue support team


感谢您帮忙完成示例, 有两个问题想询问:

1. 执行后的第1段和第3段, 结果不一致, 数字字体和字号没有改变, 英文标点的字体和字号,有的改了, 没的没有改, 如下面的图片所示, 但它们都同属于 情况A 使用的正则相同
我手动在word中设置中西文字体, 发现如下的规律:
西文字体会影响: 英文的标点 和 数字 和 英文字母
中文字体会影响: 中文的标点 和 中文字

2.经过查询相关资料得知:
A.段前段后距离的单位: 行和磅 并不存在对等的换算关系
B.已经存在的word文件, 如果在编辑前没有将 选项 -> 高级 -> 以字符宽度为度量单位 取消掉, 即使后来取消, 原来设置过的行距仍然显示 X行
C.VBA代码中是支持以行为单位的,如下所示, 不能开发这个功能吗? 如果不支持, 因为上面B的情况会造成获取或设置值方面的混乱, 除非,所有的文件, 在从头编辑时就把 选项 -> 高级 -> 以字符宽度为度量单位 取消掉
.LineUnitBefore = 0.5
.LineUnitAfter = 0.5

keLi1680
 
Posts: 30
Joined: Sun Oct 02, 2022 2:35 am

Thu Oct 13, 2022 11:00 am

您好,

感谢您的反馈。
段落中的文本都是放在textRange中,不同类型的文本(数字、英文、中文、标点等等)会放在不同的textRange中,而我提供给您的代码中的正则表达式只匹配text Range中的中文、英文。如果您想要让数字、标点符号也做相应改变。您还需要使用正则表达式去匹配他们。

Sincerely
Abel
E-iceblue support team
User avatar

Abel.He
 
Posts: 1010
Joined: Tue Mar 08, 2022 2:02 am

Fri Oct 14, 2022 3:00 am

Abel.He wrote:您好,

感谢您的反馈。
段落中的文本都是放在textRange中,不同类型的文本(数字、英文、中文、标点等等)会放在不同的textRange中,而我提供给您的代码中的正则表达式只匹配text Range中的中文、英文。如果您想要让数字、标点符号也做相应改变。您还需要使用正则表达式去匹配他们。

Sincerely
Abel
E-iceblue support team


修改正则后, 仍然有上面提到的问题, 有的修改了, 有的没有修改
if (Regex.IsMatch(textRange.Text, "^([A-Za-z0-9,]){1}[^.]*."))
c.png

keLi1680
 
Posts: 30
Joined: Sun Oct 02, 2022 2:35 am

Fri Oct 14, 2022 10:30 am

您好,

您可以遍历第一段和第三段的每一个textRange并将其输出(Console.WriteLine(textRange.Text);),如下面的截图:
您可以发现有的逗号与中文字符放在一个textRange中,有的逗号是单独放在一个textRange中,如果使用您修改后的正则表达式,单独存在的逗号就会被设置为“Consolas”,而和中文字符放在一起的逗号被设为“宋体”。这就是您第一段和第三段中逗号出现区别的原因,为了避免出现上述情况,应该将匹配逗号的正则表达式与匹配中文的表达式放在一起。
而关于序号格式的原因,同样是有的数字和“.”放在一起,有的是分开放的。所以要将二者都考虑进正则表达式。
我将符合您要求设置第一段和第三段样式的代码放在下面。如果您还有任何问题,欢迎随时联系。
Code: Select all
//您提到的A情况
        public static void setA(Paragraph para)
        {
            //设置段前、段后、行距
            para.Format.BeforeSpacing = 8f;
            para.Format.AfterSpacing = 16f;
            para.Format.LineSpacing = 16f;
            para.Format.LineSpacingRule = LineSpacingRule.Exactly;
            //遍历每个段落的child
            foreach (DocumentObject paraChildObject in para.ChildObjects)
            {

                //当paraChildObject对象为textrange时
                if (paraChildObject.DocumentObjectType == DocumentObjectType.TextRange)
                {
                    //每个段落有多个textRange,中文和英文是放在不同的textRange中的
                    TextRange textRange = paraChildObject as TextRange;
                    //当text Range中存放的是英文时
                    if (Regex.IsMatch(textRange.Text, "^([A-Za-z]){1}[^.]*."))
                    {
                        //设置字体
                        textRange.CharacterFormat.Font = new Font("Consolas", 14);                   
                    }
                    //当text Range中存放的是中文或者“,”时
                    if (Regex.IsMatch(textRange.Text, "^[\u4e00-\u9fbb,]+"))
                    {
                        //设置字体
                        textRange.CharacterFormat.Font = new Font("宋体", 14);
                    }                                                     
                    //当text Range中存放的是数字或者“.”时
                    if (Regex.IsMatch(textRange.Text, "^([0-9,.]){1}"))
                    {
                        //设置字体^[\u4e00-\u9fbb]+
                        textRange.CharacterFormat.Font = new Font("宋体", 14);
                    }
                }
            }
        }


Sincerely
Abel
E-iceblue support team
User avatar

Abel.He
 
Posts: 1010
Joined: Tue Mar 08, 2022 2:02 am

Mon Oct 17, 2022 1:39 am

感谢您的帮助!

有个建议, 对于为整段的文字设置字符格式, 如果存在 中西文字体属性 就很方便了, 因为中西文的标点太多了,VBA存在的中西文字体属性如下:
With Selection.Font
.NameFarEast = "宋体"
.NameAscii = "Consolas"
.NameOther = "Consolas"
--------------------------------------------------------------------------------------
有了属性后, 用下面的代码改字体就方便多了

textRange.CharacterFormat.Font.NameFarEast = new Font("宋体", 14);
textRange.CharacterFormat.Font.NameAscii = new Font("Consolas", 14);
textRange.CharacterFormat.Font.NameOther = new Font("Consolas", 14);

Abel.He wrote:您好,

您可以遍历第一段和第三段的每一个textRange并将其输出(Console.WriteLine(textRange.Text);),如下面的截图:
您可以发现有的逗号与中文字符放在一个textRange中,有的逗号是单独放在一个textRange中,如果使用您修改后的正则表达式,单独存在的逗号就会被设置为“Consolas”,而和中文字符放在一起的逗号被设为“宋体”。这就是您第一段和第三段中逗号出现区别的原因,为了避免出现上述情况,应该将匹配逗号的正则表达式与匹配中文的表达式放在一起。
而关于序号格式的原因,同样是有的数字和“.”放在一起,有的是分开放的。所以要将二者都考虑进正则表达式。
我将符合您要求设置第一段和第三段样式的代码放在下面。如果您还有任何问题,欢迎随时联系。
Code: Select all
//您提到的A情况
        public static void setA(Paragraph para)
        {
            //设置段前、段后、行距
            para.Format.BeforeSpacing = 8f;
            para.Format.AfterSpacing = 16f;
            para.Format.LineSpacing = 16f;
            para.Format.LineSpacingRule = LineSpacingRule.Exactly;
            //遍历每个段落的child
            foreach (DocumentObject paraChildObject in para.ChildObjects)
            {

                //当paraChildObject对象为textrange时
                if (paraChildObject.DocumentObjectType == DocumentObjectType.TextRange)
                {
                    //每个段落有多个textRange,中文和英文是放在不同的textRange中的
                    TextRange textRange = paraChildObject as TextRange;
                    //当text Range中存放的是英文时
                    if (Regex.IsMatch(textRange.Text, "^([A-Za-z]){1}[^.]*."))
                    {
                        //设置字体
                        textRange.CharacterFormat.Font = new Font("Consolas", 14);                   
                    }
                    //当text Range中存放的是中文或者“,”时
                    if (Regex.IsMatch(textRange.Text, "^[\u4e00-\u9fbb,]+"))
                    {
                        //设置字体
                        textRange.CharacterFormat.Font = new Font("宋体", 14);
                    }                                                     
                    //当text Range中存放的是数字或者“.”时
                    if (Regex.IsMatch(textRange.Text, "^([0-9,.]){1}"))
                    {
                        //设置字体^[\u4e00-\u9fbb]+
                        textRange.CharacterFormat.Font = new Font("宋体", 14);
                    }
                }
            }
        }


Sincerely
Abel
E-iceblue support team

keLi1680
 
Posts: 30
Joined: Sun Oct 02, 2022 2:35 am

Mon Oct 17, 2022 11:02 am

您好,

对于您提到的需求,我们产品目前可以通过下面代码实现。
Code: Select all
                //每个段落有多个textRange,中文和英文是放在不同的textRange中的
                    TextRange textRange = paraChildObject as TextRange;
                    //设置西文(编码范围0-127的字符采用的字体  )
                    textRange.CharacterFormat.FontNameAscii = "Consolas";
                    //设置东亚字体(中文)
                    textRange.CharacterFormat.FontNameFarEast = "宋体";
                    //设置字体大小
                    textRange.CharacterFormat.FontSize = 14;

如果您还有任何问题,欢迎随时联系。

Sincerely
Abel
E-iceblue support team
User avatar

Abel.He
 
Posts: 1010
Joined: Tue Mar 08, 2022 2:02 am

Tue Oct 18, 2022 6:09 am

谢谢, 这样设置属性方便多了

Abel.He wrote:您好,

对于您提到的需求,我们产品目前可以通过下面代码实现。
Code: Select all
                //每个段落有多个textRange,中文和英文是放在不同的textRange中的
                    TextRange textRange = paraChildObject as TextRange;
                    //设置西文(编码范围0-127的字符采用的字体  )
                    textRange.CharacterFormat.FontNameAscii = "Consolas";
                    //设置东亚字体(中文)
                    textRange.CharacterFormat.FontNameFarEast = "宋体";
                    //设置字体大小
                    textRange.CharacterFormat.FontSize = 14;

如果您还有任何问题,欢迎随时联系。

Sincerely
Abel
E-iceblue support team

keLi1680
 
Posts: 30
Joined: Sun Oct 02, 2022 2:35 am

Tue Oct 18, 2022 6:51 am

您好,

感谢您的反馈。 :)

Sincerely
Abel
E-iceblue support team
User avatar

Abel.He
 
Posts: 1010
Joined: Tue Mar 08, 2022 2:02 am

Return to 中文技术支持