1- namespace dotnetCampus . OpenXmlUnitConverter
1+ using System ;
2+ using DocumentFormat . OpenXml ;
3+
4+ namespace dotnetCampus . OpenXmlUnitConverter
25{
36 /// <summary>
47 /// 用 Emu 表示的百分数
@@ -14,6 +17,54 @@ public EmuPercentage(double value)
1417 Value = value ;
1518 }
1619
20+ /// <summary>
21+ /// 用 Emu 表示的百分数
22+ /// </summary>
23+ /// <param name="int32Value">支持传入带百分号的内容</param>
24+ public EmuPercentage ( Int32Value int32Value ) : this ( int32Value . InnerText )
25+ {
26+ }
27+
28+ internal EmuPercentage ( string ? percentageText )
29+ {
30+ if ( ! string . IsNullOrEmpty ( percentageText ) )
31+ {
32+ if ( int . TryParse ( percentageText , out var intValue ) )
33+ {
34+ Value = intValue ;
35+ return ;
36+ }
37+ else
38+ {
39+ // 如果是带了百分比的
40+ if ( percentageText ! . Length > 1 && percentageText . EndsWith ( "%" ) )
41+ {
42+ #if NETCOREAPP3_1_OR_GREATER
43+ var percentageSpan = percentageText . AsSpan ( ) . Slice ( 0 , percentageText . Length - 1 ) ;
44+ if ( double . TryParse ( percentageSpan , out var doubleValue ) )
45+ #else
46+ var newPercentageText = percentageText . Substring ( 0 , percentageText . Length - 1 ) ;
47+ if ( double . TryParse ( newPercentageText , out var doubleValue ) )
48+ #endif
49+ {
50+ // 根据 OpenXml 规则,这里和像素百分比转换是 1000 倍
51+ var pixelPercentageValue = doubleValue * 1000 ;
52+
53+ // 这里的百分比一定是 Pixel 的百分比级的,需要经过转换才能计算为 Emu 的百分比
54+ // 为了将 PixelPercentageValue 转换为 EmuPercentage 类型,需要经过换算逻辑
55+ var pixel = new Pixel ( pixelPercentageValue ) ;
56+ var emuPercentageValue = pixel . ToEmu ( ) ;
57+
58+ Value = emuPercentageValue . Value ;
59+ return ;
60+ }
61+ }
62+ }
63+ }
64+
65+ throw new ArgumentException ( $ "Can not convert PercentageText={ percentageText } to { nameof ( EmuPercentage ) } value.") ;
66+ }
67+
1768 /// <summary>
1869 /// 用 Emu 表示的百分数
1970 /// </summary>
0 commit comments