文档自动化处理
文档自动化处理是提高办公效率的重要手段,通过MudTools.OfficeInterop.Word库,我们可以实现文档的批量处理、格式转换、自动化工作流等功能。本章将详细介绍如何构建完整的文档自动化处理系统。
批量文档处理
批量文档处理可以同时对多个文档执行相同的操作,大大提高工作效率。
csharp
using MudTools.OfficeInterop;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
class BatchDocumentProcessor
{
public static void ProcessDocumentsInBatch(string inputDirectory, string outputDirectory,
string filePattern = "*.docx")
{
try
{
// 确保输出目录存在
if (!Directory.Exists(outputDirectory))
{
Directory.CreateDirectory(outputDirectory);
}
确保输出目录存在,如果不存在则创建。
csharp
// 获取所有匹配的文件
var files = Directory.GetFiles(inputDirectory, filePattern);
Console.WriteLine($"找到 {files.Length} 个文档需要处理");
int processedCount = 0;
int errorCount = 0;
获取指定目录下所有匹配模式的文件。
csharp
foreach (var file in files)
{
try
{
Console.WriteLine($"正在处理: {Path.GetFileName(file)}");
// 处理单个文档
ProcessSingleDocument(file, outputDirectory);
processedCount++;
Console.WriteLine($"处理完成: {Path.GetFileName(file)}");
}
catch (Exception ex)
{
errorCount++;
Console.WriteLine($"处理 {Path.GetFileName(file)} 时出错: {ex.Message}");
}
}
遍历所有文件并处理每个文档。
csharp
Console.WriteLine($"\n批量处理完成:");
Console.WriteLine($"成功处理: {processedCount} 个文档");
Console.WriteLine($"处理失败: {errorCount} 个文档");
Console.WriteLine($"总计处理: {files.Length} 个文档");
}
catch (Exception ex)
{
Console.WriteLine($"批量处理过程中出错: {ex.Message}");
}
}
输出处理结果统计。
csharp
private static void ProcessSingleDocument(string inputFilePath, string outputDirectory)
{
using var app = WordFactory.Open(inputFilePath);
var document = app.ActiveDocument;
// 执行文档处理操作
// 例如:标准化格式、更新字段、添加页眉页脚等
StandardizeDocumentFormat(document);
UpdateDocumentFields(document);
AddHeaderFooter(document);
处理单个文档,执行各种操作。
csharp
// 生成输出文件路径
var fileName = Path.GetFileNameWithoutExtension(inputFilePath);
var outputFilePath = Path.Combine(outputDirectory, $"{fileName}_processed.docx");
// 保存处理后的文档
document.SaveAs2(outputFilePath);
}
保存处理后的文档。
csharp
private static void StandardizeDocumentFormat(var document)
{
// 标准化字体
var range = document.Range();
range.Font.Name = "宋体";
range.Font.Size = 12;
// 标准化段落格式
foreach (var paragraph in document.Paragraphs)
{
paragraph.Format.LineSpacing = 1.5f; // 1.5倍行距
paragraph.Format.SpaceAfter = 12; // 段后间距
}
Console.WriteLine(" - 文档格式已标准化");
}
标准化文档格式。
csharp
private static void UpdateDocumentFields(var document)
{
// 更新所有字段
document.Range().Fields.Update();
Console.WriteLine(" - 文档字段已更新");
}
private static void AddHeaderFooter(var document)
{
// 添加页眉
var headerRange = document.Sections[1].Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
headerRange.Text = "公司文档";
headerRange.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
添加页眉内容。
csharp
// 添加页脚(包含页码)
var footerRange = document.Sections[1].Footers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
footerRange.Fields.Add(footerRange, WdFieldType.wdFieldPage);
footerRange.Text = " 第 页";
footerRange.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
Console.WriteLine(" - 页眉页脚已添加");
}
}
添加页脚内容。
文档转换
文档转换功能可以将文档从一种格式转换为另一种格式。
csharp
class DocumentConverter
{
public static void ConvertDocuments(string inputDirectory, string outputDirectory,
WdSaveFormat targetFormat, string filePattern = "*.doc")
{
try
{
// 确保输出目录存在
if (!Directory.Exists(outputDirectory))
{
Directory.CreateDirectory(outputDirectory);
}
确保输出目录存在。
csharp
// 获取所有匹配的文件
var files = Directory.GetFiles(inputDirectory, filePattern);
Console.WriteLine($"找到 {files.Length} 个文档需要转换");
int convertedCount = 0;
int errorCount = 0;
获取需要转换的文件列表。
csharp
foreach (var file in files)
{
try
{
Console.WriteLine($"正在转换: {Path.GetFileName(file)}");
// 转换单个文档
ConvertSingleDocument(file, outputDirectory, targetFormat);
convertedCount++;
Console.WriteLine($"转换完成: {Path.GetFileName(file)}");
}
catch (Exception ex)
{
errorCount++;
Console.WriteLine($"转换 {Path.GetFileName(file)} 时出错: {ex.Message}");
}
}
遍历并转换每个文档。
csharp
Console.WriteLine($"\n批量转换完成:");
Console.WriteLine($"成功转换: {convertedCount} 个文档");
Console.WriteLine($"转换失败: {errorCount} 个文档");
Console.WriteLine($"总计转换: {files.Length} 个文档");
}
catch (Exception ex)
{
Console.WriteLine($"批量转换过程中出错: {ex.Message}");
}
}
输出转换结果统计。
csharp
private static void ConvertSingleDocument(string inputFilePath, string outputDirectory,
WdSaveFormat targetFormat)
{
using var app = WordFactory.Open(inputFilePath);
var document = app.ActiveDocument;
// 生成输出文件路径
var fileName = Path.GetFileNameWithoutExtension(inputFilePath);
string extension = GetExtensionForFormat(targetFormat);
var outputFilePath = Path.Combine(outputDirectory, $"{fileName}{extension}");
生成输出文件路径。
csharp
// 保存为指定格式
document.SaveAs2(outputFilePath, targetFormat);
Console.WriteLine($" - 已转换为: {extension}");
}
保存为指定格式。
csharp
private static string GetExtensionForFormat(WdSaveFormat format)
{
return format switch
{
WdSaveFormat.wdFormatDocument => ".doc",
WdSaveFormat.wdFormatXMLDocument => ".xml",
WdSaveFormat.wdFormatPDF => ".pdf",
WdSaveFormat.wdFormatRTF => ".rtf",
WdSaveFormat.wdFormatFilteredHTML => ".htm",
WdSaveFormat.wdFormatHTML => ".html",
_ => ".docx"
};
}
根据格式获取文件扩展名。
csharp
// 特殊转换示例:Word到PDF
public static void ConvertToPdf(string inputDirectory, string outputDirectory)
{
ConvertDocuments(inputDirectory, outputDirectory, WdSaveFormat.wdFormatPDF, "*.docx");
}
// 特殊转换示例:Word到HTML
public static void ConvertToHtml(string inputDirectory, string outputDirectory)
{
ConvertDocuments(inputDirectory, outputDirectory, WdSaveFormat.wdFormatFilteredHTML, "*.docx");
}
}
提供特定格式转换方法。
自动化工作流
自动化工作流可以将多个文档处理步骤组合成一个完整的处理流程。
csharp
class DocumentAutomationWorkflow
{
public class WorkflowConfiguration
{
public bool StandardizeFormat { get; set; } = true;
public bool UpdateFields { get; set; } = true;
public bool AddHeaderFooter { get; set; } = true;
public bool ConvertToPdf { get; set; } = false;
public bool GenerateTableOfContents { get; set; } = false;
public string WatermarkText { get; set; } = null;
}
定义工作流配置类。
csharp
public static void ExecuteWorkflow(string inputDirectory, string outputDirectory,
WorkflowConfiguration config)
{
try
{
Console.WriteLine("=== 开始执行文档自动化工作流 ===");
// 确保输出目录存在
if (!Directory.Exists(outputDirectory))
{
Directory.CreateDirectory(outputDirectory);
}
执行自动化工作流。
csharp
// 获取所有Word文档
var docFiles = Directory.GetFiles(inputDirectory, "*.doc");
var docxFiles = Directory.GetFiles(inputDirectory, "*.docx");
var allFiles = docFiles.Concat(docxFiles).ToArray();
Console.WriteLine($"找到 {allFiles.Length} 个文档需要处理");
int processedCount = 0;
int errorCount = 0;
获取所有需要处理的文档。
csharp
foreach (var file in allFiles)
{
try
{
Console.WriteLine($"\n正在处理: {Path.GetFileName(file)}");
// 执行工作流
ExecuteSingleDocumentWorkflow(file, outputDirectory, config);
processedCount++;
Console.WriteLine($"处理完成: {Path.GetFileName(file)}");
}
catch (Exception ex)
{
errorCount++;
Console.WriteLine($"处理 {Path.GetFileName(file)} 时出错: {ex.Message}");
}
}
处理每个文档。
csharp
Console.WriteLine($"\n=== 工作流执行完成 ===");
Console.WriteLine($"成功处理: {processedCount} 个文档");
Console.WriteLine($"处理失败: {errorCount} 个文档");
Console.WriteLine($"总计处理: {allFiles.Length} 个文档");
}
catch (Exception ex)
{
Console.WriteLine($"工作流执行过程中出错: {ex.Message}");
}
}
输出工作流执行结果。
csharp
private static void ExecuteSingleDocumentWorkflow(string inputFilePath, string outputDirectory,
WorkflowConfiguration config)
{
using var app = WordFactory.Open(inputFilePath);
var document = app.ActiveDocument;
// 执行配置的处理步骤
if (config.StandardizeFormat)
{
StandardizeDocumentFormat(document);
}
根据配置执行处理步骤。
csharp
if (config.UpdateFields)
{
UpdateDocumentFields(document);
}
if (config.AddHeaderFooter)
{
AddHeaderFooter(document);
}
if (config.GenerateTableOfContents)
{
GenerateTableOfContents(document);
}
if (!string.IsNullOrEmpty(config.WatermarkText))
{
AddWatermark(document, config.WatermarkText);
}
执行各种配置的处理步骤。
csharp
// 生成输出文件路径
var fileName = Path.GetFileNameWithoutExtension(inputFilePath);
var outputFilePath = Path.Combine(outputDirectory, $"{fileName}_processed.docx");
// 保存处理后的Word文档
document.SaveAs2(outputFilePath);
Console.WriteLine(" - 已保存处理后的Word文档");
// 如果需要转换为PDF
if (config.ConvertToPdf)
{
var pdfOutputPath = Path.Combine(outputDirectory, $"{fileName}_processed.pdf");
document.SaveAs2(pdfOutputPath, WdSaveFormat.wdFormatPDF);
Console.WriteLine(" - 已转换为PDF格式");
}
}
保存处理结果并根据需要转换为PDF。
csharp
private static void StandardizeDocumentFormat(var document)
{
var range = document.Range();
range.Font.Name = "宋体";
range.Font.Size = 12;
foreach (var paragraph in document.Paragraphs)
{
paragraph.Format.LineSpacing = 1.5f;
paragraph.Format.SpaceAfter = 12;
}
Console.WriteLine(" - 已标准化文档格式");
}
标准化文档格式。
csharp
private static void UpdateDocumentFields(var document)
{
document.Range().Fields.Update();
Console.WriteLine(" - 已更新文档字段");
}
private static void AddHeaderFooter(var document)
{
var headerRange = document.Sections[1].Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
headerRange.Text = "公司文档";
headerRange.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
添加页眉页脚。
csharp
var footerRange = document.Sections[1].Footers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
footerRange.Fields.Add(footerRange, WdFieldType.wdFieldPage);
footerRange.Text = " 第 页";
footerRange.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
Console.WriteLine(" - 已添加页眉页脚");
}
csharp
private static void GenerateTableOfContents(var document)
{
// 查找目录位置(假设在文档开头)
var range = document.Range(0, 0);
range.Text = "目录\n";
range.Font.Bold = 1;
range.Font.Size = 16;
range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
range.Collapse(WdCollapseDirection.wdCollapseEnd);
生成目录。
csharp
// 插入目录
document.TablesOfContents.Add(range);
Console.WriteLine(" - 已生成目录");
}
private static void AddWatermark(var document, string watermarkText)
{
// 添加水印(简化实现)
var watermarkRange = document.Sections[1].Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
watermarkRange.Text = watermarkText;
watermarkRange.Font.Size = 48;
watermarkRange.Font.Color = WdColor.wdColorGray25;
watermarkRange.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
Console.WriteLine($" - 已添加水印: {watermarkText}");
}
}
添加水印。
实际应用示例
以下示例演示了完整的文档自动化处理系统:
csharp
class DocumentAutomationSystem
{
public static void RunDocumentAutomationDemo()
{
Console.WriteLine("=== 文档自动化处理系统演示 ===");
Console.WriteLine();
try
{
// 创建示例文档用于处理
CreateSampleDocuments();
运行文档自动化处理系统演示。
csharp
// 1. 批量文档处理演示
Console.WriteLine("1. 批量文档处理演示");
BatchDocumentProcessor.ProcessDocumentsInBatch(
@"C:\temp\SampleDocs\Input",
@"C:\temp\SampleDocs\Processed"
);
Console.WriteLine();
// 2. 文档转换演示
Console.WriteLine("2. 文档转换演示");
DocumentConverter.ConvertToPdf(
@"C:\temp\SampleDocs\Processed",
@"C:\temp\SampleDocs\PDF"
);
Console.WriteLine();
执行各种处理演示。
csharp
// 3. 自动化工作流演示
Console.WriteLine("3. 自动化工作流演示");
var workflowConfig = new DocumentAutomationWorkflow.WorkflowConfiguration
{
StandardizeFormat = true,
UpdateFields = true,
AddHeaderFooter = true,
GenerateTableOfContents = true,
ConvertToPdf = true,
WatermarkText = "机密文档"
};
DocumentAutomationWorkflow.ExecuteWorkflow(
@"C:\temp\SampleDocs\Input",
@"C:\temp\SampleDocs\WorkflowOutput",
workflowConfig
);
Console.WriteLine();
执行自动化工作流演示。
csharp
Console.WriteLine("文档自动化处理系统演示完成!");
Console.WriteLine("处理后的文档位于 C:\\temp\\SampleDocs 目录下");
}
catch (Exception ex)
{
Console.WriteLine($"系统演示过程中出错: {ex.Message}");
}
}
csharp
private static void CreateSampleDocuments()
{
string inputDir = @"C:\temp\SampleDocs\Input";
// 确保目录存在
if (!Directory.Exists(inputDir))
{
Directory.CreateDirectory(inputDir);
}
// 创建示例文档1
using (var app = WordFactory.BlankWorkbook())
{
var document = app.ActiveDocument;
document.Range().Text = "示例文档1\n\n这是第一个示例文档的内容。\n包含一些文本用于演示自动化处理。";
创建示例文档。
csharp
var titleRange = document.Range(0, 6);
titleRange.Font.Size = 16;
titleRange.Font.Bold = 1;
document.SaveAs2(Path.Combine(inputDir, "SampleDoc1.docx"));
}
// 创建示例文档2
using (var app = WordFactory.BlankWorkbook())
{
var document = app.ActiveDocument;
document.Range().Text = "示例文档2\n\n这是第二个示例文档的内容。\n也包含一些文本用于演示自动化处理。";
var titleRange = document.Range(0, 6);
titleRange.Font.Size = 16;
titleRange.Font.Bold = 1;
document.SaveAs2(Path.Combine(inputDir, "SampleDoc2.docx"));
}
创建多个示例文档。
csharp
Console.WriteLine("示例文档已创建");
}
public static void ShowAutomationBestPractices()
{
Console.WriteLine("=== 文档自动化处理最佳实践 ===");
Console.WriteLine();
Console.WriteLine("1. 错误处理:");
Console.WriteLine(" - 实现全面的异常处理机制");
Console.WriteLine(" - 记录详细的处理日志");
Console.WriteLine(" - 支持处理中断后恢复");
Console.WriteLine();
Console.WriteLine("2. 性能优化:");
Console.WriteLine(" - 合理使用COM对象生命周期管理");
Console.WriteLine(" - 批量处理时复用Word实例");
Console.WriteLine(" - 避免不必要的文档保存操作");
Console.WriteLine();
展示自动化处理最佳实践。
csharp
Console.WriteLine("3. 资源管理:");
Console.WriteLine(" - 正确释放COM对象资源");
Console.WriteLine(" - 控制并发处理数量");
Console.WriteLine(" - 监控内存使用情况");
Console.WriteLine();
Console.WriteLine("4. 质量保证:");
Console.WriteLine(" - 实现处理前后的文档验证");
Console.WriteLine(" - 支持处理结果的回滚机制");
Console.WriteLine(" - 提供处理进度反馈");
}
}
应用场景
- 企业文档管理:批量处理合同、报告等企业文档
- 教育机构:自动化处理试卷、成绩单等教育文档
- 政府部门:批量生成通知、公告等政务文档
- 律师事务所:标准化处理法律文书和合同模板
要点总结
- 批量文档处理可以显著提高工作效率
- 文档转换功能支持多种输出格式
- 自动化工作流可以组合多个处理步骤
- 系统应具备良好的错误处理和日志记录能力
- 需要注意COM资源管理和性能优化
掌握文档自动化处理技能对于构建高效办公系统非常重要,这些功能使开发者能够创建强大的文档处理解决方案。