最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.NET實(shí)現(xiàn)基于規(guī)則自動(dòng)生成及排版Word文檔

 更新時(shí)間:2025年10月10日 10:00:31   作者:mudtools  
在現(xiàn)代辦公環(huán)境中,自動(dòng)化文檔生成和排版已經(jīng)成為提高工作效率的重要手段,本文將詳細(xì)介紹如何使用這個(gè)庫(kù)來實(shí)現(xiàn)自動(dòng)生成合同條款、自動(dòng)排版、創(chuàng)建嵌套表格、生成文檔大綱和目錄等功能,希望對(duì)大家有所幫助

在現(xiàn)代辦公環(huán)境中,自動(dòng)化文檔生成和排版已經(jīng)成為提高工作效率的重要手段。MudTools.OfficeInterop.Word 是一個(gè)強(qiáng)大的 .NET 庫(kù),它封裝了 Microsoft Word 的 COM 組件,讓開發(fā)者能夠以面向?qū)ο蟮姆绞捷p松操作 Word 文檔。本文將詳細(xì)介紹如何使用這個(gè)庫(kù)來實(shí)現(xiàn)自動(dòng)生成合同條款、自動(dòng)排版、創(chuàng)建嵌套表格、生成文檔大綱和目錄等功能。

簡(jiǎn)介

MudTools.OfficeInterop 是一個(gè)針對(duì) Microsoft Office 應(yīng)用程序(Excel、Word、PowerPoint、VBE)的 .NET 封裝庫(kù),旨在簡(jiǎn)化對(duì) Office COM 組件的操作。它提供現(xiàn)代化、面向?qū)ο蟮?API 接口,使得開發(fā)者可以更輕松地處理 Office 文檔。其中 Word 模塊專門用于操作 Microsoft Word 應(yīng)用程序,提供了完整的 Word 文檔操作接口。

環(huán)境準(zhǔn)備

在開始使用 MudTools.OfficeInterop.Word 之前,需要確保具備以下環(huán)境:

  • Windows 操作系統(tǒng)(因依賴 Office COM)
  • Microsoft Office 或 WPS Office 安裝(2007 或更高版本)
  • .NET SDK(.NET Framework 4.6.2+ 或 .NET Standard 2.1 或 .NET 6.0-windows 及以上)

通過 NuGet 安裝所需的包:

<PackageReference Include="MudTools.OfficeInterop.Word" Version="1.1.9" />

MudTools.OfficeInterop.Word 采用了工廠模式設(shè)計(jì),通過 WordFactory 類來創(chuàng)建和操作 Word 應(yīng)用程序?qū)嵗?。這種方式使得開發(fā)者可以以統(tǒng)一的方式創(chuàng)建不同類型的文檔,而無需關(guān)心底層的 COM 對(duì)象創(chuàng)建細(xì)節(jié)。

創(chuàng)建 Word 應(yīng)用程序?qū)嵗?/h2>

MudTools.OfficeInterop.Word 提供了 WordFactory 類來創(chuàng)建和操作 Word 應(yīng)用程序?qū)嵗?。WordFactory 提供了以下方法:

  • BlankWorkbook() - 創(chuàng)建新的空白 Word 文檔
  • CreateFrom(string templatePath) - 基于模板創(chuàng)建新的 Word 文檔
  • Open(string filePath) - 打開現(xiàn)有的 Word 文檔文件

下面是一個(gè)簡(jiǎn)單的示例,展示如何創(chuàng)建一個(gè)空白 Word 文檔:

using MudTools.OfficeInterop;

// 創(chuàng)建 Word 應(yīng)用程序?qū)嵗?
using var app = WordFactory.BlankWorkbook();
app.Visible = true;

var document = app.ActiveDocument;

使用 using 語句可以確保 Word 應(yīng)用程序?qū)嵗谑褂猛戤吅蟊徽_釋放,避免出現(xiàn)內(nèi)存泄漏等問題。通過設(shè)置 app.Visible = true,可以在操作過程中查看 Word 應(yīng)用程序的界面,便于調(diào)試和演示。

自動(dòng)生成合同條款

在業(yè)務(wù)場(chǎng)景中,我們經(jīng)常需要根據(jù)預(yù)設(shè)的模板和數(shù)據(jù)自動(dòng)生成合同條款。MudTools.OfficeInterop.Word 提供了強(qiáng)大的功能來實(shí)現(xiàn)這一點(diǎn)。通過基于規(guī)則的生成方式,我們可以更加靈活地創(chuàng)建各種類型的合同。

基于規(guī)則的合同條款生成

基于規(guī)則的合同條款生成是指通過定義一套規(guī)則和模板,系統(tǒng)可以根據(jù)輸入的數(shù)據(jù)自動(dòng)選擇和生成相應(yīng)的合同條款。這種方法可以大大提高合同生成的效率和一致性。

這種方法的核心思想是將合同條款的結(jié)構(gòu)和內(nèi)容與具體的業(yè)務(wù)數(shù)據(jù)分離。通過定義規(guī)則模板,我們可以創(chuàng)建一個(gè)靈活的系統(tǒng),能夠適應(yīng)不同類型的合同需求,而無需修改代碼。這種方式特別適用于需要大量生成標(biāo)準(zhǔn)化合同的場(chǎng)景,如人力資源部門的勞動(dòng)合同、法務(wù)部門的各種業(yè)務(wù)合同等。

首先,我們需要定義合同條款的規(guī)則和模板:

{
  "contractRules": {
    "serviceContract": {
      "title": "服務(wù)合同",
      "clauses": [
        {
          "id": "clause1",
          "title": "服務(wù)內(nèi)容",
          "template": "甲方委托乙方提供{service_type}服務(wù),具體包括:{service_details}。",
          "requiredFields": ["service_type", "service_details"]
        },
        {
          "id": "clause2",
          "title": "服務(wù)期限",
          "template": "本合同服務(wù)期限為{duration},自{start_date}起至{end_date}止。",
          "requiredFields": ["duration", "start_date", "end_date"]
        },
        {
          "id": "clause3",
          "title": "服務(wù)費(fèi)用",
          "template": "本合同總金額為人民幣{amount}元(大寫:{amount_capital})。",
          "requiredFields": ["amount", "amount_capital"]
        }
      ]
    },
    "employmentContract": {
      "title": "勞動(dòng)合同",
      "clauses": [
        {
          "id": "clause1",
          "title": "工作內(nèi)容",
          "template": "甲方聘用乙方在{department}部門擔(dān)任{position}職務(wù),工作內(nèi)容包括:{responsibilities}。",
          "requiredFields": ["department", "position", "responsibilities"]
        },
        {
          "id": "clause2",
          "title": "工作時(shí)間和休假",
          "template": "乙方每日工作{hours_per_day}小時(shí),每周工作{days_per_week}天。按照國(guó)家規(guī)定享受帶薪年假。",
          "requiredFields": ["hours_per_day", "days_per_week"]
        },
        {
          "id": "clause3",
          "title": "薪酬待遇",
          "template": "甲方每月支付乙方基本工資人民幣{base_salary}元,績(jī)效獎(jiǎng)金根據(jù)考核結(jié)果發(fā)放。",
          "requiredFields": ["base_salary"]
        }
      ]
    }
  }
}

在上述配置中,我們定義了兩種類型的合同規(guī)則:服務(wù)合同和勞動(dòng)合同。每種合同類型都包含若干條款,每個(gè)條款都有一個(gè)模板和必需字段列表。通過這種方式,我們可以靈活地定義各種合同類型及其條款。

實(shí)現(xiàn)基于規(guī)則的合同生成器

using MudTools.OfficeInterop;
using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;

