如何使用OpenXML包自动调整excel列

生成Excel电子表格的代码使用openxml包。 请任何人告诉如何自动适应其列宽。

OpenXmlPackage.SpreadsheetDocument spreadsheetDocument = OpenXmlPackage.SpreadsheetDocument.Create(downloadFilePath, OpenXml.SpreadsheetDocumentType.Workbook); // Add a WorkbookPart to the document. OpenXmlPackage.WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart(); // Add a WorksheetPart to the WorkbookPart. workbookpart.Workbook = new OpenXmlSpreadsheet.Workbook(); int numDates = datesObject.Length; // Add Sheets to the Workbook. OpenXmlSpreadsheet.Sheets sheets = new OpenXmlSpreadsheet.Sheets(); OpenXml.UInt32Value sheetId = 1; OpenXmlPackage.WorksheetPart firstWorksheetPart = workbookpart.AddNewPart<OpenXmlPackage.WorksheetPart>(); firstWorksheetPart.Worksheet = new OpenXmlSpreadsheet.Worksheet(new OpenXmlSpreadsheet.SheetData()); // Append a new worksheet and associate it with the workbook. OpenXmlSpreadsheet.Sheet firstSheet = new OpenXmlSpreadsheet.Sheet() { Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(firstWorksheetPart), SheetId = sheetId, Name = "Summary" }; sheets.Append(firstSheet); sheetId++; OpenXmlSpreadsheet.SheetData firstSheetData = firstWorksheetPart.Worksheet.GetFirstChild<OpenXmlSpreadsheet.SheetData>(); DataTable summaryTable = new DataTable(); summaryTable.Clear(); summaryTable.Columns.Add("name"); summaryTable.Columns.Add("value"); DataRow _summaryInfo = summaryTable.NewRow(); _summaryInfo["name"] = "Clinic Name"; _summaryInfo["value"] = userInfo[0]; summaryTable.Rows.Add(_summaryInfo); int firstRowCount = summaryTable.Rows.Count; for (int rowNumber = 1; rowNumber <= firstRowCount; rowNumber++) { DataRow dataRow = summaryTable.Rows[rowNumber - 1]; OpenXmlSpreadsheet.Row contentRow = ExcelHandler.createContentRow(dataRow, rowNumber); firstSheetData.AppendChild(contentRow); } firstWorksheetPart.Worksheet.Save(); 

自适应逻辑是由Microsoft Excel实现的,而不是OpenXML电子表格格式的一部分。 自适应包括测量每个单元格中的值的宽度(或高度)并find最大值。

为了在自己的代码中实现自适应,您将不得不手动测量文本; 您可以使用TextRenderer.MeasureTextGraphics.MeasureString与适当的格式标志(禁用前缀字符)。 这将给你一个像素的大小,你将需要转换为Excel的复杂的列宽度单位。 这个公式是:

宽度=截断([{字符数量} * {最大数字宽度} + {5像素填充}] / {最大数字宽度} * 256)/ 256

采取从这篇文章: 列类(DocumentFormat.OpenXml.Spreadsheet)

(最大数字宽度可以通过使用工作簿的默认字体测量'0'字符的宽度来确定 – 告诉您这是错综复杂的!)

使用此公式获得单元格宽度后,可以find最大值并将其应用于Column.Width属性。

Microsoft Excel呈现文本的方式(与GDI / GDI +相比)有细微差别,所以这种方法不是100%准确的 – 但对于大多数目的而言,这是足够的,您可以随时添加一些额外的填充以确保正确适合。