以像素为单位获取excel单元格的大小

我试图以编程方式(C ++,但VBA解释是确定)以像素为单位获取Excel单元格的大小。 excel应用程序gui将单元格的大小显示为:
宽度: 8.28(160像素)高度: 24.6(41像素) ,字体是Arial 20 pt。

使用excel范围我可以得到:
ColumnWidth: 8.3 ,RowHeight: 24.6
范围宽度: 96 ,范围高度24.6

我尝试使用PointsToScreenPixelsX和PointsToScreenPixelsY的所有上述值,但他们返回的值不匹配的东西说gui( 396行/单元格的高度, 136列宽和224列宽度)。

有任何想法吗?

从点到像素的转换取决于您的DPI设置。 有72点到一英寸,所以如果你有96点,这是4/3英寸。 如果您的DPI(在显示属性中)是120,那么可以达到160像素。

换句话说, pixels = points * DPI / 72

但是,这不考虑放大。 Excel中的ActiveWindow.Zoom是一个百分比,所以例如200是正常大小的两倍。 请注意,用户界面仍然显示unzoomed像素。

执行理事会指出:

excel应用程序gui将单元格的大小显示为:

宽度: 8.28(160像素)高度: 24.6(41像素) ,字体是Arial 20 pt。

首先让我澄清一下: 应用程序gui不pipe字体大小,屏幕大小,缩放等,都会显示小数点和小数点的列宽和高度。对于这些因素中的任何一个,如果Excel列宽是8.43, 总是被定义为64个像素 。 其次,我有点困惑,因为我的版本的Excel(2010目前)和我以前的任何版本都记得8.43的标准列宽等于64 像素 ; 同样,15的标准行高度等于20 像素 ,这似乎不符合OP的例子。

确定后,一个海报问“为什么?” 一个原因:如果你调整列的宽度或行高,Excel允许在不连续的单位 ,不幸的是,他们决定命名像素 。 也许它们在某些早期版本中与像素有关,但是它们看起来和所使用的单位一样随机 – 8.43是什么,英寸,皮卡,? 不是缇,这是肯定的! 在这里,我将它称为一个十进制单位

无论如何,对于1.00以上的所有列宽,该离散像素单位是十进制单位的1/7。 奇怪的是,1.00以下的列宽被分成12个单位。 因此,到2.00十进制单位的离散宽度如下:

 0.08, 0.17, 0.25, 0.33, 0.42, 0.5, 0.58, 0.67, 0.75, 0.83, 0.92, 1.00, 1.14, 1.29, 1.43, 1.57, 1.71, 1.86, 2.00 

与2.00等于19个像素 。 是的,我会暂停而你摇头不敢相信,但他们是这样做的。

幸运的是,行高看起来更均匀,1 像素等于0.75十进制单位; 10 像素等于7.50; 20 像素的标准行高度等于15.00; 等等。 以防万一你需要在这些随机离散单元之间进行转换,这里有几个VBA函数可以这样做:

 Function ColumnWidthToPixels(ByVal ColWidth As Single) As Integer Select Case Round(ColWidth, 4) ' Adjust for floating point errors Case Is < 0: ColumnWidthToPixels = ColumnWidthToPixels(ActiveSheet.StandardWidth) Case Is < 1: ColumnWidthToPixels = Round(ColWidth * 12, 0) Case Is <= 255: ColumnWidthToPixels = Round(12 + ((Int(ColWidth) - 1) * 7) _ + Round((ColWidth - Int(ColWidth)) * 7, 0), 0) Case Else: ColumnWidthToPixels = ColumnWidthToPixels(ActiveSheet.StandardWidth) End Select End Function Function PixelsToColumnWidth(ByVal Pixels As Integer) As Single Select Case Pixels Case Is < 0: PixelsToColumnWidth = ActiveSheet.StandardWidth Case Is < 12: PixelsToColumnWidth = Round(Pixels / 12, 2) Case Is <= 1790: PixelsToColumnWidth = Round(1 + ((Pixels - 12) / 7), 2) Case Else: PixelsToColumnWidth = ActiveSheet.StandardWidth End Select End Function 

本示例确定活动窗口中所选单元格的高度和宽度(以像素为单位),并返回lWinWidth和lWinHeightvariables中的值。

 With ActiveWindow lWinWidth = PointsToScreenPixelsX(.Selection.Width) lWinHeight = PointsToScreenPixelsY(.Selection.Height) End With