OpenXML与MS Excel中的自定义列宽

时间:2017-09-15 10:19:42

标签: c# excel openxml openxml-sdk

我正在使用OpenXML SDK创建一个XLSX文件,并且我将自定义列宽指定为 15

using (SpreadsheetDocument spreadsheet = SpreadsheetDocument.Create("Book1.xlsx", SpreadsheetDocumentType.Workbook))
{
    WorkbookPart workbookPart = spreadsheet.AddWorkbookPart();
    workbookPart.Workbook = new Workbook();

    WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
    worksheetPart.Worksheet = new Worksheet();

    spreadsheet.WorkbookPart.Workbook.AppendChild<Sheets>(
        new Sheets(
            new Sheet() { Id = spreadsheet.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet1" }));

    worksheetPart.Worksheet.Append(
        new Columns(
            new Column() { Min = 1, Max = 1, Width = 15, CustomWidth = true }),
        new SheetData());

    workbookPart.Workbook.Save();
}

但是当我在MS Excel中打开生成的“Book1.xlsx”文件并检查列的值时,它会显示:

  

宽度:14.29(105像素)

此外,当我使用MS Excel设置列的值时:

  

宽度:15(110像素)

然后使用OpenXML SDK读取该值我得到 ~15.711 问题是为什么,为什么会有所不同?

2 个答案:

答案 0 :(得分:2)

由于在MS Excel计算列宽时考虑了几个变量(在加载和更改时这样做),可能会出现差异;正常样式的字体设置,机器的DPI设置,MS Excel的标尺单位等。

关于JimSnyder提供的公式,请注意MS Excel的列宽计算与标准指定的列宽略有不同,请参阅here

答案 1 :(得分:1)

这是来自Vincent Tan的书 SpreadsheetOpenXmlFromScratch

// This is taken from the documentation for Column.Width in help file for Open XML SDK
// Truncate([{Number of Characters} * {Maximum Digit Width} + {5 pixel padding}] / {Maximum Digit Width} * 256) / 256
fTruncWidth = Math.Truncate((sILT.ToCharArray().Count() * fMaxDigitWidth + 5.0) / fMaxDigitWidth * 256.0) / 256.0;

公式应该为您提供所需的宽度。至于为什么它不同,我最好的猜测是将字体点转换为窗口像素。