C# 读取 PowerPoint(PPT 和 PPTX)文件内容详解

PowerPoint 文件是商业演示、教育培训中最常用的文档格式之一。作为开发者,我们常常需要从 PowerPoint 文件中提取内容进行进一步处理。本文将详细介绍如何使用 C# 读取 PPT/PPTX 文件,并提取其中的文本、表格、标题、批注、图片以及元数据等内容。

一、PowerPoint 文件解析的背景与挑战

PowerPoint 文件格式复杂,传统的 .ppt 是二进制格式,.pptx 则基于 Open XML 标准。幻灯片内容不仅包括文本框、表格、图片,还有嵌套的组合形状、批注等多种元素。

手动解析文件内部结构难度大,且容易出错。因此借助第三方类库成为首选。这些库能帮助快速定位、读取和导出 PPT 中的各种元素,大幅降低开发难度与成本。

二、工具选型

当前在 .NET 平台上常用于处理 PowerPoint 文件的类库包括:适用于 PPTX 格式的 Open XML SDK、依赖本地 Office 安装的 Microsoft Interop,以及支持 PPT 和 PPTX 的第三方库 Spire.Presentation 等。

本文使用的是 Spire.Presentation 库,因其支持 .ppt 和 .pptx,功能完善且不依赖 Office 环境。

三、环境准备

1. 创建项目

在 Visual Studio 创建一个控制台应用程序或其他类型项目,目标框架支持 .NET Framework,.NET Core等。

2. 安装 Spire.Presentation

在NuGet包管理器控制台中执行以下命令,完成安装:

Install-Package Spire.Presentation

安装完成后即可开始调用相关 API。

四、如何使用 C# 提取 PowerPoint PPT 或 PPTX 文件内容

PowerPoint 文件内容丰富,可包含形状、表格、图片、批注等多种元素。在实际开发中,常见的需求包括自动提取 PPT 形状中的文字、导出嵌入图片、提取表格数据用于分析,或获取文档元信息用于归档与管理等。

接下来,我们将使用 C# 逐一提取这些内容。

1. 读取幻灯片形状中的文本(支持组合形状)

PowerPoint 中的文本可能直接存在于普通形状中,也可能被存放在组合形状中。为完整提取所有文字内容,必须处理每个形状,包括组合形状内的子形状。

实现步骤:

  • 加载演示文稿。

  • 遍历所有幻灯片。

  • 对每个幻灯片中的形状进行递归检查:

    • 如果形状是组合形状(GroupShape),则继续遍历其子形状。

    • 如果是普通形状并包含文本内容,则提取并输出其文本内容。

实现代码:

using Spire.Presentation;
using System;

namespace ReadPPTExample
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 创建Presentation对象并加载文件
            var ppt = new Presentation();
            ppt.LoadFromFile("输入.pptx");

            Console.WriteLine("=== 形状文本(含组合形状) ===");

            // 遍历所有幻灯片和形状,提取文本
            foreach (ISlide slide in ppt.Slides)
                foreach (IShape shape in slide.Shapes)
                    ExtractText(shape);

            // 释放资源
            ppt.Dispose();
        }

        static void ExtractText(IShape shape)
        {
            // 如果是组合形状,递归遍历子形状
            if (shape is GroupShape group)
            {
                foreach (var child in group.Shapes)
                    ExtractText(child);
            }
            // 如果是普通带文本形状,输出文本段落
            else if (shape is IAutoShape autoShape && autoShape.TextFrame != null)
            {
                foreach (var para in autoShape.TextFrame.Paragraphs)
                    Console.WriteLine(para.Text);
            }
        }
    }
}

2. 读取表格数据

PowerPoint 支持在幻灯片中插入表格,用于展示结构化数据。要提取表格数据,需要遍历所有形状并找到表格,之后遍历表格的所有行和列,并提取每个单元格的内容。

实现步骤:

  • 加载 PowerPoint 文件。

  • 遍历每张幻灯片。

  • 遍历每张幻灯片中的形状集合。

  • 判断形状是否为 ITable 类型。

  • 遍历表格的所有行(TableRows)和列(ColumnsList)。

  • 提取每个单元格中的文本内容。

  • 输出表格内容,按幻灯片编号分组。