// 合同條款定義
public class ContractClause
{
    public string Id { get; set; }
    public string Title { get; set; }
    public string Template { get; set; }
    public List<string> RequiredFields { get; set; }
}

// 合同規(guī)則定義
public class ContractRule
{
    public string Title { get; set; }
    public List<ContractClause> Clauses { get; set; }
}

// 合同規(guī)則配置
public class ContractRulesConfig
{
    public Dictionary<string, ContractRule> ContractRules { get; set; }
}

// 合同數(shù)據(jù)
public class ContractData
{
    public string ContractType { get; set; }
    public Dictionary<string, string> Fields { get; set; }
    public string PartyA { get; set; }
    public string PartyB { get; set; }
    public DateTime SignDate { get; set; }
}

class RuleBasedContractGenerator
{
    public static void GenerateContractFromRules(string rulesConfigPath, ContractData contractData)
    {
        try
        {
            // 加載規(guī)則配置
            var rulesConfig = LoadRulesConfig(rulesConfigPath);
            
            // 創(chuàng)建 Word 文檔
            using var app = WordFactory.BlankWorkbook();
            app.Visible = true;
            var document = app.ActiveDocument;
            
            // 設(shè)置文檔屬性
            document.Title = $"{rulesConfig.ContractRules[contractData.ContractType].Title}";
            
            // 添加合同標(biāo)題
            AddContractTitle(document, rulesConfig.ContractRules[contractData.ContractType].Title);
            
            // 添加合同雙方信息
            AddPartiesInfo(document, contractData.PartyA, contractData.PartyB, contractData.SignDate);
            
            // 根據(jù)規(guī)則生成合同條款
            GenerateClauses(document, rulesConfig.ContractRules[contractData.ContractType], contractData.Fields);
            
            // 添加簽名部分
            AddSignatureSection(document, contractData.PartyA, contractData.PartyB, contractData.SignDate);
            
            // 保存文檔
            document.SaveAs($@"C:\contracts\{contractData.ContractType}_{DateTime.Now:yyyyMMddHHmmss}.docx");
            
            Console.WriteLine("合同已根據(jù)規(guī)則成功生成");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"生成合同時(shí)出錯(cuò): {ex.Message}");
        }
    }
    
    private static ContractRulesConfig LoadRulesConfig(string configPath)
    {
        try
        {
            var json = File.ReadAllText(configPath);
            return JsonConvert.DeserializeObject<ContractRulesConfig>(json);
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException($"讀取規(guī)則配置文件失敗: {ex.Message}", ex);
        }
    }
    
    private static void AddContractTitle(IWordDocument document, string title)
    {
        var range = document.Range();
        range.Text = $"{title}\n";
        range.Font.Name = "微軟雅黑";
        range.Font.Size = 18;
        range.Font.Bold = 1;
        range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
        range.ParagraphFormat.SpaceAfter = 24;
    }
    
    private static void AddPartiesInfo(IWordDocument document, string partyA, string partyB, DateTime signDate)
    {
        var range = document.Range(document.Content.End - 1, document.Content.End - 1);
        range.Text = $"甲方:{partyA}\n乙方:{partyB}\n簽訂日期:{signDate:yyyy年MM月dd日}\n\n";
        range.Font.Name = "宋體";
        range.Font.Size = 12;
        range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphLeft;
        range.ParagraphFormat.SpaceAfter = 12;
    }
    
    private static void GenerateClauses(IWordDocument document, ContractRule contractRule, Dictionary<string, string> fields)
    {
        foreach (var clause in contractRule.Clauses)
        {
            // 檢查必需字段是否存在
            if (!CheckRequiredFields(clause, fields))
            {
                throw new InvalidOperationException($"條款 '{clause.Title}' 缺少必需字段");
            }
            
            // 生成條款編號(hào)和標(biāo)題
            AddClauseHeader(document, clause.Id, clause.Title);
            
            // 根據(jù)模板生成條款內(nèi)容
            var clauseContent = GenerateClauseContent(clause.Template, fields);
            AddClauseContent(document, clauseContent);
        }
    }
    
    private static bool CheckRequiredFields(ContractClause clause, Dictionary<string, string> fields)
    {
        foreach (var requiredField in clause.RequiredFields)
        {
            if (!fields.ContainsKey(requiredField) || string.IsNullOrEmpty(fields[requiredField]))
            {
                return false;
            }
        }
        return true;
    }
    
    private static string GenerateClauseContent(string template, Dictionary<string, string> fields)
    {
        var content = template;
        foreach (var field in fields)
        {
            content = content.Replace($"{{{field.Key}}}", field.Value);
        }
        return content;
    }
    
    private static void AddClauseHeader(IWordDocument document, string clauseId, string clauseTitle)
    {
        var range = document.Range(document.Content.End - 1, document.Content.End - 1);
        range.Text = $"{clauseId} {clauseTitle}\n";
        range.Font.Bold = 1;
        range.Font.Size = 12;
        range.ParagraphFormat.SpaceAfter = 6;
    }
    
    private static void AddClauseContent(IWordDocument document, string content)
    {
        var range = document.Range(document.Content.End - 1, document.Content.End - 1);
        range.Text = $"{content}\n\n";
        range.Font.Bold = 0;
        range.Font.Size = 12;
        range.ParagraphFormat.SpaceAfter = 12;
    }
    
    private static void AddSignatureSection(IWordDocument document, string partyA, string partyB, DateTime signDate)
    {
        // 添加簽名標(biāo)題
        var signTitleRange = document.Range(document.Content.End - 1, document.Content.End - 1);
        signTitleRange.Text = "\n(以下無正文)\n\n甲方(蓋章):\t\t\t\t\t乙方(蓋章):\n";
        signTitleRange.Font.Bold = 1;
        
        // 添加簽名線
        var signLineRange = document.Range(document.Content.End - 1, document.Content.End - 1);
        signLineRange.Text = "法定代表人或授權(quán)代表:\t\t\t\t法定代表人或授權(quán)代表:\n";
        
        // 添加日期行
        var dateRange = document.Range(document.Content.End - 1, document.Content.End - 1);
        dateRange.Text = $"簽訂日期:{signDate:yyyy年MM月dd日}\t\t\t\t簽訂日期:{signDate:yyyy年MM月dd日}\n";
    }
}

使用示例

示例1:生成服務(wù)合同

class ServiceContractExample
{
    public static void GenerateServiceContract()
    {
        var contractData = new ContractData
        {
            ContractType = "serviceContract",
            PartyA = "ABC科技有限公司",
            PartyB = "XYZ集團(tuán)",
            SignDate = DateTime.Now,
            Fields = new Dictionary<string, string>
            {
                ["service_type"] = "軟件開發(fā)",
                ["service_details"] = "企業(yè)資源管理系統(tǒng)開發(fā)、部署和維護(hù)",
                ["duration"] = "90天",
                ["start_date"] = DateTime.Now.ToString("yyyy年MM月dd日"),
                ["end_date"] = DateTime.Now.AddDays(90).ToString("yyyy年MM月dd日"),
                ["amount"] = "500,000.00",
                ["amount_capital"] = "伍拾萬元整"
            }
        };
        
        RuleBasedContractGenerator.GenerateContractFromRules(@"C:\config\contractRules.json", contractData);
    }
}

示例2:生成勞動(dòng)合同

