【问题标题】:Get size of excel cell in pixels以像素为单位获取excel单元格的大小
【发布时间】:2011-05-06 21:26:05
【问题描述】:

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

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

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

有什么想法吗?

【问题讨论】:

标签: c++ excel vba


【解决方案1】:

从点到像素的转换取决于您的 DPI 设置。一英寸有 72 磅,所以如果你有 96 磅,那就是 4/3 英寸。如果您的 DPI(在显示属性中)为 120,则计算结果为 160 像素。

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

但是,这并没有考虑到缩放。 Excel 中的ActiveWindow.Zoom 是一个百分比,例如 200 是正常大小的两倍。请注意,UI 仍然显示未缩放的像素。

【讨论】:

    【解决方案2】:

    OP 声明:

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

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

    首先让我澄清一下:应用程序 gui 以十进制测量和像素测量显示列宽和高度,而不管字体大小、屏幕大小、缩放等。对于这些因素中的任何一个,如果 Excel 列宽为 8.43,它将始终定义为 64 像素。其次,我有点困惑,因为我的 Excel 版本(目前是 2010 年)和我记得的每个先前版本的标准列宽 8.43 等于 64 像素;同样,标准行高 15 等于 20 像素,这似乎与 OP 的示例不匹配。

    确定了这一点后,一位发帖人问“为什么?”一个原因:如果您正在调整列宽或行高,Excel 允许以离散单位 进行调整,不幸的是,他们决定将其命名为 像素。也许它们与某些早期版本中的像素有关,但它们似乎与使用的单位一样随机 - 8.43 是什么,英寸,皮卡,???不是twips,这是肯定的!在这里,我将其称为十进制单位

    无论如何,对于所有超过 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
    

    【讨论】:

    • 8.43 并不总是等于 64 像素。以像素为单位的宽度计算为8.43 * max(width(x) for x in '0123456789') + 5。 8.43 是适合单元格的字符宽度单位数。 character-width-unit 是工作表默认字体中数字字符的最大宽度。额外的 5 个像素是单元格填充。对于 Calibri 大小 11,字符宽度单位为 7 像素:7*8.43 + 5 = 64
    【解决方案3】:

    示例

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

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

    【讨论】:

    • 你能解释一下我得到的奇怪值吗? (这在我的帖子中有详细说明,我试图完全按照您的建议使用......)
    • +1。这对我有用,但只是大约。 :) 如果我开始一个新工作表并将宽度写入单元格 A1,使用默认的 Calibri 11 字体,单元格显示 108,Excel 的 UI 显示 109。如果我将字体大小增加到 20,单元格显示我 119 和UI 显示 124。我认为这涉及到字体字符填充和比例字体的内容......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    相关资源
    最近更新 更多