使用 C# 在 Excel 中应用多种字体样式

在日常开发中,Excel 报表导出、数据模板生成等场景常需要通过字体样式区分标题、表头、数据行与重点内容。不同的字体、字号、颜色和字形能够显著提升表格的可读性。本文将基于 Spire.XLS for .NET 库,介绍如何通过 C# 代码为 Excel 单元格灵活应用多种字体效果。

一、开发环境准备

在开始编写代码前,需要先在项目中引入对应的类库。可以通过 NuGet 包管理器搜索并安装 Spire.XLS,或在程序包管理器控制台执行命令:

复制代码
Install-Package Spire.XLS

该库支持.NET Framework、.NET 5+等多种平台,安装完成后即可直接引用命名空间进行开发。

二、核心字体属性说明

在 Excel 操作中,字体样式主要包含以下可配置项,对应库中 ExcelFont 对象的属性:

  • 字体名称FontName,支持宋体、微软雅黑、Arial等系统已安装字体
  • 字号大小Size,单位为磅
  • 字体颜色Color,支持 RGB 颜色设置
  • 字形效果IsBold(加粗)、IsItalic(斜体)、Underline(下划线)
  • 特殊效果IsStrikethrough(删除线)、IsSuperscript(上标)、IsSubscript(下标)

三、常见字体应用场景实现

3.1 单个单元格基础字体设置

这是最基础的用法,适用于设置表格标题、单个重点单元格等场景。通过CellRange.Style.Font属性即可配置字体样式。

csharp 复制代码
using Spire.Xls;

class Program
{
    static void Main(string[] args)
    {
        // 创建工作簿
        Workbook workbook = new Workbook();
        Worksheet sheet = workbook.Worksheets[0];

        // 设置A1单元格内容
        sheet.Range["A1"].Text = "销售数据统计表";
        
        // 配置字体样式
        CellStyle style = sheet.Range["A1"].Style;
        style.Font.FontName = "微软雅黑";
        style.Font.Size = 16;
        style.Font.IsBold = true;
        style.Font.Color = System.Drawing.Color.DarkBlue;
        
        // 保存文件
        workbook.SaveToFile("基础字体设置.xlsx", ExcelVersion.Version2016);
    }
}

3.2 为不同单元格区域设置差异化字体

实际报表中,表头、数据行、汇总行通常使用不同字体风格。可以通过指定单元格范围,批量设置区域内的字体样式。

csharp 复制代码
// 设置表头区域字体(A2:D2)
CellRange headerRange = sheet.Range["A2:D2"];
headerRange.Style.Font.FontName = "微软雅黑";
headerRange.Style.Font.Size = 12;
headerRange.Style.Font.IsBold = true;
headerRange.Style.Font.Color = System.Drawing.Color.White;
// 配合背景色增强区分度
headerRange.Style.Color = System.Drawing.Color.SteelBlue;

// 设置数据区域字体(A3:D6)
CellRange dataRange = sheet.Range["A3:D6"];
dataRange.Style.Font.FontName = "Arial";
dataRange.Style.Font.Size = 11;

// 设置汇总行字体(A7:D7)
CellRange totalRange = sheet.Range["A7:D7"];
totalRange.Style.Font.FontName = "微软雅黑";
totalRange.Style.Font.Size = 12;
totalRange.Style.Font.IsBold = true;
totalRange.Style.Font.Color = System.Drawing.Color.DarkRed;

3.3 同一单元格内混合多种字体

当需要在一个单元格内突出部分文字时,例如"金额:1200元"这类组合文本,可以使用富文本(RichText)功能,为同一单元格内的不同字符段设置独立字体。

csharp 复制代码
// 设置单元格文本
sheet.Range["A9"].Text = "备注:本月销售额同比增长15%,达成季度目标";

// 获取富文本对象
RichText richText = sheet.Range["A9"].RichText;

// 使用 CreateFont 创建字体对象
ExcelFont fontNormal = workbook.CreateFont();
fontNormal.FontName = "微软雅黑";
fontNormal.Size = 11;
fontNormal.IsBold = false;
fontNormal.Color = Color.Black;

ExcelFont fontRed = workbook.CreateFont();
fontRed.FontName = "微软雅黑";
fontRed.Size = 11;
fontRed.IsBold = true;
fontRed.Color = Color.Red;

ExcelFont fontItalic = workbook.CreateFont();
fontItalic.FontName = "微软雅黑";
fontItalic.Size = 11;
fontItalic.IsItalic = true;
fontItalic.Color = Color.Green;

// 先整体应用默认字体(可选,避免漏掉未覆盖部分)
richText.SetFont(0, 22, fontNormal);  // 全部设为普通

// 局部覆盖
richText.SetFont(0, 3, fontNormal);          // "备注:"(索引0~2)
richText.SetFont(12, 3, fontRed);            // "15%"(索引12~14)
richText.SetFont(16, 6, fontItalic);         // "达成季度目标"(索引16~21)

SetFont方法的两个参数分别为起始字符索引和结束字符索引,索引从0开始计数。

3.4 行与列级别的批量字体设置

对于整行或整列的统一样式,可以直接对行或列对象设置字体,无需逐个单元格遍历。

csharp 复制代码
// 设置第1行整体字体
sheet.Rows[0].Style.Font.FontName = "微软雅黑";
sheet.Rows[0].Style.Font.Size = 14;