class EmploymentContractExample
{
    public static void GenerateEmploymentContract()
    {
        var contractData = new ContractData
        {
            ContractType = "employmentContract",
            PartyA = "ABC科技有限公司",
            PartyB = "張三",
            SignDate = DateTime.Now,
            Fields = new Dictionary<string, string>
            {
                ["department"] = "技術(shù)部",
                ["position"] = "高級(jí)軟件工程師",
                ["responsibilities"] = "負(fù)責(zé)系統(tǒng)架構(gòu)設(shè)計(jì)、核心代碼編寫和技術(shù)團(tuán)隊(duì)管理",
                ["hours_per_day"] = "8",
                ["days_per_week"] = "5",
                ["base_salary"] = "25,000.00"
            }
        };
        
        RuleBasedContractGenerator.GenerateContractFromRules(@"C:\config\contractRules.json", contractData);
    }
}

高級(jí)功能擴(kuò)展

基于規(guī)則的合同生成系統(tǒng)還可以進(jìn)一步擴(kuò)展,以支持更復(fù)雜的業(yè)務(wù)需求:

  • 條件條款:根據(jù)特定條件選擇不同的條款模板
  • 條款依賴:某些條款的出現(xiàn)依賴于其他條款的選擇
  • 動(dòng)態(tài)計(jì)算:自動(dòng)計(jì)算金額、日期等字段
  • 版本控制:管理不同版本的合同模板和規(guī)則
// 擴(kuò)展示例:支持條件條款
public class ConditionalContractClause
{
    public string Id { get; set; }
    public string Title { get; set; }
    public string Template { get; set; }
    public List<string> RequiredFields { get; set; }
    public string ConditionField { get; set; }  // 條件字段
    public List<string> ConditionValues { get; set; }  // 條件值
}

// 擴(kuò)展示例:支持動(dòng)態(tài)計(jì)算
public class CalculatedField
{
    public string FieldName { get; set; }
    public string CalculationRule { get; set; }  // 計(jì)算規(guī)則,如"amount * 0.1"
}

通過基于規(guī)則的合同條款生成系統(tǒng),我們可以:

  • 提高效率:自動(dòng)生成合同,減少人工編寫時(shí)間
  • 保證一致性:使用標(biāo)準(zhǔn)化的條款模板,確保合同條款的一致性
  • 降低錯(cuò)誤率:減少手工輸入錯(cuò)誤
  • 靈活配置:通過修改規(guī)則配置適應(yīng)不同的合同類型
  • 易于維護(hù):條款模板和業(yè)務(wù)規(guī)則分離,便于維護(hù)和更新

這種方法特別適用于需要大量生成標(biāo)準(zhǔn)化合同的場(chǎng)景,如人力資源部門的勞動(dòng)合同、法務(wù)部門的各種業(yè)務(wù)合同等。

自動(dòng)文檔排版

MudTools.OfficeInterop.Word 提供了豐富的格式化功能,可以實(shí)現(xiàn)自動(dòng)文檔排版。我們可以通過從JSON配置文件中讀取預(yù)設(shè)的格式信息,然后應(yīng)用到文檔中。

文檔排版是文檔自動(dòng)化中的一個(gè)重要環(huán)節(jié)。良好的排版不僅能夠提升文檔的專業(yè)性,還能增強(qiáng)讀者的閱讀體驗(yàn)。通過將排版規(guī)則外部化,我們可以實(shí)現(xiàn)排版樣式與代碼的分離,使得排版調(diào)整變得更加靈活和可維護(hù)。

從JSON配置文件讀取格式設(shè)置

首先,我們需要定義一個(gè)JSON配置文件來存儲(chǔ)文檔格式設(shè)置:

{
  "documentStyles": {
    "normal": {
      "fontName": "宋體",
      "fontSize": 12,
      "lineSpacing": 1.5
    },
    "heading1": {
      "fontName": "黑體",
      "fontSize": 16,
      "bold": true,
      "spaceAfter": 12
    },
    "heading2": {
      "fontName": "楷體",
      "fontSize": 14,
      "bold": true,
      "spaceAfter": 10
    },
    "heading3": {
      "fontName": "仿宋",
      "fontSize": 12,
      "bold": true,
      "spaceAfter": 8
    }
  },
  "pageLayout": {
    "orientation": "portrait",
    "marginTop": 72,
    "marginBottom": 72,
    "marginLeft": 72,
    "marginRight": 72
  },
  "headerFooter": {
    "headerText": "公司機(jī)密",
    "showPageNumbers": true
  }
}

在上述配置中,我們定義了文檔的各種樣式設(shè)置,包括正文、各級(jí)標(biāo)題的字體、字號(hào)、行距等屬性。同時(shí),我們還定義了頁面布局和頁眉頁腳的設(shè)置。通過這種方式,我們可以輕松地調(diào)整文檔的整體外觀,而無需修改代碼。

實(shí)現(xiàn)格式讀取和應(yīng)用

using MudTools.OfficeInterop;
using System;
using System.IO;
using Newtonsoft.Json;

// 定義JSON配置對(duì)應(yīng)的類
public class DocumentStyleConfig
{
    public string FontName { get; set; }
    public int FontSize { get; set; }
    public bool Bold { get; set; }
    public float SpaceAfter { get; set; }
    public double LineSpacing { get; set; }
}

public class PageLayoutConfig
{
    public string Orientation { get; set; }
    public float MarginTop { get; set; }
    public float MarginBottom { get; set; }
    public float MarginLeft { get; set; }
    public float MarginRight { get; set; }
}

public class HeaderFooterConfig
{
    public string HeaderText { get; set; }
    public bool ShowPageNumbers { get; set; }
}

public class DocumentFormatConfig
{
    public Dictionary<string, DocumentStyleConfig> DocumentStyles { get; set; }
    public PageLayoutConfig PageLayout { get; set; }
    public HeaderFooterConfig HeaderFooter { get; set; }
}

