Office Open XML 的测量单位

在 Office Open XML 默认单位是 dxa 也就是像素点的 20 倍,如 ISO 216 A4 (210x297mm ~ 8.3×11.7in) 的大小可以使用下面代码表示

在页面大小 Page width Page height 和边距 margin 和缩进 tabs 使用

<w:pgSz w:w="11906" w:h="16838"/>
单位计算可以使用下面公式

像素 Points = dxa/20
英寸 Inches = Points/72
厘米 Centimeters = Inches*2.54
在 OpenXML 因为 dxa 是像素点的 20 倍,所以也叫二十分之一点,另外这里说的像素点是 Point 而不是像素 Pixel 哦

缩写如下

Points:pt
Inches:in
Centimeters:cm
以 A4 为例

Width = 11906 dxa = 595.3 point = 8.27 in = 21 cm
Half-points
用来表示字体大小的半点,一个点等于两个半点,如表示 12pt 可以这样写

// run properties
<w:rPr>
// 24 = 12pt
<w:sz w:val="24"/>
</w:rPr>
Fiftieths of a Percent
表示百分比相对值,用于表示表格的宽度和相对宽度,他的值和百分比换算如下

n/100 * 5000
如百分之50可以表示为 50/100 * 5000 pct 的大小,如表格的宽度是百分之50宽度

<w:tbl>
<w:tblPr>
<!-- 表格宽度是百分之50宽度 -->
<w:tblW w:w="2500" w:type="pct"/>
</w:tblPr>
<w:tblGrid/>
<w:tr>
<w:tc>
<w:p>
<w:r>
<w:t>Hello, World!</w:t>
</w:r>
</w:p>
</w:tc>

</w:tr>
</w:tbl>
English Metric Unit
这也是最常用的单位,使用 EMUs (English Metric Unit) 用来表示图片和其他元素的宽度,换算如下

1 in = 914400 EMUs
1 cm = 360000 EMUs
如用于 w:drawing 绘制,表示绘制画布的宽度 <wp:extent cx="1530350" cy="2142490"/> 用这么大的数是可以提高精度和性能,不需要通过浮点计算

 

cm->dxa: 72*20/2.54

 

 

double转int
 
一、 Convert.ToInt32和int强制转换
static void Main(string[] args)
{  
   double dbTmp = 234.44;
   int iTmp = Convert.ToInt32(dbTmp);
   int iTmp1 = (int)dbTmp;
   Console.WriteLine(iTmp1.ToString());
   Console.Read();
}
答案是一样的,都是234.
现在我们将数值变成234.54.现在就有个四舍五入的问题了,那下面的代码会得到什么数字呢?
static void Main(string[] args)
{  
   double dbTmp = 234.54;
   int iTmp = Convert.ToInt32(dbTmp);
   //int iTmp1 = (int)dbTmp;
   Console.WriteLine(iTmp.ToString());
}
答案是235.
如果改成用(int)强制转换呢?
static void Main(string[] args)
{  
   double dbTmp = 234.54;
   //int iTmp = Convert.ToInt32(dbTmp);
   int iTmp1 = (int)dbTmp;
   Console.WriteLine(iTmp1.ToString());
}
这次的答案是234,而不是四舍五入。
那么这两种转换方式的区别是什么呢?
1. (int)是类型转换,Convert.ToInt32是内容转换。
2. (int)是舍去转换,Convert.ToInt32是四舍五入。

string转int
现在我们变换下代码,如下:
static void Main(string[] args)
{  
   string strTmp = "234.94";            
   int iTmp = Int32.Parse(strTmp);          
   Console.WriteLine(iTmp.ToString());
}
会输出什么结果呢?234?不是,程序出错。
Input string was not in a correct format.

因为234.94不是一个int,而是一个double。这时候我们需要改用TryParse.
static void Main(string[] args)
{  
   string strTmp = "234.94";
   int iTmp = 0;
   if (Int32.TryParse(strTmp, out iTmp))
       Console.WriteLine(iTmp.ToString());
   else
       Console.WriteLine("invalid number.");
}
这时候程序就不会跳出异常了。输出invalid number。
posted @ 2021-06-30 20:47  unicornsir  阅读(397)  评论(0编辑  收藏  举报