2017-09-15 20 views
1

我创建一个XLSX与OpenXML的SDK文件和我指定一个自定义的列宽:自定义列宽VS MS Excel的

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的.xlsx”文件,并检查列的值,它表明:

宽度:14.29(105像素)

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

宽度:15(110个像素)

,然后阅读与OpenXML的SDK该值我得到〜15.711
问题是为什么,它为什么不同?

+0

我已阅读了关于这个在SO中的几个查询。这似乎是SDK中的一个错误。我还没有遇到这个问题的解决方案 – Zac

+0

你能给我发送一些这些查询的链接,以便我可以检查它们吗?我无法找到它们,我只能看到与定义列宽相关的帖子以及与自动贴合相关的帖子。另外,我不确定这是SDK中的错误还是MS Excel中的错误,因为内部XLSX文件的值存储在(15)内,但MS Excel显示该值稍微增加(〜15.711) 。所以如果有的话,对我来说这似乎是MS Excel中的一个错误。 – NixonUposseen

回答

1

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

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

1

这是陈志远的书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; 

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