class DocumentFormatter
{
    public static void FormatDocumentFromConfig(string configPath)
    {
        try
        {
            using var app = WordFactory.BlankWorkbook();
            var document = app.ActiveDocument;
            
            // 從JSON文件讀取配置
            var config = LoadFormatConfig(configPath);
            
            // 應(yīng)用文檔樣式
            ApplyDocumentStyles(document, config.DocumentStyles);
            
            // 設(shè)置頁面布局
            ApplyPageLayout(document, config.PageLayout);
            
            // 設(shè)置頁眉頁腳
            ApplyHeaderFooter(document, config.HeaderFooter);
            
            // 添加內(nèi)容并應(yīng)用樣式
            AddFormattedContent(document);
            
            document.SaveAs(@"C:\temp\FormattedDocument.docx");
            Console.WriteLine("文檔已根據(jù)配置文件格式化并保存");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"格式化文檔時(shí)出錯(cuò): {ex.Message}");
        }
    }
    
    private static DocumentFormatConfig LoadFormatConfig(string configPath)
    {
        try
        {
            var json = File.ReadAllText(configPath);
            return JsonConvert.DeserializeObject<DocumentFormatConfig>(json);
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException($"讀取配置文件失敗: {ex.Message}", ex);
        }
    }
    
    private static void ApplyDocumentStyles(IWordDocument document, Dictionary<string, DocumentStyleConfig> styles)
    {
        try
        {
            // 設(shè)置正文樣式
            if (styles.TryGetValue("normal", out var normalStyleConfig))
            {
                var normalStyle = document.Styles["正文"];
                normalStyle.Font.Name = normalStyleConfig.FontName;
                normalStyle.Font.Size = normalStyleConfig.FontSize;
                // 注意:這里可能需要根據(jù)實(shí)際API調(diào)整行距設(shè)置方式
            }
            
            // 設(shè)置標(biāo)題1樣式
            if (styles.TryGetValue("heading1", out var heading1StyleConfig))
            {
                var heading1Style = document.Styles["標(biāo)題 1"];
                heading1Style.Font.Name = heading1StyleConfig.FontName;
                heading1Style.Font.Size = heading1StyleConfig.FontSize;
                if (heading1StyleConfig.Bold)
                    heading1Style.Font.Bold = 1;
                heading1Style.ParagraphFormat.SpaceAfter = heading1StyleConfig.SpaceAfter;
            }
            
            // 設(shè)置標(biāo)題2樣式
            if (styles.TryGetValue("heading2", out var heading2StyleConfig))
            {
                var heading2Style = document.Styles["標(biāo)題 2"];
                heading2Style.Font.Name = heading2StyleConfig.FontName;
                heading2Style.Font.Size = heading2StyleConfig.FontSize;
                if (heading2StyleConfig.Bold)
                    heading2Style.Font.Bold = 1;
                heading2Style.ParagraphFormat.SpaceAfter = heading2StyleConfig.SpaceAfter;
            }
            
            // 設(shè)置標(biāo)題3樣式
            if (styles.TryGetValue("heading3", out var heading3StyleConfig))
            {
                var heading3Style = document.Styles["標(biāo)題 3"];
                heading3Style.Font.Name = heading3StyleConfig.FontName;
                heading3Style.Font.Size = heading3StyleConfig.FontSize;
                if (heading3StyleConfig.Bold)
                    heading3Style.Font.Bold = 1;
                heading3Style.ParagraphFormat.SpaceAfter = heading3StyleConfig.SpaceAfter;
            }
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException($"應(yīng)用文檔樣式時(shí)出錯(cuò): {ex.Message}", ex);
        }
    }
    
    private static void ApplyPageLayout(IWordDocument document, PageLayoutConfig pageLayout)
    {
        try
        {
            // 設(shè)置頁面方向
            bool isLandscape = pageLayout.Orientation.ToLower() == "landscape";
            document.SetPageOrientation(isLandscape);
            
            // 設(shè)置頁邊距
            document.SetMargins(
                pageLayout.MarginTop,
                pageLayout.MarginBottom,
                pageLayout.MarginLeft,
                pageLayout.MarginRight
            );
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException($"設(shè)置頁面布局時(shí)出錯(cuò): {ex.Message}", ex);
        }
    }
    
    private static void ApplyHeaderFooter(IWordDocument document, HeaderFooterConfig headerFooter)
    {
        try
        {
            // 添加頁眉
            if (!string.IsNullOrEmpty(headerFooter.HeaderText))
            {
                document.AddHeader(headerFooter.HeaderText);
            }
            
            // 添加頁腳(頁碼)
            if (headerFooter.ShowPageNumbers)
            {
                document.AddFooter($"第 \\page 頁 共 \\numpages 頁");
            }
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException($"設(shè)置頁眉頁腳時(shí)出錯(cuò): {ex.Message}", ex);
        }
    }
    
    private static void AddFormattedContent(IWordDocument document)
    {
        // 添加標(biāo)題
        var titleRange = document.Range();
        titleRange.Text = "文檔標(biāo)題\n";
        titleRange.Style = "標(biāo)題 1";
        
        // 添加正文
        var contentRange = document.Range(document.Content.End - 1, document.Content.End - 1);
        contentRange.Text = "這是文檔的正文內(nèi)容。在這里我們可以添加大量的文本內(nèi)容來演示自動(dòng)排版功能。\n\n";
        contentRange.Style = "正文";
        
        // 添加子標(biāo)題
        var subTitleRange = document.Range(document.Content.End - 1, document.Content.End - 1);
        subTitleRange.Text = "第一個(gè)子標(biāo)題\n";
        subTitleRange.Style = "標(biāo)題 2";
        
        // 添加更多正文
        var moreContentRange = document.Range(document.Content.End - 1, document.Content.End - 1);
        moreContentRange.Text = "這是子標(biāo)題下的內(nèi)容。我們可以繼續(xù)添加更多文本以展示格式化效果。\n\n";
        moreContentRange.Style = "正文";
    }
}

通過這種方式,我們可以將文檔格式設(shè)置與代碼分離,使得格式調(diào)整變得更加靈活和可維護(hù)。當(dāng)需要修改文檔樣式時(shí),只需要修改JSON配置文件,而無需重新編譯代碼。

創(chuàng)建嵌套表格

表格是 Word 文檔中組織數(shù)據(jù)的重要工具。MudTools.OfficeInterop.Word 提供了完整的表格操作功能,包括創(chuàng)建嵌套表格。

在實(shí)際業(yè)務(wù)場(chǎng)景中,我們經(jīng)常需要?jiǎng)?chuàng)建復(fù)雜的表格結(jié)構(gòu)來展示層次化的數(shù)據(jù)。嵌套表格是一種非常有用的技巧,它允許我們?cè)谝粋€(gè)表格單元格內(nèi)創(chuàng)建另一個(gè)表格,從而實(shí)現(xiàn)更加復(fù)雜的數(shù)據(jù)展示效果。

創(chuàng)建基本表格

using MudTools.OfficeInterop;
using System;

class TableCreator
{
    public static void CreateBasicTable()
    {
        try
        {
            using var app = WordFactory.BlankWorkbook();
            var document = app.ActiveDocument;
            
            // 創(chuàng)建表格
            var tableRange = document.Range(document.Content.End - 1, document.Content.End - 1);
            var table = document.Tables.Add(tableRange, 4, 3);
            
            // 填充表頭
            table.Cell(1, 1).Range.Text = "姓名";
            table.Cell(1, 2).Range.Text = "部門";
            table.Cell(1, 3).Range.Text = "職位";
            
            // 填充數(shù)據(jù)
            string[,] data = {
                {"張三", "技術(shù)部", "軟件工程師"},
                {"李四", "市場(chǎng)部", "市場(chǎng)專員"},
                {"王五", "人事部", "HR專員"}
            };
            
            for (int i = 0; i < data.GetLength(0); i++)
            {
                for (int j = 0; j < data.GetLength(1); j++)
                {
                    table.Cell(i + 2, j + 1).Range.Text = data[i, j];
                }
            }
            
            // 格式化表格
            FormatTable(table);
            
            document.SaveAs(@"C:\temp\BasicTable.docx");
            Console.WriteLine("基本表格已創(chuàng)建");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"創(chuàng)建基本表格時(shí)出錯(cuò): {ex.Message}");
        }
    }
    
    private static void FormatTable(IWordTable table)
    {
        // 設(shè)置表格邊框
        table.Borders.Enable = 1;
        table.Borders[WdBorderType.wdBorderTop].LineStyle = WdLineStyle.wdLineStyleSingle;
        table.Borders[WdBorderType.wdBorderLeft].LineStyle = WdLineStyle.wdLineStyleSingle;
        table.Borders[WdBorderType.wdBorderBottom].LineStyle = WdLineStyle.wdLineStyleSingle;
        table.Borders[WdBorderType.wdBorderRight].LineStyle = WdLineStyle.wdLineStyleSingle;
        
        // 格式化表頭
        for (int i = 1; i <= 3; i++)
        {
            var cell = table.Cell(1, i);
            cell.Range.Font.Bold = 1;
            cell.Range.Font.Color = WdColor.wdColorWhite;
            cell.Shading.BackgroundPatternColor = WdColor.wdColorDarkBlue;
            cell.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
        }
        
        // 格式化數(shù)據(jù)行
        for (int row = 2; row <= 4; row++)
        {
            for (int col = 1; col <= 3; col++)
            {
                var cell = table.Cell(row, col);
                cell.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
                
                // 交替行顏色
                if (row % 2 == 0)
                {
                    cell.Shading.BackgroundPatternColor = WdColor.wdColorGray10;
                }
            }
        }
    }
}