// 设置第3列整体字体
sheet.Columns[2].Style.Font.FontName = "Arial Narrow";
sheet.Columns[2].Style.Font.Size = 10;

四、完整示例代码

以下是一个包含多种字体效果的完整示例,可直接运行查看效果:

csharp 复制代码
using Spire.Xls;
using System.Drawing;

namespace ExcelFontDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            using (Workbook workbook = new Workbook())
            {
                Worksheet sheet = workbook.Worksheets[0];
                sheet.Name = "销售报表";

                // 1. 标题
                sheet.Range["A1"].Text = "2024年Q2产品销售统计表";
                sheet.Range["A1:D1"].Merge();
                sheet.Range["A1"].Style.Font.FontName = "微软雅黑";
                sheet.Range["A1"].Style.Font.Size = 18;
                sheet.Range["A1"].Style.Font.IsBold = true;
                sheet.Range["A1"].Style.Font.Color = Color.DarkSlateGray;
                sheet.Range["A1"].HorizontalAlignment = HorizontalAlignType.Center;
                sheet.SetRowHeight(1, 25);

                // 2. 表头
                string[] headers = { "产品名称", "销售数量", "单价(元)", "销售额(元)" };
                for (int i = 0; i < headers.Length; i++)
                {
                    sheet.Range[2, i + 1].Text = headers[i];
                }
                sheet.Range["A2:D2"].Style.Font.FontName = "微软雅黑";
                sheet.Range["A2:D2"].Style.Font.Size = 12;
                sheet.Range["A2:D2"].Style.Font.IsBold = true;
                sheet.Range["A2:D2"].Style.Font.Color = Color.White;
                sheet.Range["A2:D2"].Style.Color = Color.Teal;

                // 3. 数据区域(使用 InsertArray)
                object[,] data = {
                    { "产品A", 120, 89.9, 10788 },
                    { "产品B", 256, 45.5, 11648 },
                    { "产品C", 89, 199.0, 17711 }
                };
                sheet.InsertArray(data, 3, 1);
                sheet.Range["A3:D5"].Style.Font.FontName = "Arial";
                sheet.Range["A3:D5"].Style.Font.Size = 11;

                // 4. 汇总行
                sheet.Range["A6"].Text = "合计";
                sheet.Range["D6"].Formula = "=SUM(D3:D5)";
                sheet.Range["A6:D6"].Style.Font.FontName = "微软雅黑";
                sheet.Range["A6:D6"].Style.Font.Size = 12;
                sheet.Range["A6:D6"].Style.Font.IsBold = true;
                sheet.Range["A6:D6"].Style.Font.Color = Color.DarkRed;

                // 5. 备注(富文本)
                string remark = "注:标红数据为超额完成项,本季度目标完成率112%";
                sheet.Range["A8"].Text = remark;
                RichText richText = sheet.Range["A8"].RichText;

                // 用 CreateFont 创建字体
                ExcelFont fontGray = workbook.CreateFont();
                fontGray.FontName = "微软雅黑";
                fontGray.Size = 10;
                fontGray.Color = Color.Gray;

                ExcelFont fontRed = workbook.CreateFont();
                fontRed.FontName = "微软雅黑";
                fontRed.Size = 10;
                fontRed.Color = Color.Red;
                fontRed.IsBold = true;

                ExcelFont fontGreen = workbook.CreateFont();
                fontGreen.FontName = "微软雅黑";
                fontGreen.Size = 10;
                fontGreen.Color = Color.Green;
                fontGreen.IsBold = true;

                // 先整体灰色,再局部覆盖
                richText.SetFont(0, remark.Length, fontGray);
                richText.SetFont(2, 3, fontRed);      // "标红数"
                richText.SetFont(17, 5, fontGreen);   // "完成率"

                // 自动列宽
                sheet.AllocatedRange.AutoFitColumns();

                // 保存
                workbook.SaveToFile("Excel多字体示例.xlsx", ExcelVersion.Version2016);
            }
        }
    }
}

通过以上方法,可以灵活地在 Excel 中实现各类字体样式需求,满足报表美化、数据分层展示等多种业务场景。核心思路是通过单元格范围对象获取样式属性,再对字体对象进行配置,理解这一逻辑后即可举一反三实现更多样式效果。

相关推荐
Java编程爱好者1 小时前
放弃 Spring AI?这 3 个开源框架,才是让 SpringBoot 玩转 AI Agent 的正解
后端
二月龙1 小时前
伪类与伪元素深度解析:before/after 实用案例
后端
码事漫谈2 小时前
时序数据库2026盘点:国产数据库如何以“融合多模”走出差异化之路?
前端·后端
浮游本尊2 小时前
Java学习第42天 - Spring 事务传播、隔离级别、锁机制与并发一致性
后端
道友可好2 小时前
让 AI 自己验收,等于让学生自己批卷
前端·人工智能·后端
鱼人2 小时前
响应式三巨头:rem / vw / em 深度对比,移动端到底该选谁?
后端
小强19882 小时前
Grid 网格布局实战:快速实现复杂网页排版
后端
胡志辉2 小时前
深入浅出 call、apply、bind
前端·javascript·后端
长大19882 小时前
Flex 布局完整教程:告别浮动,拥抱万能弹性布局
后端