实现代码:

using Spire.Presentation;
using System;

namespace ReadTableData
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 创建演示文稿对象并加载PPTX文件
            var ppt = new Presentation();
            ppt.LoadFromFile("输入.pptx");

            Console.WriteLine("=== 表格数据 ===");

            // 遍历所有幻灯片
            foreach (ISlide slide in ppt.Slides)
            {
                // 遍历幻灯片中的所有形状
                foreach (IShape shape in slide.Shapes)
                {
                    // 判断形状是否为表格
                    if (shape is ITable table)
                    {
                        Console.WriteLine($"\n幻灯片 {slide.SlideNumber} 中的表格:");

                        // 遍历表格的所有行
                        for (int i = 0; i < table.TableRows.Count; i++)
                        {
                            // 遍历当前行的所有列
                            for (int j = 0; j < table.ColumnsList.Count; j++)
                            {
                                // 读取单元格文本,空则显示"(empty)"
                                string text = table[j, i].TextFrame?.Text ?? "(empty)";
                                Console.Write($"{text}\t");
                            }
                            Console.WriteLine();
                        }
                    }
                }
            }

            // 释放资源
            ppt.Dispose();
        }
    }
}

3. 读取幻灯片标题和副标题

PowerPoint 幻灯片中的标题和副标题通常以占位符的形式存在,用于标识每页的核心内容。通过识别占位符类型,我们可以提取幻灯片中的标题、居中标题和副标题文本。

实现步骤:

  • 加载PowerPoint文件。

  • 遍历每张幻灯片。

  • 遍历幻灯片中的每个形状,对于每个形状:

    • 判断是否为占位符。

    • 检查其类型是否为 TitleCenteredTitleSubtitle。若是,提取其中的文本。

  • 输出每页幻灯片对应的标题内容。

实现代码:

using Spire.Presentation;
using System;
using System.Collections.Generic;

namespace ReadSlideTitle
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 创建演示文稿对象并加载文件
            var ppt = new Presentation();
            ppt.LoadFromFile("输入.pptx");

            Console.WriteLine("=== 幻灯片标题 ===");

            int slideIndex = 1;

            // 遍历每张幻灯片
            foreach (ISlide slide in ppt.Slides)
            {
                var titleTexts = new List<string>();

                // 遍历幻灯片中的所有形状
                foreach (IShape shape in slide.Shapes)
                {
                    // 判断形状是否是占位符(Title、CenteredTitle、Subtitle)
                    if (shape.Placeholder != null)
                    {
                        switch (shape.Placeholder.Type)
                        {
                            case PlaceholderType.Title:
                            case PlaceholderType.CenteredTitle:
                            case PlaceholderType.Subtitle:
                                // 是带文本的普通形状且文本不为空时,添加到标题列表
                                if (shape is IAutoShape autoShape && 
                                    !string.IsNullOrWhiteSpace(autoShape.TextFrame?.Text))
                                {
                                    titleTexts.Add(autoShape.TextFrame.Text.Trim());
                                }
                                break;
                        }
                    }
                }

                // 输出当前幻灯片的标题文本
                if (titleTexts.Count > 0)
                {
                    Console.WriteLine($"幻灯片 {slideIndex} 标题:");
                    foreach (var text in titleTexts)
                        Console.WriteLine($"- {text}");
                }
                else
                {
                    Console.WriteLine($"幻灯片 {slideIndex} 无标题");
                }

                slideIndex++;
            }

            // 释放资源
            ppt.Dispose();
        }
    }
}

4. 提取幻灯片批注

PowerPoint 允许用户添加批注以提供反馈或建议。每条批注包含作者和批注等内容。通过遍历幻灯片批注集合,可批量提取所有批注信息。

实现步骤:

  • 加载 PowerPoint 文件。

  • 遍历每张幻灯片。

  • 遍历当前幻灯片的批注集合:

    • 获取并输出每个批注的作者和文本内容。

实现代码:

using Spire.Presentation;
using System;