在上述代碼中,我們創(chuàng)建了一個(gè)包含員工信息的基本表格。通過設(shè)置邊框、背景色和對(duì)齊方式,使表格更加美觀和易讀。

創(chuàng)建嵌套表格

嵌套表格是在一個(gè)表格單元格內(nèi)創(chuàng)建另一個(gè)表格,這在復(fù)雜數(shù)據(jù)展示中非常有用:

using MudTools.OfficeInterop;
using System;

class NestedTableCreator
{
    public static void CreateNestedTable()
    {
        try
        {
            using var app = WordFactory.BlankWorkbook();
            var document = app.ActiveDocument;
            
            // 創(chuàng)建外層表格
            var outerTableRange = document.Range(document.Content.End - 1, document.Content.End - 1);
            var outerTable = document.Tables.Add(outerTableRange, 3, 2);
            
            // 設(shè)置外層表格標(biāo)題
            outerTable.Cell(1, 1).Range.Text = "項(xiàng)目名稱";
            outerTable.Cell(1, 2).Range.Text = "項(xiàng)目詳情";
            
            // 填充外層表格數(shù)據(jù)
            outerTable.Cell(2, 1).Range.Text = "Web應(yīng)用開發(fā)";
            outerTable.Cell(3, 1).Range.Text = "移動(dòng)應(yīng)用開發(fā)";
            
            // 在外層表格的單元格中創(chuàng)建嵌套表格
            CreateNestedTableInCell(outerTable.Cell(2, 2));
            CreateNestedTableInCell(outerTable.Cell(3, 2));
            
            // 格式化外層表格
            FormatOuterTable(outerTable);
            
            document.SaveAs(@"C:\temp\NestedTable.docx");
            Console.WriteLine("嵌套表格已創(chuàng)建");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"創(chuàng)建嵌套表格時(shí)出錯(cuò): {ex.Message}");
        }
    }
    
    private static void CreateNestedTableInCell(IWordCell cell)
    {
        // 在單元格中創(chuàng)建嵌套表格
        var nestedTable = cell.Tables.Add(cell.Range, 3, 2);
        
        // 填充嵌套表格數(shù)據(jù)
        nestedTable.Cell(1, 1).Range.Text = "任務(wù)";
        nestedTable.Cell(1, 2).Range.Text = "狀態(tài)";
        nestedTable.Cell(2, 1).Range.Text = "需求分析";
        nestedTable.Cell(2, 2).Range.Text = "完成";
        nestedTable.Cell(3, 1).Range.Text = "UI設(shè)計(jì)";
        nestedTable.Cell(3, 2).Range.Text = "進(jìn)行中";
        
        // 格式化嵌套表格
        FormatNestedTable(nestedTable);
    }
    
    private static void FormatOuterTable(IWordTable table)
    {
        // 設(shè)置表格邊框
        table.Borders.Enable = 1;
        
        // 格式化表頭
        var headerCell = table.Cell(1, 1);
        headerCell.Merge(table.Cell(1, 2)); // 合并表頭單元格
        headerCell.Range.Font.Bold = 1;
        headerCell.Range.Font.Size = 14;
        headerCell.Shading.BackgroundPatternColor = WdColor.wdColorLightBlue;
        headerCell.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
        
        // 格式化數(shù)據(jù)行
        for (int row = 2; row <= 3; row++)
        {
            for (int col = 1; col <= 2; col++)
            {
                var cell = table.Cell(row, col);
                cell.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
            }
        }
    }
    
    private static void FormatNestedTable(IWordTable table)
    {
        // 設(shè)置嵌套表格邊框
        table.Borders.Enable = 1;
        table.Borders.LineStyle = WdLineStyle.wdLineStyleDot;
        
        // 格式化嵌套表格表頭
        var headerCell1 = table.Cell(1, 1);
        var headerCell2 = table.Cell(1, 2);
        headerCell1.Range.Font.Bold = 1;
        headerCell2.Range.Font.Bold = 1;
        headerCell1.Shading.BackgroundPatternColor = WdColor.wdColorGray25;
        headerCell2.Shading.BackgroundPatternColor = WdColor.wdColorGray25;
        headerCell1.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
        headerCell2.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
    }
}

嵌套表格在實(shí)際應(yīng)用中非常有用,特別是在需要展示層次化數(shù)據(jù)時(shí)。例如,在項(xiàng)目管理文檔中,我們可能需要在項(xiàng)目列表中詳細(xì)描述每個(gè)項(xiàng)目的任務(wù)分配情況。通過嵌套表格,我們可以清晰地展示這種層次關(guān)系,使文檔結(jié)構(gòu)更加清晰。

生成文檔大綱

文檔大綱可以幫助讀者快速了解文檔結(jié)構(gòu),MudTools.OfficeInterop.Word 提供了設(shè)置段落大綱級(jí)別的功能。

文檔大綱是一種非常有用的文檔組織方式,它允許讀者通過展開或折疊不同的章節(jié)來瀏覽文檔內(nèi)容。通過設(shè)置段落的大綱級(jí)別,我們可以創(chuàng)建一個(gè)結(jié)構(gòu)清晰的文檔,便于讀者快速定位感興趣的內(nèi)容。

設(shè)置段落大綱級(jí)別

using MudTools.OfficeInterop;
using System;

class DocumentOutlineCreator
{
    public static void CreateDocumentOutline()
    {
        try
        {
            using var app = WordFactory.BlankWorkbook();
            var document = app.ActiveDocument;
            
            // 添加標(biāo)題
            AddHeading(document, "文檔標(biāo)題", WdOutlineLevel.wdOutlineLevel1);
            
            // 添加章節(jié)標(biāo)題
            AddHeading(document, "第一章 簡(jiǎn)介", WdOutlineLevel.wdOutlineLevel1);
            AddHeading(document, "1.1 背景", WdOutlineLevel.wdOutlineLevel2);
            AddHeading(document, "1.2 目標(biāo)", WdOutlineLevel.wdOutlineLevel2);
            
            AddHeading(document, "第二章 技術(shù)方案", WdOutlineLevel.wdOutlineLevel1);
            AddHeading(document, "2.1 架構(gòu)設(shè)計(jì)", WdOutlineLevel.wdOutlineLevel2);
            AddHeading(document, "2.1.1 系統(tǒng)架構(gòu)", WdOutlineLevel.wdOutlineLevel3);
            AddHeading(document, "2.1.2 數(shù)據(jù)架構(gòu)", WdOutlineLevel.wdOutlineLevel3);
            AddHeading(document, "2.2 技術(shù)選型", WdOutlineLevel.wdOutlineLevel2);
            
            AddHeading(document, "第三章 實(shí)施計(jì)劃", WdOutlineLevel.wdOutlineLevel1);
            AddHeading(document, "3.1 時(shí)間安排", WdOutlineLevel.wdOutlineLevel2);
            AddHeading(document, "3.2 資源分配", WdOutlineLevel.wdOutlineLevel2);
            
            // 添加正文內(nèi)容
            AddBodyContent(document);
            
            document.SaveAs(@"C:\temp\DocumentWithOutline.docx");
            Console.WriteLine("帶大綱的文檔已創(chuàng)建");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"創(chuàng)建文檔大綱時(shí)出錯(cuò): {ex.Message}");
        }
    }
    
    private static void AddHeading(IWordDocument document, string text, WdOutlineLevel level)
    {
        var range = document.Range(document.Content.End - 1, document.Content.End - 1);
        range.Text = $"{text}\n";
        
        // 設(shè)置大綱級(jí)別
        range.ParagraphFormat.OutlineLevel = level;
        
        // 根據(jù)大綱級(jí)別設(shè)置樣式
        switch (level)
        {
            case WdOutlineLevel.wdOutlineLevel1:
                range.Font.Size = 16;
                range.Font.Bold = 1;
                break;
            case WdOutlineLevel.wdOutlineLevel2:
                range.Font.Size = 14;
                range.Font.Bold = 1;
                break;
            case WdOutlineLevel.wdOutlineLevel3:
                range.Font.Size = 12;
                range.Font.Bold = 1;
                break;
        }
        
        range.ParagraphFormat.SpaceAfter = 12;
    }
    
    private static void AddBodyContent(IWordDocument document)
    {
        // 添加章節(jié)內(nèi)容
        AddParagraph(document, "這是第一章的正文內(nèi)容。在這里可以添加詳細(xì)的介紹和背景信息。");
        AddParagraph(document, "這是第二章的技術(shù)方案內(nèi)容。詳細(xì)描述系統(tǒng)架構(gòu)和技術(shù)選型。");
        AddParagraph(document, "這是第三章的實(shí)施計(jì)劃內(nèi)容。詳細(xì)說明項(xiàng)目的時(shí)間安排和資源分配。");
    }
    
    private static void AddParagraph(IWordDocument document, string text)
    {
        var range = document.Range(document.Content.End - 1, document.Content.End - 1);
        range.Text = $"{text}\n\n";
        range.ParagraphFormat.OutlineLevel = WdOutlineLevel.wdOutlineLevelBodyText;
    }
}

