excel计算行高

复制代码
// 获取 Excel 表格对象
Excel.Worksheet worksheet = workbook.Worksheets[1];

// 循环遍历表格中的每一行
for (int row = 1; row <= worksheet.UsedRange.Rows.Count; row++)
{
    // 获取当前行的高度
    double currentHeight = worksheet.Rows[row].Height;

    // 循环遍历当前行中的每个单元格
    for (int column = 1; column <= worksheet.UsedRange.Columns.Count; column++)
    {
        Excel.Range cell = worksheet.Cells[row, column] as Excel.Range;

        // 计算单元格中文本的行数
        int numberOfLines = 1;
        string[] lines = cell.Text.Split('\n');
        foreach (string line in lines)
        {
            numberOfLines += (int)Math.Ceiling((double)line.Length / (double)cell.Characters().Count());
        }

        // 计算单元格内容所需的高度
        double neededHeight = numberOfLines * cell.Font.Size;

        // 如果单元格内容所需的高度大于当前行的高度,则调整当前行的高度
        if (neededHeight > currentHeight)
        {
            worksheet.Rows[row].RowHeight = neededHeight;
        }
    }
}
复制代码

 

测试

Range cell = (Range)worksheet.Cells[row, column];
cell.WrapText = true;
int numLinesNeeded = (cell.Value.ToString().Length / 80) + 1; // 每行设置80个字符
cell.RowHeight = numLinesNeeded * 14; // 14是每行高度

 

在Excel中,一个单元格的宽度单位是一个字符宽度(通常称为"em"),默认情况下,一个字符宽度被设置为大约是11个像素(像素大小可以在Excel选项中调整)。因此,Excel中一个28宽的列可以容纳大约28个英文字符或14个中文字符(中文字符通常比英文字符更宽)。

要根据内容和列宽计算所需行数,您需要将内容分成适合单元格的段落,并根据段落计算所需行数。您可以使用C#中的 TextRenderer.MeasureText 方法来计算每个段落所需的行数,然后将所有段落所需的行数加起来以获取单元格的总行数。下面是一个示例代码

 

复制代码
using System.Drawing;

// 假设文本内容存储在一个字符串变量 text 中,列宽为28
int width = 28;
int totalRows = 0;
string[] paragraphs = text.Split(new[] { Environment.NewLine }, StringSplitOptions.None);

foreach (string paragraph in paragraphs)
{
    int lines = (int)Math.Ceiling((double)TextRenderer.MeasureText(paragraph, SystemFonts.DefaultFont).Width / width);
    totalRows += lines;
}

// 现在totalRows变量包含了所有段落所需的行数,可以将其用于设置单元格的行高或合并单元格
复制代码

 

确实,字符宽度不同会导致字符数量不同,从而影响最终的行数。如果需要更准确地计算文本占用的行数,可以使用Graphics.MeasureString()方法来测量文本的尺寸。该方法可以根据指定的字体和大小,计算出文本所占的像素尺寸,然后再将其转换为行数。

以下是一个示例代码,用于计算文本在指定列宽下所占的行数:

复制代码
using System.Drawing;

// 计算指定文本在指定列宽下所占的行数
public static int GetRowCount(string text, int columnWidth, Font font)
{
    Graphics g = Graphics.FromImage(new Bitmap(1, 1)); // 创建一个虚拟图像
    SizeF textSize = g.MeasureString(text, font, columnWidth);
    int rowCount = (int)Math.Ceiling(textSize.Height / font.Height); // 向上取整
    return rowCount;
}
复制代码
Excel.Range currentRange = (Excel.Range)excelWorksheet.Cells[1, 1];
string fontName = currentRange.Font.Name;
double fontSize = currentRange.Font.Size;
Excel.Range currentRange = (Excel.Range)excelWorksheet.Cells[1, 1];
string fontName = currentRange.Font.Name;
double fontSize = currentRange.Font.Size;

 

posted @   彭二狗的牵引绳  阅读(461)  评论(1编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示