c# - 如何以编程方式 (C#) 为 Excel 单元格设置精确大小(以厘米为单位)?

标签 c# excel

我打算从 C# 向 Excel 写入一些信息。我使用的代码是:

var oXL = new Microsoft.Office.Interop.Excel.Application();
oXL.Visible = false;
var oWB = (Microsoft.Office.Interop.Excel._Workbook)(oXL.Workbooks.Add(""));
var oSheet = (Microsoft.Office.Interop.Excel._Worksheet)oWB.ActiveSheet;
oSheet.Columns.ColumnWidth = 5;
oSheet.Rows.RowHeight = 5; 
oSheet.Cells[1, 1] = "Smith";
...

问题是我需要为所有单元格设置一个以厘米 (5) 为单位的精确大小。 ColumnWidth 属性接收点数而不是厘米数。在各种文章中我发现 1 point = 0.035cm,意思是 1cm = 28.57p,但是当我为 ColumnWidthRowHeight 传递 5*28.57 时,设置了 Excel 的列到 28.58 厘米,行设置为 5.04 厘米。

我该如何解决这个问题?

谢谢,

最佳答案

Excel 中的列宽是以“字符”而不是“点”指定的。默认列宽为 8.37“字符”,1 个字符是用于在 Excel 中显示普通文本的默认字体的第 1 个字符的宽度。

为了以 cm 为单位指定列宽,您需要先使用以下函数将 cm 转换为点:

double x = xl.Application.CentimetersToPoints(5);

然后用一个循环将列宽重复减小0.1点,直到与点数(x)相匹配。 (对于宽度大于'x'点的列)

while(ws.Columns.ColumnWidth - 0.1 > points)
{
    ws.Columns.ColumnWidth = ws.Columns.ColumnWidth - 0.1;
}

然后使用另一个循环将列宽重复增加 0.1 点,直到与点数 (x) 匹配。 (对于宽度小于'x'点的列)

while(ws.Columns.ColumnWidth + 0.1 < points)
{
    ws.Columns.ColumnWidth = ws.Columns.ColumnWidth + 0.1;
}

由于循环,上述方法需要几秒钟才能执行。但是,它实现了解决方案(以厘米为单位设置列宽)。

注意:在上面的代码中, xl : Excel 应用程序对象 ws : 工作表对象

关于c# - 如何以编程方式 (C#) 为 Excel 单元格设置精确大小(以厘米为单位)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40396185/

相关文章:

excel - 递归 VBA 函数未正确返回

c# - Assembly.Load 用于不在 deps.json 文件中的程序集

c# - 使用 Nest 字段提升的查询不会从 Elasticsearch 返回任何结果

c# - 如何告诉 Range.NumberFormat 按原样放置数据?

excel - 无法使用 Selenium VBA 在 Chrome 中循环 Excel 数据

VBA:范围方法失败

c# - 将 TCP 客户端从 c# 转换为 nodejs

c# - 如何检测 WCF 服务关闭或与客户端断开连接?

c# - ASP.NET核心: Making service asynchronous

vba - Excel:固定按钮位置