通過設(shè)置大綱級(jí)別,我們可以創(chuàng)建一個(gè)結(jié)構(gòu)化的文檔,讀者可以使用Word的大綱視圖來瀏覽文檔內(nèi)容。這種方式特別適用于長(zhǎng)篇技術(shù)文檔或報(bào)告。

生成文檔目錄

文檔目錄可以幫助讀者快速導(dǎo)航到感興趣的章節(jié)。雖然 MudTools.OfficeInterop.Word 沒有直接提供創(chuàng)建目錄的方法,但我們可以通過使用 Word 的內(nèi)置功能來實(shí)現(xiàn)。

文檔目錄是長(zhǎng)篇文檔中不可或缺的一部分,它為讀者提供了快速導(dǎo)航到特定章節(jié)的途徑。通過自動(dòng)生成目錄,我們可以確保目錄與文檔內(nèi)容保持同步,避免手動(dòng)維護(hù)目錄帶來的錯(cuò)誤。

使用字段創(chuàng)建目錄

using MudTools.OfficeInterop;
using System;

class TableOfContentsCreator
{
    public static void CreateTableOfContents()
    {
        try
        {
            using var app = WordFactory.BlankWorkbook();
            var document = app.ActiveDocument;
            
            // 添加文檔標(biāo)題
            AddDocumentTitle(document, "技術(shù)方案文檔");
            
            // 添加目錄標(biāo)題
            AddTocHeading(document, "目錄");
            
            // 插入目錄字段(位置占位)
            InsertTableOfContentsField(document);
            
            // 添加章節(jié)內(nèi)容(確保在目錄之后添加,這樣大綱級(jí)別才能正確識(shí)別)
            AddDocumentContentWithHeadings(document);
            
            // 更新目錄字段
            document.UpdateAllFields();
            
            document.SaveAs(@"C:\temp\DocumentWithTOC.docx");
            Console.WriteLine("帶目錄的文檔已創(chuàng)建");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"創(chuàng)建文檔目錄時(shí)出錯(cuò): {ex.Message}");
        }
    }
    
    private static void AddDocumentTitle(IWordDocument document, string title)
    {
        var range = document.Range();
        range.Text = $"{title}\n";
        range.Font.Name = "微軟雅黑";
        range.Font.Size = 18;
        range.Font.Bold = 1;
        range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
        range.ParagraphFormat.SpaceAfter = 24;
    }
    
    private static void AddTocHeading(IWordDocument document, string heading)
    {
        var range = document.Range(document.Content.End - 1, document.Content.End - 1);
        range.Text = $"{heading}\n";
        range.Font.Size = 16;
        range.Font.Bold = 1;
        range.ParagraphFormat.SpaceAfter = 12;
    }
    
    private static void InsertTableOfContentsField(IWordDocument document)
    {
        // 在當(dāng)前位置插入目錄字段
        var range = document.Range(document.Content.End - 1, document.Content.End - 1);
        range.Text = "\n"; // 留出空間
        
        // 插入目錄字段(使用Word原生字段代碼)
        var tocRange = document.Range(document.Content.End - 2, document.Content.End - 1);
        tocRange.Text = "TOC \\o \"1-3\" \\h \\z \\u"; // 目錄字段代碼
        
        // 應(yīng)用字段樣式
        tocRange.Font.Size = 12;
    }
    
    private static void AddDocumentContentWithHeadings(IWordDocument document)
    {
        // 添加章節(jié)內(nèi)容
        AddHeadingWithLevel(document, "第一章 簡(jiǎn)介", 1);
        AddBodyText(document, "這是第一章的內(nèi)容,介紹項(xiàng)目的背景和目標(biāo)。");
        
        AddHeadingWithLevel(document, "第二章 技術(shù)架構(gòu)", 1);
        AddBodyText(document, "這是第二章的內(nèi)容,詳細(xì)描述系統(tǒng)的技術(shù)架構(gòu)。");
        
        AddHeadingWithLevel(document, "2.1 系統(tǒng)設(shè)計(jì)", 2);
        AddBodyText(document, "系統(tǒng)設(shè)計(jì)部分的內(nèi)容。");
        
        AddHeadingWithLevel(document, "2.2 數(shù)據(jù)庫(kù)設(shè)計(jì)", 2);
        AddBodyText(document, "數(shù)據(jù)庫(kù)設(shè)計(jì)部分的內(nèi)容。");
        
        AddHeadingWithLevel(document, "第三章 實(shí)施計(jì)劃", 1);
        AddBodyText(document, "這是第三章的內(nèi)容,詳細(xì)說明項(xiàng)目的實(shí)施計(jì)劃。");
    }
    
    private static void AddHeadingWithLevel(IWordDocument document, string text, int level)
    {
        var range = document.Range(document.Content.End - 1, document.Content.End - 1);
        range.Text = $"\n{text}\n";
        
        // 應(yīng)用內(nèi)置標(biāo)題樣式
        switch (level)
        {
            case 1:
                range.Style = "標(biāo)題 1";
                break;
            case 2:
                range.Style = "標(biāo)題 2";
                break;
            case 3:
                range.Style = "標(biāo)題 3";
                break;
        }
    }
    
    private static void AddBodyText(IWordDocument document, string text)
    {
        var range = document.Range(document.Content.End - 1, document.Content.End - 1);
        range.Text = $"{text}\n\n";
        range.Style = "正文";
    }
}

通過使用Word的字段功能,我們可以自動(dòng)生成目錄,并在文檔內(nèi)容發(fā)生變化時(shí)更新目錄。這種方式確保了目錄的準(zhǔn)確性和時(shí)效性。

綜合示例:創(chuàng)建完整的技術(shù)文檔

讓我們創(chuàng)建一個(gè)綜合示例,展示如何使用所有這些功能創(chuàng)建一個(gè)完整的技術(shù)文檔:

using MudTools.OfficeInterop;
using System;

