wordVSTO插件实现自动填充序号

wordVSTO插件实现自动填充序号

开发环境:VS2022

核心代码如下:

python 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Word = Microsoft.Office.Interop.Word;
using Office = Microsoft.Office.Core;
using Microsoft.Office.Tools.Word;

namespace WordAddIn1
{
    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }

        protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
        {
            return new 鑫鑫Ribbon();
        }

        #region VSTO 生成的代码

        /// <summary>
        /// 设计器支持所需的方法 - 不要修改
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
        }
        
        #endregion
    }

    [ComVisible(true)]
    [Guid("A1B2C3D4-E5F6-7890-ABCD-EF1234567890")]
    public class 鑫鑫Ribbon : Office.IRibbonExtensibility
    {
        private Office.IRibbonUI ribbon;

        public string GetCustomUI(string ribbonID)
        {
            // 确保返回有效的Ribbon XML
            string ribbonXml = @"<customUI xmlns='http://schemas.microsoft.com/office/2009/07/customui' onLoad='OnLoad'>
    <ribbon>
        <tabs>
            <tab id='XinXinTab' label='鑫鑫工具箱' insertAfterMso='TabHome'>
                <group id='XinXinGroup' label='表格工具'>
                    <button id='btnFillNumbers' 
                            label='自动填充序号' 
                            size='large'
                            onAction='OnFillNumbersClick'
                            imageMso='Numbering'/>
                </group>
            </tab>
        </tabs>
    </ribbon>
</customUI>";
            
            // 记录日志以便调试
            try
            {
                System.IO.File.WriteAllText(System.IO.Path.Combine(System.IO.Path.GetTempPath(), "RibbonDebug.log"), 
                    $"Ribbon XML generated at {DateTime.Now}: {ribbonXml}");
            }
            catch { }
            
            return ribbonXml;
        }

        public void OnFillNumbersClick(Office.IRibbonControl control)
        {
            try
            {
                Word.Application wordApp = Globals.ThisAddIn.Application;
                Word.Selection selection = wordApp.Selection;
                
                // 检查是否选中了表格
                if (selection.Range.Tables.Count > 0)
                {
                    Word.Table selectedTable = selection.Range.Tables[1];
                    FillTableWithNumbers(selectedTable);
                    MessageBox.Show($"已为选中的表格填充序号,共 {selectedTable.Rows.Count} 行", "成功", 
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    // 如果没有选中表格,检查文档中的所有表格
                    Word.Document doc = wordApp.ActiveDocument;
                    if (doc.Tables.Count > 0)
                    {
                        int totalTables = 0;
                        foreach (Word.Table table in doc.Tables)
                        {
                            FillTableWithNumbers(table);
                            totalTables++;
                        }
                        MessageBox.Show($"已为文档中的 {totalTables} 个表格填充序号", "成功", 
                            MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        MessageBox.Show("文档中没有找到表格!", "提示", 
                            MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"填充序号时出错: {ex.Message}", "错误", 
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void FillTableWithNumbers(Word.Table table)
        {
            for (int i = 1; i <= table.Rows.Count; i++)
            {
                try
                {
                    table.Cell(i, 1).Range.Text = i.ToString();
                }
                catch
                {
                    // 如果第一列不存在或无法访问,跳过该行
                }
            }
        }

        public void OnLoad(Office.IRibbonUI ribbonUI)
        {
            this.ribbon = ribbonUI;
            try
            {
                System.IO.File.AppendAllText(System.IO.Path.Combine(System.IO.Path.GetTempPath(), "RibbonDebug.log"), 
                    $"Ribbon loaded at {DateTime.Now}\r\n");
            }
            catch { }
        }
    }
}

工程源码文件:https://download.csdn.net/download/weixin_43050480/91997447

相关推荐
9***P3346 分钟前
PHP代码覆盖率
开发语言·php·代码覆盖率
CoderYanger12 分钟前
优选算法-栈:67.基本计算器Ⅱ
java·开发语言·算法·leetcode·职场和发展·1024程序员节
jllllyuz26 分钟前
Matlab实现基于Matrix Pencil算法实现声源信号角度和时间估计
开发语言·算法·matlab
多多*41 分钟前
Java复习 操作系统原理 计算机网络相关 2025年11月23日
java·开发语言·网络·算法·spring·microsoft·maven
p***43481 小时前
Rust网络编程模型
开发语言·网络·rust
ᐇ9591 小时前
Java集合框架深度实战:构建智能教育管理与娱乐系统
java·开发语言·娱乐
梁正雄2 小时前
1、python基础语法
开发语言·python
强化学习与机器人控制仿真2 小时前
RSL-RL:开源人形机器人强化学习控制研究库
开发语言·人工智能·stm32·神经网络·机器人·强化学习·模仿学习
百***48072 小时前
【Golang】slice切片
开发语言·算法·golang
q***92512 小时前
Windows上安装Go并配置环境变量(图文步骤)
开发语言·windows·golang