namespace ReadComment
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 创建 Presentation 实例
            var ppt = new Presentation();

            // 加载 PowerPoint 文件
            ppt.LoadFromFile("输入.pptx");

            // 输出批注信息标题
            Console.WriteLine("=== 幻灯片批注 ===");

            // 幻灯片编号
            int slideIndex = 1;

            // 遍历每一张幻灯片
            foreach (ISlide slide in ppt.Slides)
            {
                // 遍历当前幻灯片的所有批注
                foreach (Comment comment in slide.Comments)
                {
                    // 输出当前幻灯片的批注内容(含作者)
                    Console.WriteLine($"Slide {slideIndex}: [{comment.AuthorName}] {comment.Text}");
                }

                // 幻灯片编号递增
                slideIndex++;
            }

            // 释放资源
            ppt.Dispose();
        }
    }
}

5. 导出幻灯片中的图片

演示文稿中常包含嵌入图片,如产品图、示意图等。可通过识别图片形状类型,将所有图片保存为本地文件,便于后续使用或归档。

实现步骤:

  • 加载 PowerPoint 文件。

  • 遍历幻灯片集合。

  • 遍历每张幻灯片中的形状。

  • 判断形状类型是否为 SlidePicture或PictureShape对象

  • 若为图片对象,获取图片并将其保存为本地文件(如 PNG、JPG 格式)。

实现代码:

using Spire.Presentation;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

namespace ExtractImages
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 创建 Presentation 对象
            var ppt = new Presentation();

            // 加载 PowerPoint 文件
            ppt.LoadFromFile("输入.pptx");

            // 创建用于保存图片的文件夹
            Directory.CreateDirectory("Slides");

            // 初始化幻灯片索引
            int slideIndex = 1;

            // 遍历每一页幻灯片
            foreach (ISlide slide in ppt.Slides)
            {
                // 每页图片编号从 1 开始
                int imageIndex = 1;

                // 遍历幻灯片中的所有形状
                foreach (IShape shape in slide.Shapes)
                {
                    // 声明用于保存图片的变量
                    Image image = null;

                    // 判断是否为 SlidePicture 类型(插入的图片)
                    if (shape is SlidePicture slidePic)
                    {
                        image = slidePic.PictureFill?.Picture?.EmbedImage?.Image;
                    }
                    // 判断是否为 PictureShape 类型(占位符或嵌入图片)
                    else if (shape is PictureShape picShape)
                    {
                        image = picShape.EmbedImage?.Image;
                    }

                    // 如果获取到了图片,保存为 PNG 文件
                    if (image != null)
                    {
                        string fileName = $"Slides/Slide{slideIndex}_Image{imageIndex}.png";
                        image.Save(fileName, ImageFormat.Png);
                        imageIndex++;
                    }
                }

                // 处理下一页幻灯片
                slideIndex++;
            }

            // 释放资源
            ppt.Dispose();
        }
    }
}

6. 读取演示文稿元数据

PPT 文件可包含文档属性,包括标题、作者、公司名称、创建时间等,这些信息可用于文件管理、索引或审计用途。

实现步骤:

  • 加载演示文稿。
  • 获取 DocumentProperty 属性对象。
  • 获取并输出常用的元数据字段,如标题、作者、公司等。

实现代码:

using Spire.Presentation;
using System;

namespace ReadMetadata
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 创建一个 Presentation 对象
            var ppt = new Presentation();

            // 加载 PowerPoint 文件
            ppt.LoadFromFile("输入.pptx");

            // 获取文档的属性信息(元数据)
            var prop = ppt.DocumentProperty;

            // 输出常见的元数据字段
            Console.WriteLine("=== 文档元数据 ===");
            Console.WriteLine($"标题: {prop.Title}");            // 文档标题
            Console.WriteLine($"作者: {prop.Author}");           // 文档作者
            Console.WriteLine($"公司: {prop.Company}");          // 所属公司
            Console.WriteLine($"创建时间: {prop.CreatedTime}");  // 创建时间
            Console.WriteLine($"修改时间: {prop.LastSavedTime}");// 最后保存时间

            // 释放资源
            ppt.Dispose();
        }
    }
}

五、总结

本文详细介绍了如何使用 C# 读取和提取 PowerPoint 文件中的文本、图片、表格、标题、批注和元数据等内容。如果需要处理更复杂的内容,比如图表、动画、嵌入对象,可访问 Spire.Presentation库的官方文档

本文完结。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值