OpenXML 与 MS 中的自定义列宽 Excel
Custom column width in OpenXML vs MS Excel
我正在使用 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" 文件并检查列的值时,它显示:
Width: 14.29 (105 pixels)
此外,当我使用 MS Excel 设置列的值时:
Width: 15 (110 pixels)
然后使用 OpenXML SDK 读取该值,我得到 ~15.711。
问题是为什么,为什么不一样?
这来自 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;
公式应该会给出您需要的宽度。至于为什么不同,我最好的猜测是将字体点转换为 window 像素。
差异可能是由于 MS Excel 计算列宽(它在加载和更改时这样做)时考虑的几个变量造成的; Normal风格的字体设置,机器的DPI设置,MSExcel的标尺单位等
关于 JimSnyder 提供的公式,请注意 MS Excel 的列宽计算与标准指定的略有不同,请参见 here。
我正在使用 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" 文件并检查列的值时,它显示:
Width: 14.29 (105 pixels)
此外,当我使用 MS Excel 设置列的值时:
Width: 15 (110 pixels)
然后使用 OpenXML SDK 读取该值,我得到 ~15.711。
问题是为什么,为什么不一样?
这来自 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;
公式应该会给出您需要的宽度。至于为什么不同,我最好的猜测是将字体点转换为 window 像素。
差异可能是由于 MS Excel 计算列宽(它在加载和更改时这样做)时考虑的几个变量造成的; Normal风格的字体设置,机器的DPI设置,MSExcel的标尺单位等
关于 JimSnyder 提供的公式,请注意 MS Excel 的列宽计算与标准指定的略有不同,请参见 here。