class ComprehensiveDocumentGenerator
{
    public static void GenerateTechnicalDocument()
    {
        try
        {
            using var app = WordFactory.BlankWorkbook();
            app.Visible = true;
            var document = app.ActiveDocument;
            
            // 設(shè)置文檔屬性
            document.Title = "企業(yè)管理系統(tǒng)技術(shù)方案";
            document.Author = "技術(shù)部";
            
            // 設(shè)置文檔樣式
            SetupDocumentStyles(document);
            
            // 添加封面
            AddCoverPage(document);
            
            // 添加目錄
            AddTableOfContents(document);
            
            // 添加正文內(nèi)容
            AddMainContent(document);
            
            // 更新所有字段(包括目錄)
            document.UpdateAllFields();
            
            // 保存文檔
            document.SaveAs(@"C:\temp\TechnicalDocument.docx");
            
            Console.WriteLine("完整技術(shù)文檔已生成");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"生成技術(shù)文檔時(shí)出錯(cuò): {ex.Message}");
        }
    }
    
    private static void SetupDocumentStyles(IWordDocument document)
    {
        // 設(shè)置正文樣式
        var normalStyle = document.Styles["正文"];
        normalStyle.Font.Name = "宋體";
        normalStyle.Font.Size = 12;
        normalStyle.ParagraphFormat.LineSpacing = 1.5f;
        normalStyle.ParagraphFormat.SpaceAfter = 10;
        
        // 設(shè)置標(biāo)題1樣式
        var heading1Style = document.Styles["標(biāo)題 1"];
        heading1Style.Font.Name = "黑體";
        heading1Style.Font.Size = 16;
        heading1Style.Font.Bold = 1;
        heading1Style.ParagraphFormat.SpaceAfter = 15;
        heading1Style.ParagraphFormat.SpaceBefore = 12;
        
        // 設(shè)置標(biāo)題2樣式
        var heading2Style = document.Styles["標(biāo)題 2"];
        heading2Style.Font.Name = "楷體";
        heading2Style.Font.Size = 14;
        heading2Style.Font.Bold = 1;
        heading2Style.ParagraphFormat.SpaceAfter = 12;
        heading2Style.ParagraphFormat.SpaceBefore = 10;
        
        // 設(shè)置標(biāo)題3樣式
        var heading3Style = document.Styles["標(biāo)題 3"];
        heading3Style.Font.Name = "仿宋";
        heading3Style.Font.Size = 12;
        heading3Style.Font.Bold = 1;
        heading3Style.ParagraphFormat.SpaceAfter = 10;
        heading3Style.ParagraphFormat.SpaceBefore = 8;
    }
    
    private static void AddCoverPage(IWordDocument document)
    {
        // 添加封面標(biāo)題
        var titleRange = document.Range();
        titleRange.Text = "企業(yè)管理系統(tǒng)\n技術(shù)方案\n\n";
        titleRange.Font.Name = "微軟雅黑";
        titleRange.Font.Size = 24;
        titleRange.Font.Bold = 1;
        titleRange.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
        
        // 添加公司信息
        var companyRange = document.Range(document.Content.End - 1, document.Content.End - 1);
        companyRange.Text = "\n\n\nABC科技有限公司\n";
        companyRange.Font.Size = 14;
        companyRange.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
        
        // 添加日期
        var dateRange = document.Range(document.Content.End - 1, document.Content.End - 1);
        dateRange.Text = $"\n{DateTime.Now:yyyy年MM月dd日}\n";
        dateRange.Font.Size = 12;
        dateRange.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
        
        // 添加分頁符
        document.AddPageBreak(document.Content.End - 1);
    }
    
    private static void AddTableOfContents(IWordDocument document)
    {
        // 添加目錄標(biāo)題
        var tocTitleRange = document.Range(document.Content.End - 1, document.Content.End - 1);
        tocTitleRange.Text = "目錄\n";
        tocTitleRange.Style = "標(biāo)題 1";
        
        // 添加目錄字段
        var tocRange = document.Range(document.Content.End - 1, document.Content.End - 1);
        tocRange.Text = "TOC \\o \"1-3\" \\h \\z \\u\n";
        tocRange.Font.Size = 12;
        
        // 添加分頁符
        document.AddPageBreak(document.Content.End - 1);
    }
    
    private static void AddMainContent(IWordDocument document)
    {
        // 第一章 簡(jiǎn)介
        AddHeading(document, "第一章 簡(jiǎn)介", "標(biāo)題 1");
        AddHeading(document, "1.1 項(xiàng)目背景", "標(biāo)題 2");
        AddParagraph(document, "隨著企業(yè)業(yè)務(wù)的快速發(fā)展,傳統(tǒng)的管理方式已經(jīng)無法滿足現(xiàn)代企業(yè)的需求。為了提高管理效率,降低運(yùn)營(yíng)成本,我們決定開發(fā)一套全新的企業(yè)管理系統(tǒng)。");
        
        AddHeading(document, "1.2 項(xiàng)目目標(biāo)", "標(biāo)題 2");
        AddParagraph(document, "本項(xiàng)目的主要目標(biāo)包括:");
        AddBulletList(document, new[] { 
            "提高管理效率", 
            "降低運(yùn)營(yíng)成本", 
            "增強(qiáng)數(shù)據(jù)安全性", 
            "提升用戶體驗(yàn)" 
        });
        
        // 第二章 技術(shù)架構(gòu)
        AddHeading(document, "第二章 技術(shù)架構(gòu)", "標(biāo)題 1");
        AddHeading(document, "2.1 系統(tǒng)架構(gòu)", "標(biāo)題 2");
        AddParagraph(document, "系統(tǒng)采用分層架構(gòu)設(shè)計(jì),主要包括:");
        
        // 創(chuàng)建系統(tǒng)架構(gòu)表格
        var archTableRange = document.Range(document.Content.End - 1, document.Content.End - 1);
        var archTable = document.Tables.Add(archTableRange, 4, 2);
        archTable.Cell(1, 1).Range.Text = "層名";
        archTable.Cell(1, 2).Range.Text = "描述";
        archTable.Cell(2, 1).Range.Text = "表示層";
        archTable.Cell(2, 2).Range.Text = "負(fù)責(zé)用戶界面展示";
        archTable.Cell(3, 1).Range.Text = "業(yè)務(wù)邏輯層";
        archTable.Cell(3, 2).Range.Text = "處理業(yè)務(wù)邏輯";
        archTable.Cell(4, 1).Range.Text = "數(shù)據(jù)訪問層";
        archTable.Cell(4, 2).Range.Text = "負(fù)責(zé)數(shù)據(jù)存取";
        FormatSimpleTable(archTable);
        
        AddHeading(document, "2.2 技術(shù)選型", "標(biāo)題 2");
        AddParagraph(document, "本系統(tǒng)采用以下技術(shù)棧:");
        
        // 創(chuàng)建技術(shù)選型表格
        var techTableRange = document.Range(document.Content.End - 1, document.Content.End - 1);
        var techTable = document.Tables.Add(techTableRange, 4, 3);
        techTable.Cell(1, 1).Range.Text = "技術(shù)";
        techTable.Cell(1, 2).Range.Text = "版本";
        techTable.Cell(1, 3).Range.Text = "用途";
        techTable.Cell(2, 1).Range.Text = ".NET";
        techTable.Cell(2, 2).Range.Text = "6.0";
        techTable.Cell(2, 3).Range.Text = "后端開發(fā)";
        techTable.Cell(3, 1).Range.Text = "Vue.js";
        techTable.Cell(3, 2).Range.Text = "3.0";
        techTable.Cell(3, 3).Range.Text = "前端開發(fā)";
        techTable.Cell(4, 1).Range.Text = "SQL Server";
        techTable.Cell(4, 2).Range.Text = "2019";
        techTable.Cell(4, 3).Range.Text = "數(shù)據(jù)庫(kù)";
        FormatSimpleTable(techTable);
        
        // 第三章 實(shí)施計(jì)劃
        AddHeading(document, "第三章 實(shí)施計(jì)劃", "標(biāo)題 1");
        AddHeading(document, "3.1 時(shí)間安排", "標(biāo)題 2");
        AddParagraph(document, "項(xiàng)目計(jì)劃分為以下幾個(gè)階段:");
        
        // 創(chuàng)建時(shí)間安排表格
        var scheduleTableRange = document.Range(document.Content.End - 1, document.Content.End - 1);
        var scheduleTable = document.Tables.Add(scheduleTableRange, 5, 3);
        scheduleTable.Cell(1, 1).Range.Text = "階段";
        scheduleTable.Cell(1, 2).Range.Text = "時(shí)間";
        scheduleTable.Cell(1, 3).Range.Text = "主要任務(wù)";
        scheduleTable.Cell(2, 1).Range.Text = "需求分析";
        scheduleTable.Cell(2, 2).Range.Text = "第1-2周";
        scheduleTable.Cell(2, 3).Range.Text = "收集和分析用戶需求";
        scheduleTable.Cell(3, 1).Range.Text = "系統(tǒng)設(shè)計(jì)";
        scheduleTable.Cell(3, 2).Range.Text = "第3-4周";
        scheduleTable.Cell(3, 3).Range.Text = "設(shè)計(jì)系統(tǒng)架構(gòu)和數(shù)據(jù)庫(kù)";
        scheduleTable.Cell(4, 1).Range.Text = "編碼實(shí)現(xiàn)";
        scheduleTable.Cell(4, 2).Range.Text = "第5-10周";
        scheduleTable.Cell(4, 3).Range.Text = "編寫代碼和單元測(cè)試";
        scheduleTable.Cell(5, 1).Range.Text = "測(cè)試部署";
        scheduleTable.Cell(5, 2).Range.Text = "第11-12周";
        scheduleTable.Cell(5, 3).Range.Text = "系統(tǒng)測(cè)試和上線部署";
        FormatSimpleTable(scheduleTable);
    }
    
    private static void AddHeading(IWordDocument document, string text, string style)
    {
        var range = document.Range(document.Content.End - 1, document.Content.End - 1);
        range.Text = $"{text}\n";
        range.Style = style;
    }
    
    private static void AddParagraph(IWordDocument document, string text)
    {
        var range = document.Range(document.Content.End - 1, document.Content.End - 1);
        range.Text = $"{text}\n\n";
        range.Style = "正文";
    }
    
    private static void AddBulletList(IWordDocument document, string[] items)
    {
        foreach (var item in items)
        {
            var range = document.Range(document.Content.End - 1, document.Content.End - 1);
            range.Text = $"{item}\n";
            range.Style = "正文";
            range.ListFormat.ApplyBulletDefault();
        }
        // 添加一個(gè)空段落來結(jié)束列表
        var endRange = document.Range(document.Content.End - 1, document.Content.End - 1);
        endRange.Text = "\n";
    }
    
    private static void FormatSimpleTable(IWordTable table)
    {
        // 設(shè)置表格邊框
        table.Borders.Enable = 1;
        
        // 格式化表頭
        for (int i = 1; i <= table.Columns.Count; i++)
        {
            var cell = table.Cell(1, i);
            cell.Range.Font.Bold = 1;
            cell.Shading.BackgroundPatternColor = WdColor.wdColorGray25;
            cell.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
        }
        
        // 設(shè)置表格內(nèi)容居中
        for (int row = 1; row <= table.Rows.Count; row++)
        {
            for (int col = 1; col <= table.Columns.Count; col++)
            {
                table.Cell(row, col).Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
            }
        }
    }
}

