计算高度/宽度和ySplit / xSplit for Open XML电子表格

时间:2011-01-02 07:20:07

标签: xml excel-2007

设置:打开Excel 2007,将第一列的宽度设置为15.0(110 px),将第一行的高度设置为30.0(40 px),将第一个单元格中的窗口窗格分成四个,然后保存文件。

使用Open XML SDK 2.0 Productivity Tool打开文件时,列宽为“15.7109375”,高度为“30”,但xSplit值为“2040”,ySplit值为“795”。

有人可以解释如何将“15.0”转换为“110 px”至“15.7109375 width”至“2040 xSplit”作为列,将“30.0”改为“40 px”至“30 ht”转换为“795 ySplit” “对于行?

如何计算这些数字并从一个​​转换为另一个?

1 个答案:

答案 0 :(得分:1)

我最近不得不在一个开源项目中解决这个问题,所以我想我会在这里发布一个答案来帮助遇到同样问题的其他人。

内部色谱柱宽度的计算记录在ECMA-376第1部分和elsewhere中。

内部行高与Excel界面中显示的高度相同。

拆分窗格xSplit和ySplit尺寸是棘手的。我没有找到任何关于它们如何计算的具体文档,除了它们以1/20的单位为单位。这些计算我从xlsx文件中提取的插值数据和xls文件格式中使用的类似计算中推导出来。

以下是Perl中演示计算的示例:

#!/usr/bin/perl -l

use warnings;
use strict;

my $width  = 15;
my $height = 30;

print "Column width in characters = ", calculate_column_width( $width );
print "Column width for xSplit    = ", calculate_x_split_width( $width ), "\n";

print "Row height in characters  = ", $height;
print "Row height for ySplit     = ", calculate_y_split_height( $height );


#
# Convert column width from user units to character width.
#
sub calculate_column_width {

    my $width = shift;

    my $max_digit_width = 7;    # For Calabri 11.
    my $padding         = 5;

    $width = ( $width * $max_digit_width + $padding ) / $max_digit_width;
    $width = int( $width * 256 ) / 256;

    return $width;
}


#
# Convert column width from user units to pane split width.
#
sub calculate_x_split_width {

    my $width = shift;

    my $max_digit_width = 7;    # For Calabri 11.
    my $padding         = 5;
    my $pixels;

    # Convert to pixels.
    if ( $width < 1 ) {
        $pixels = int( $width * 12 + 0.5 );
    }
    else {
        $pixels = int( $width * $max_digit_width + 0.5 ) + $padding;
    }

    # Convert to points.
    my $points = $pixels * 3 / 4;

    # Convert to twips (twentieths of a point).
    my $twips = $points * 20;

    # Add offset/padding.
    $width = $twips + 390;

    return $width;
}


#
# Convert row height from user units to pane split height.
#
sub calculate_y_split_height {

    my $height = shift;

    $height = int( 20 * $height + 300 );

    return $height;
}

__END__

这个输出是:

Column width in characters = 15.7109375
Column width for xSplit    = 2040

Row height in characters  = 30
Row height for ySplit     = 900

请注意,ySplit值与您问题中的值不同。但它确实与我尝试过的几个样本xlsx文件中提取的值相关联。也许,您的示例文件使用了不同的默认字体高度。