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

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

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

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

簡介

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

環(huá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è)計,通過 WordFactory 類來創(chuàng)建和操作 Word 應(yīng)用程序?qū)嵗?。這種方式使得開發(fā)者可以以統(tǒng)一的方式創(chuàng)建不同類型的文檔,而無需關(guān)心底層的 COM 對象創(chuàng)建細節(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 文檔文件

下面是一個簡單的示例,展示如何創(chuàng)建一個空白 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)試和演示。

自動生成合同條款

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

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

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

這種方法的核心思想是將合同條款的結(jié)構(gòu)和內(nèi)容與具體的業(yè)務(wù)數(shù)據(jù)分離。通過定義規(guī)則模板,我們可以創(chuàng)建一個靈活的系統(tǒng),能夠適應(yī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ù)費用",
          "template": "本合同總金額為人民幣{amount}元(大寫:{amount_capital})。",
          "requiredFields": ["amount", "amount_capital"]
        }
      ]
    },
    "employmentContract": {
      "title": "勞動合同",
      "clauses": [
        {
          "id": "clause1",
          "title": "工作內(nèi)容",
          "template": "甲方聘用乙方在{department}部門擔(dān)任{position}職務(wù),工作內(nèi)容包括:{responsibilities}。",
          "requiredFields": ["department", "position", "responsibilities"]
        },
        {
          "id": "clause2",
          "title": "工作時間和休假",
          "template": "乙方每日工作{hours_per_day}小時,每周工作{days_per_week}天。按照國家規(guī)定享受帶薪年假。",
          "requiredFields": ["hours_per_day", "days_per_week"]
        },
        {
          "id": "clause3",
          "title": "薪酬待遇",
          "template": "甲方每月支付乙方基本工資人民幣{base_salary}元,績效獎金根據(jù)考核結(jié)果發(fā)放。",
          "requiredFields": ["base_salary"]
        }
      ]
    }
  }
}

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

實現(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}";
            
            // 添加合同標題
            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($"生成合同時出錯: {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}' 缺少必需字段");
            }
            
            // 生成條款編號和標題
            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)
    {
        // 添加簽名標題
        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集團",
            SignDate = DateTime.Now,
            Fields = new Dictionary<string, string>
            {
                ["service_type"] = "軟件開發(fā)",
                ["service_details"] = "企業(yè)資源管理系統(tǒng)開發(fā)、部署和維護",
                ["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:生成勞動合同

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"] = "高級軟件工程師",
                ["responsibilities"] = "負責(zé)系統(tǒng)架構(gòu)設(shè)計、核心代碼編寫和技術(shù)團隊管理",
                ["hours_per_day"] = "8",
                ["days_per_week"] = "5",
                ["base_salary"] = "25,000.00"
            }
        };
        
        RuleBasedContractGenerator.GenerateContractFromRules(@"C:\config\contractRules.json", contractData);
    }
}

高級功能擴展

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

  • 條件條款:根據(jù)特定條件選擇不同的條款模板
  • 條款依賴:某些條款的出現(xiàn)依賴于其他條款的選擇
  • 動態(tài)計算:自動計算金額、日期等字段
  • 版本控制:管理不同版本的合同模板和規(guī)則
// 擴展示例:支持條件條款
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; }  // 條件值
}

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

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

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

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

自動文檔排版

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

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

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

首先,我們需要定義一個JSON配置文件來存儲文檔格式設(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": "公司機密",
    "showPageNumbers": true
  }
}

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

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

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