注意事項(xiàng)

在使用 MudTools.OfficeInterop.Word 進(jìn)行文檔自動(dòng)化時(shí),需要注意以下幾點(diǎn):

資源管理

始終使用 using 語句確保 COM 對(duì)象得到正確釋放:

using var app = WordFactory.BlankWorkbook();
// 執(zhí)行操作
// 資源會(huì)自動(dòng)釋放

正確的資源管理是使用 COM 組件的關(guān)鍵。由于 Word 是一個(gè)重量級(jí)應(yīng)用程序,如果未能正確釋放資源,可能會(huì)導(dǎo)致內(nèi)存泄漏或 Word 進(jìn)程無法退出的問題。

異常處理

包裝所有操作在 try-catch 塊中處理可能的異常:

try
{
    // Word 操作
}
catch (Exception ex)
{
    Console.WriteLine($"操作出錯(cuò): {ex.Message}");
}

Word 自動(dòng)化操作可能會(huì)因?yàn)楦鞣N原因失敗,例如文件被占用、路徑不存在、權(quán)限不足等。通過適當(dāng)?shù)漠惓L幚?,可以確保程序的穩(wěn)定性,并提供有用的錯(cuò)誤信息。

性能優(yōu)化

對(duì)于大量文檔處理,考慮以下優(yōu)化策略:

  • 批量處理文檔時(shí),重用 Word 應(yīng)用程序?qū)嵗?/li>
  • 避免頻繁的 UI 更新操作
  • 在處理完成后關(guān)閉 Word 應(yīng)用程序
class BatchProcessor
{
    public static void ProcessDocuments(string[] filePaths)
    {
        using var app = WordFactory.BlankWorkbook();
        app.Visible = false; // 隱藏界面以提高性能
        
        foreach (var filePath in filePaths)
        {
            try
            {
                var document = app.Open(filePath);
                // 處理文檔
                document.Close(false); // 不保存更改
            }
            catch (Exception ex)
            {
                Console.WriteLine($"處理文件 {filePath} 時(shí)出錯(cuò): {ex.Message}");
            }
        }
    }
}

通過隱藏 Word 界面,我們可以顯著提高處理速度,特別是在批量處理文檔時(shí)。

總結(jié)

MudTools.OfficeInterop.Word 為 .NET 開發(fā)者提供了一個(gè)強(qiáng)大而易用的 Word 文檔自動(dòng)化解決方案。通過本文介紹的功能,您可以:

  • 自動(dòng)生成合同條款和其他結(jié)構(gòu)化文檔
  • 實(shí)現(xiàn)自動(dòng)文檔排版,確保文檔風(fēng)格統(tǒng)一
  • 創(chuàng)建復(fù)雜的嵌套表格來展示數(shù)據(jù)
  • 生成文檔大綱和目錄,提高文檔可讀性

這些功能在實(shí)際業(yè)務(wù)場(chǎng)景中非常有用,可以幫助企業(yè)大幅提高文檔處理效率,減少人工操作錯(cuò)誤。通過合理使用這個(gè)庫(kù),您可以構(gòu)建出功能強(qiáng)大的文檔自動(dòng)化系統(tǒng)。

以上就是.NET實(shí)現(xiàn)基于規(guī)則自動(dòng)生成及排版Word文檔的詳細(xì)內(nèi)容,更多關(guān)于.NET自動(dòng)生成與排版Word的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

太和县| 隆林| 开平市| 阿勒泰市| 正定县| 巴林右旗| 都江堰市| 从江县| 奉贤区| 达日县| 张家口市| 玛沁县| 革吉县| 那曲县| 中西区| 台江县| 梁山县| 屏东县| 洛川县| 修水县| 卢湾区| 温宿县| 无极县| 乐安县| 策勒县| 遵义县| 大洼县| 英德市| 中卫市| 汾西县| 卢湾区| 穆棱市| 奎屯市| 东海县| 遂昌县| 新宁县| 峡江县| 周口市| 无棣县| 定兴县| 双辽市|