在OpenXML和MS Excel中自定义列宽

我正在用OpenXML SDK创build一个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
问题是为什么,它为什么不同?

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

关于由JimSnyder提供的公式,请注意MS Excel有一个略有不同的列宽度计算比由标准指定的,请看这里 。

这是来自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; 

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