【问题标题】:How to AutoFit excel column using OpenXML Package如何使用 OpenXML 包自动调整 excel 列
【发布时间】:2015-07-03 01:12:36
【问题描述】:

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

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();

【问题讨论】:

    标签: c# asp.net excel visual-studio-2012 openxml


    【解决方案1】:

    自动调整逻辑是由 Microsoft Excel 实现的,不是 OpenXML 电子表格格式的一部分。自动调整涉及测量每个单元格中值的宽度(或高度)并找到最大值。

    为了在您自己的代码中实现自动调整,您必须手动测量文本;您可以使用带有适当格式标志的TextRenderer.MeasureTextGraphics.MeasureString(禁用前缀字符)。这将为您提供以像素为单位的大小,您需要将其转换为 Excel 的复杂列宽单位。这个公式是:

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

    摘自这篇文章:Column Class (DocumentFormat.OpenXml.Spreadsheet)

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

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

    Microsoft Excel 呈现文本的方式存在细微差别(与 GDI/GDI+ 的呈现方式相比),因此这种方法并非 100% 准确 - 但对于大多数用途来说已经足够了,您可以随时添加一些额外的填充确保合身。

    【讨论】:

    • Truncate 究竟做了什么,为什么需要它?
    • @Emaborsa Truncate 丢弃数字的小数部分,有效地将其向下舍入到最接近的整数。这是必需的,因为像素表示为整数。
    • 好的,但是Column.Width 属性需要double(我认为是点数)而不是像素的int...
    • 对不起,我上一条评论有误; Column.Width 属性以 Excel 的列宽单位(不是像素或点)测量。所以使用Truncate 函数纯粹是因为微软决定在除以 256 之前丢弃结果的小数部分 - 也许这是出于精度原因?无论如何,这对最终的数字没有太大的影响。
    • @Prakash Gupta 看看我的answer。发布的代码采用 DOM 方法,但我也使用 SAX 方法创建了一个解决方案,结果非常出色 - 没有内存消耗(直接从 DataReader 写入)并且比 Interop 库快得多。唯一的缺点是 Autofit - 你必须读取相同的数据两次。
    猜你喜欢
    • 1970-01-01
    • 2012-01-26
    • 2016-01-21
    • 1970-01-01
    • 2018-02-02
    • 2018-08-16
    • 2022-10-05
    • 2021-08-25
    • 1970-01-01
    相关资源
    最近更新 更多