// 定義JSON配置對應(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($"格式化文檔時出錯: {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ù)實際API調(diào)整行距設(shè)置方式
            }
            
            // 設(shè)置標題1樣式
            if (styles.TryGetValue("heading1", out var heading1StyleConfig))
            {
                var heading1Style = document.Styles["標題 1"];
                heading1Style.Font.Name = heading1StyleConfig.FontName;
                heading1Style.Font.Size = heading1StyleConfig.FontSize;
                if (heading1StyleConfig.Bold)
                    heading1Style.Font.Bold = 1;
                heading1Style.ParagraphFormat.SpaceAfter = heading1StyleConfig.SpaceAfter;
            }
            
            // 設(shè)置標題2樣式
            if (styles.TryGetValue("heading2", out var heading2StyleConfig))
            {
                var heading2Style = document.Styles["標題 2"];
                heading2Style.Font.Name = heading2StyleConfig.FontName;
                heading2Style.Font.Size = heading2StyleConfig.FontSize;
                if (heading2StyleConfig.Bold)
                    heading2Style.Font.Bold = 1;
                heading2Style.ParagraphFormat.SpaceAfter = heading2StyleConfig.SpaceAfter;
            }
            
            // 設(shè)置標題3樣式
            if (styles.TryGetValue("heading3", out var heading3StyleConfig))
            {
                var heading3Style = document.Styles["標題 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)用文檔樣式時出錯: {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è)置頁面布局時出錯: {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è)置頁眉頁腳時出錯: {ex.Message}", ex);
        }
    }
    
    private static void AddFormattedContent(IWordDocument document)
    {
        // 添加標題
        var titleRange = document.Range();
        titleRange.Text = "文檔標題\n";
        titleRange.Style = "標題 1";
        
        // 添加正文
        var contentRange = document.Range(document.Content.End - 1, document.Content.End - 1);
        contentRange.Text = "這是文檔的正文內(nèi)容。在這里我們可以添加大量的文本內(nèi)容來演示自動排版功能。\n\n";
        contentRange.Style = "正文";
        
        // 添加子標題
        var subTitleRange = document.Range(document.Content.End - 1, document.Content.End - 1);
        subTitleRange.Text = "第一個子標題\n";
        subTitleRange.Style = "標題 2";
        
        // 添加更多正文
        var moreContentRange = document.Range(document.Content.End - 1, document.Content.End - 1);
        moreContentRange.Text = "這是子標題下的內(nèi)容。我們可以繼續(xù)添加更多文本以展示格式化效果。\n\n";
        moreContentRange.Style = "正文";
    }
}

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

創(chuàng)建嵌套表格

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

在實際業(yè)務(wù)場景中,我們經(jīng)常需要創(chuàng)建復(fù)雜的表格結(jié)構(gòu)來展示層次化的數(shù)據(jù)。嵌套表格是一種非常有用的技巧,它允許我們在一個表格單元格內(nèi)創(chuàng)建另一個表格,從而實現(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ù)部", "軟件工程師"},
                {"李四", "市場部", "市場專員"},
                {"王五", "人事部", "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)建基本表格時出錯: {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)建了一個包含員工信息的基本表格。通過設(shè)置邊框、背景色和對齊方式,使表格更加美觀和易讀。

創(chuàng)建嵌套表格

嵌套表格是在一個表格單元格內(nèi)創(chuàng)建另一個表格,這在復(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è)置外層表格標題
            outerTable.Cell(1, 1).Range.Text = "項目名稱";
            outerTable.Cell(1, 2).Range.Text = "項目詳情";
            
            // 填充外層表格數(shù)據(jù)
            outerTable.Cell(2, 1).Range.Text = "Web應(yīng)用開發(fā)";
            outerTable.Cell(3, 1).Range.Text = "移動應(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)建嵌套表格時出錯: {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è)計";
        nestedTable.Cell(3, 2).Range.Text = "進行中";
        
        // 格式化嵌套表格
        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;
    }
}

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

生成文檔大綱

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

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

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

using MudTools.OfficeInterop;
using System;

