2017-09-15 15 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; 

公式應該給你你所需要的寬度。至於爲什麼它不同,我最好的猜測是將字體點轉換爲窗口像素。