Word 文档(.doc 和 .docx)是企业和个人办公中最常用的文件格式,广泛应用于合同、报告、手册、技术文档和教育资料。在 C# 开发中,开发者经常需要以编程方式读取 Word 文件内容,例如提取文本用于搜索和分析、获取表格和图片进行数据处理,或抽取批注和文档元数据用于审计、归档和报表生成。
本文将详细介绍如何使用 C# 与 Spire.Doc for .NET 库读取 Word 文档,涵盖文档加载、全文本提取、段落及格式信息获取、表格与图片提取、批注和文档元数据访问,以及页眉和页脚内容读取的完整方法和示例。通过这些方法,开发者可以高效实现 Word 文档内容的自动化处理、数据抽取和信息管理。
目录
环境准备与库安装
在开始之前,需要准备好 C# 开发环境(如 Visual Studio)并安装 Spire.Doc for .NET 库。Spire.Doc for .NET是一个功能完善的 .NET Word文档处理库,支持读取和操作 Word .doc 与 .docx 文件,且无需依赖 Microsoft Word。
使用 Spire.Doc,开发者可以:
安装方法
在 Package Manager Console 中运行以下命令即可从 NuGet 安装 Spire.Doc:
PM> Install-Package Spire.Doc
安装完成后,即可在 C# 项目中调用 Spire.Doc 的 API 解析 Word 文档内容。
使用 C# 加载 Word 文档
要读取 Word 文档,首先需要将文件加载到 Document 对象中。Document 类是 Spire.Doc 的核心类,表示一个 Word 文档实例,提供访问和操作文档内容的入口。
以下示例展示了如何使用 C# 加载一个 .docx 或 .doc 文档:
using Spire.Doc;
using Spire.Doc.Documents;
using System;
namespace LoadWordExample
{
class Program
{
static void Main(string[] args)
{
// 指定 Word 文档的路径
string filePath = @"C:\Documents\示例.docx";
// 创建 Document 对象
using (Document document = new Document())
{
// 加载 Word .docx 或 .doc 文档
document.LoadFromFile(filePath);
}
}
}
}
使用 C# 读取 Word 文档内容
将 Word 文档加载到 Document 对象后,可以访问文档中的各种内容。根据需求,可以选择全文提取、按段落提取、表格或图片提取等不同方式,以满足全文搜索、版式保留、数据分析或文档迁移的需求。
提取全部文本
当目标是全文索引或快速分析时,可以使用 Document.GetText() 方法将 Word 文档中所有文本内容提取为纯文本。此方法保留段落换行,但忽略格式信息、图片或表格结构,适合全文搜索、简单文本统计和分析等场景。
以下示例展示了如何提取Word文档中的所有文本内容:
using (StreamWriter writer = new StreamWriter("提取文本.txt", false, Encoding.UTF8))
{
// 从文档中获取所有文本
string allText = document.GetText();
// 将完整的文本写入到文件中
writer.Write(allText);
}
读取段落及格式信息
按段落读取可以获取文档的逻辑结构:段落文本、段落样式(如对齐方式、行间距/段间距)、甚至文本级别的字体样式。适用于需要保留版式信息的场景,例如将 Word 内容导出到自定义渲染器、或根据段落格式作条件处理(如只抽取标题段落)。
以下示例展示了如何按段落读取Word文档并获取段落格式如对齐方式、段后间距:
using (StreamWriter writer = new StreamWriter("按段落读取.txt", false, Encoding.UTF8))
{
// 遍历文档中的所有节
foreach (Section section in document.Sections)
{
// 遍历该节中的所有段落
foreach (Paragraph paragraph in section.Paragraphs)
{
// 获取段落的对齐方式
HorizontalAlignment alignment = paragraph.Format.HorizontalAlignment;
// 获取段落后的间距
float afterSpacing = paragraph.Format.AfterSpacing;
// 将段落的格式信息和文本写入文件
writer.WriteLine($"[对齐方式: {alignment}, 段后间距: {afterSpacing}]");
writer.WriteLine(paragraph.Text);
writer.WriteLine(); // 在段落之间添加一个空行
}
}
}
提取图片
Word 文档中的图片通常用于图表、说明或者合同签章。在Spire.Doc中,图片由DocPicture对象表示。开发者可查找文档中的 DocPicture 对象,并将其保存为独立的图片文件(支持JPG、PNG等多种格式)。
// 如果文件夹不存在,则创建文件夹
string imageFolder = "提取图片";
if (!Directory.Exists(imageFolder))
Directory.CreateDirectory(imageFolder);
int imageIndex = 0;
// 遍历节和段落以查找图片
foreach (Section section in document.Sections)
{
foreach (Paragraph paragraph in section.Paragraphs)
{
foreach (DocumentObject obj in paragraph.ChildObjects)
{
if (obj is DocPicture picture)
{
// 将每张图片保存为单独的 PNG 文件
string fileName = Path.Combine(imageFolder, $"图_{imageIndex}.png");
picture.Image.Save(fileName, System.Drawing.Imaging.ImageFormat.Png);
imageIndex++;
}
}
}
}
提取表格数据
Word 文档中的表格通常用于展示高度结构化的数据,例如财务报表、统计分析表或问卷调查结果。在程序化处理文档时,开发者常常需要提取表格中的文本内容,用于生成报表、导入数据库或进行进一步的数据分析。
使用 Spire.Doc,开发者可以在处理每个表格时,按行(TableRow)和单元格(TableCell)依次提取表格内容,从而保留表格的逻辑结构,便于将数据导出为 CSV、文本或其他可分析的格式,实现对 Word 表格内容的高效处理与自动化应用。
下面的示例展示了如何提取 Word 文档中的所有表格数据,并将每个表格数据保存为独立的文本文件:
// 创建用于存放表格的文件夹
string tableDir = "表格";
if (!Directory.Exists(tableDir))
Directory.CreateDirectory(tableDir);
// 遍历每个节
for (int sectionIndex = 0; sectionIndex < document.Sections.Count; sectionIndex++)
{
Section section = document.Sections[sectionIndex];
TableCollection tables = section.Tables;
// 遍历该节中的所有表格
for (int tableIndex = 0; tableIndex < tables.Count; tableIndex++)
{
ITable table = tables[tableIndex];
string fileName = Path.Combine(tableDir, $"Section{sectionIndex + 1}_Table{tableIndex + 1}.txt");
using (StreamWriter writer = new StreamWriter(fileName, false, Encoding.UTF8))
{
// 遍历每一行
for (int rowIndex = 0; rowIndex < table.Rows.Count; rowIndex++)
{
TableRow row = table.Rows[rowIndex];
// 遍历每个单元格
for (int cellIndex = 0; cellIndex < row.Cells.Count; cellIndex++)
{
TableCell cell = row.Cells[cellIndex];
// 遍历单元格中的每个段落
for (int paraIndex = 0; paraIndex < cell.Paragraphs.Count; paraIndex++)
{
writer.Write(cell.Paragraphs[paraIndex].Text.Trim() + " ");
}
// 单元格之间添加制表符
if (cellIndex < row.Cells.Count - 1) writer.Write("\t");
}
// 每行结束后换行
writer.WriteLine();
}
}
}
}
如需将Word表格数据导出为Excel表格进行进一步数据分析,可参考教程:C# 从 Word 文档中提取表格。
读取批注
批注(评论)是团队协作时记录反馈的常用方式。程序化读取批注便于审计、迁移评论或生成审阅报告。
Document 对象提供 Comments 集合,可访问 Word 文档中的所有批注。每条批注可能包含多个段落,开发者可以提取每个段落的文本进行进一步处理或保存到文件中。
using (StreamWriter writer = new StreamWriter("批注.txt", false, Encoding.UTF8))
{
// 遍历文档中的所有批注
foreach (Comment comment in document.Comments)
{
// 遍历批注中的每个段落
foreach (Paragraph p in comment.Body.Paragraphs)
{
writer.WriteLine(p.Text);
}
// 添加空行以区分不同的批注
writer.WriteLine();
}
}
获取文档元数据
文档元数据(如标题、作者、主题、关键字)对文档管理、检索与归档非常重要。这些元数据可以通过 Document 对象的 BuiltinDocumentProperties 属性访问。
using (StreamWriter writer = new StreamWriter("文档元数据.txt", false, Encoding.UTF8))
{
// 将内置文档属性写入文件
writer.WriteLine("标题: " + document.BuiltinDocumentProperties.Title);
writer.WriteLine("作者: " + document.BuiltinDocumentProperties.Author);
writer.WriteLine("主题: " + document.BuiltinDocumentProperties.Subject);
}
读取页眉和页脚
页眉和页脚是 Word 文档中常见的版式元素,通常用于显示文档标题、章节名称、作者信息或版权声明。在自动化处理文档时,读取页眉和页脚的内容可以帮助开发者生成完整的文档摘要、制作自定义报告,或者在文档迁移与分析中保留页面结构信息。
使用 Spire.Doc,开发者可以通过 Section.HeadersFooters.Header 或 Section.HeadersFooters.Footer 属性访问每个节的页眉或页脚,然后遍历其中的段落来获取文本内容。
下面的示例展示了如何将文档中每个节的页眉和页脚内容提取到文本文件中:
using (StreamWriter writer = new StreamWriter("页眉页脚.txt", false, Encoding.UTF8))
{
// 遍历文档中的所有节
foreach (Section section in document.Sections)
{
// 写入页眉段落
foreach (Paragraph headerParagraph in section.HeadersFooters.Header.Paragraphs)
{
writer.WriteLine("页眉: " + headerParagraph.Text);
}
// 写入页脚段落
foreach (Paragraph footerParagraph in section.HeadersFooters.Footer.Paragraphs)
{
writer.WriteLine("页脚: " + footerParagraph.Text);
}
}
}
C# 读取 Word 文档实用技巧
在实际项目中,读取 Word 文档还需要注意以下几点:
- 使用 using 语句:始终将 Document 对象包装在 using 语句中,以确保正确的内存管理。
- 数据清理:提取的文本可能包含空行或段落,可在使用前做二次处理。
- 批量读取多个文档:如需处理多个Word文档,可将文档放在文件夹中。然后遍历文件夹,对每个文件应用相同的提取逻辑。
总结
通过本文的方法,开发者可以使用 C# 高效读取 Word 文档中的各种内容,包括文本、段落及格式信息、表格、图片、批注、文档元数据,以及页眉页脚。借助 Spire.Doc for .NET,内容提取不仅高效,还能保证数据完整与准确。无论是进行文档分析、生成报表、迁移数据,还是在项目中自动化处理 Word 文件,这些方法都能为开发者提供可靠且实用的解决方案。
常见问题解答
Q1: 读取 Word 文档是否需要安装 Microsoft Word?
不需要。Spire.Doc 是独立库,运行环境无需安装 Office。
Q2: 是否可以只提取 Word 文档中的部分内容?
可以。开发者可按段落、表格、节甚至页面进行选择性读取。
Q3: 提取图片时是否会损失质量?
不会。Spire.Doc 提供原始图片数据提取,保证清晰度不受影响。
Q4: 是否支持读取加密的 Word 文档?
支持。只需在加载文档时传入密码即可正常读取内容。