class DocumentOutlineCreator
{
    public static void CreateDocumentOutline()
    {
        try
        {
            using var app = WordFactory.BlankWorkbook();
            var document = app.ActiveDocument;
            
            // 添加標題
            AddHeading(document, "文檔標題", WdOutlineLevel.wdOutlineLevel1);
            
            // 添加章節(jié)標題
            AddHeading(document, "第一章 簡介", WdOutlineLevel.wdOutlineLevel1);
            AddHeading(document, "1.1 背景", WdOutlineLevel.wdOutlineLevel2);
            AddHeading(document, "1.2 目標", WdOutlineLevel.wdOutlineLevel2);
            
            AddHeading(document, "第二章 技術(shù)方案", WdOutlineLevel.wdOutlineLevel1);
            AddHeading(document, "2.1 架構(gòu)設(shè)計", 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, "第三章 實施計劃", WdOutlineLevel.wdOutlineLevel1);
            AddHeading(document, "3.1 時間安排", 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)建文檔大綱時出錯: {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è)置大綱級別
        range.ParagraphFormat.OutlineLevel = level;
        
        // 根據(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)容。在這里可以添加詳細的介紹和背景信息。");
        AddParagraph(document, "這是第二章的技術(shù)方案內(nèi)容。詳細描述系統(tǒng)架構(gòu)和技術(shù)選型。");
        AddParagraph(document, "這是第三章的實施計劃內(nèi)容。詳細說明項目的時間安排和資源分配。");
    }
    
    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è)置大綱級別,我們可以創(chuàng)建一個結(jié)構(gòu)化的文檔,讀者可以使用Word的大綱視圖來瀏覽文檔內(nèi)容。這種方式特別適用于長篇技術(shù)文檔或報告。

生成文檔目錄

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

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

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

using MudTools.OfficeInterop;
using System;

class TableOfContentsCreator
{
    public static void CreateTableOfContents()
    {
        try
        {
            using var app = WordFactory.BlankWorkbook();
            var document = app.ActiveDocument;
            
            // 添加文檔標題
            AddDocumentTitle(document, "技術(shù)方案文檔");
            
            // 添加目錄標題
            AddTocHeading(document, "目錄");
            
            // 插入目錄字段(位置占位)
            InsertTableOfContentsField(document);
            
            // 添加章節(jié)內(nèi)容(確保在目錄之后添加,這樣大綱級別才能正確識別)
            AddDocumentContentWithHeadings(document);
            
            // 更新目錄字段
            document.UpdateAllFields();
            
            document.SaveAs(@"C:\temp\DocumentWithTOC.docx");
            Console.WriteLine("帶目錄的文檔已創(chuàng)建");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"創(chuàng)建文檔目錄時出錯: {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, "第一章 簡介", 1);
        AddBodyText(document, "這是第一章的內(nèi)容,介紹項目的背景和目標。");
        
        AddHeadingWithLevel(document, "第二章 技術(shù)架構(gòu)", 1);
        AddBodyText(document, "這是第二章的內(nèi)容,詳細描述系統(tǒng)的技術(shù)架構(gòu)。");
        
        AddHeadingWithLevel(document, "2.1 系統(tǒng)設(shè)計", 2);
        AddBodyText(document, "系統(tǒng)設(shè)計部分的內(nèi)容。");
        
        AddHeadingWithLevel(document, "2.2 數(shù)據(jù)庫設(shè)計", 2);
        AddBodyText(document, "數(shù)據(jù)庫設(shè)計部分的內(nèi)容。");
        
        AddHeadingWithLevel(document, "第三章 實施計劃", 1);
        AddBodyText(document, "這是第三章的內(nèi)容,詳細說明項目的實施計劃。");
    }
    
    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)置標題樣式
        switch (level)
        {
            case 1:
                range.Style = "標題 1";
                break;
            case 2:
                range.Style = "標題 2";
                break;
            case 3:
                range.Style = "標題 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的字段功能,我們可以自動生成目錄,并在文檔內(nèi)容發(fā)生變化時更新目錄。這種方式確保了目錄的準確性和時效性。

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

讓我們創(chuàng)建一個綜合示例,展示如何使用所有這些功能創(chuàng)建一個完整的技術(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ù)文檔時出錯: {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è)置標題1樣式
        var heading1Style = document.Styles["標題 1"];
        heading1Style.Font.Name = "黑體";
        heading1Style.Font.Size = 16;
        heading1Style.Font.Bold = 1;
        heading1Style.ParagraphFormat.SpaceAfter = 15;
        heading1Style.ParagraphFormat.SpaceBefore = 12;
        
        // 設(shè)置標題2樣式
        var heading2Style = document.Styles["標題 2"];
        heading2Style.Font.Name = "楷體";
        heading2Style.Font.Size = 14;
        heading2Style.Font.Bold = 1;
        heading2Style.ParagraphFormat.SpaceAfter = 12;
        heading2Style.ParagraphFormat.SpaceBefore = 10;
        
        // 設(shè)置標題3樣式
        var heading3Style = document.Styles["標題 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)
    {
        // 添加封面標題
        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)
    {
        // 添加目錄標題
        var tocTitleRange = document.Range(document.Content.End - 1, document.Content.End - 1);
        tocTitleRange.Text = "目錄\n";
        tocTitleRange.Style = "標題 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)
    {
        // 第一章 簡介
        AddHeading(document, "第一章 簡介", "標題 1");
        AddHeading(document, "1.1 項目背景", "標題 2");
        AddParagraph(document, "隨著企業(yè)業(yè)務(wù)的快速發(fā)展,傳統(tǒng)的管理方式已經(jīng)無法滿足現(xiàn)代企業(yè)的需求。為了提高管理效率,降低運營成本,我們決定開發(fā)一套全新的企業(yè)管理系統(tǒng)。");
        
        AddHeading(document, "1.2 項目目標", "標題 2");
        AddParagraph(document, "本項目的主要目標包括:");
        AddBulletList(document, new[] { 
            "提高管理效率", 
            "降低運營成本", 
            "增強數(shù)據(jù)安全性", 
            "提升用戶體驗" 
        });
        
        // 第二章 技術(shù)架構(gòu)
        AddHeading(document, "第二章 技術(shù)架構(gòu)", "標題 1");
        AddHeading(document, "2.1 系統(tǒng)架構(gòu)", "標題 2");
        AddParagraph(document, "系統(tǒng)采用分層架構(gòu)設(shè)計,主要包括:");
        
        // 創(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 = "負責(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 = "負責(zé)數(shù)據(jù)存取";
        FormatSimpleTable(archTable);
        
        AddHeading(document, "2.2 技術(shù)選型", "標題 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ù)庫";
        FormatSimpleTable(techTable);
        
        // 第三章 實施計劃
        AddHeading(document, "第三章 實施計劃", "標題 1");
        AddHeading(document, "3.1 時間安排", "標題 2");
        AddParagraph(document, "項目計劃分為以下幾個階段:");
        
        // 創(chuàng)建時間安排表格
        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 = "時間";
        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è)計";
        scheduleTable.Cell(3, 2).Range.Text = "第3-4周";
        scheduleTable.Cell(3, 3).Range.Text = "設(shè)計系統(tǒng)架構(gòu)和數(shù)據(jù)庫";
        scheduleTable.Cell(4, 1).Range.Text = "編碼實現(xiàn)";
        scheduleTable.Cell(4, 2).Range.Text = "第5-10周";
        scheduleTable.Cell(4, 3).Range.Text = "編寫代碼和單元測試";
        scheduleTable.Cell(5, 1).Range.Text = "測試部署";
        scheduleTable.Cell(5, 2).Range.Text = "第11-12周";
        scheduleTable.Cell(5, 3).Range.Text = "系統(tǒng)測試和上線部署";
        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();
        }
        // 添加一個空段落來結(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;
            }
        }
    }
}

注意事項

在使用 MudTools.OfficeInterop.Word 進行文檔自動化時,需要注意以下幾點:

資源管理

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

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

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

異常處理

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

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

Word 自動化操作可能會因為各種原因失敗,例如文件被占用、路徑不存在、權(quán)限不足等。通過適當(dāng)?shù)漠惓L幚恚梢源_保程序的穩(wěn)定性,并提供有用的錯誤信息。

性能優(yōu)化

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

  • 批量處理文檔時,重用 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} 時出錯: {ex.Message}");
            }
        }
    }
}

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

總結(jié)

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

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

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

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

相關(guān)文章

最新評論

保德县| 梁山县| 张家港市| 财经| 菏泽市| 赤城县| 阿瓦提县| 尼勒克县| 铁力市| 安化县| 宣汉县| 宿州市| 文水县| 综艺| 白朗县| 宝鸡市| 中超| 高陵县| 通江县| 三门峡市| 顺义区| 赣州市| 荣昌县| 东乌珠穆沁旗| 沁水县| 昌都县| 仙桃市| 阆中市| 香河县| 汝州市| 广丰县| 仁寿县| 伊金霍洛旗| 和田县| 舟曲县| 曲周县| 博湖县| 定结县| 香港| 偏关县| 高碑店市|