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

相关推荐
CodeYp20192 分钟前
第19讲:封装红黑树实现 mymap 和 myset
开发语言·c++·红黑树
超级架构师1 小时前
让 COBOL 长出 AI 大脑:原生 Agent 核心框架 praxo-core 深度剖析
c语言·开发语言·c++·人工智能·python·架构·ai编程
Non-existent9871 小时前
在 WPS/Excel 里做地理数据处理:功能市场 + 奥维 / Google Earth / QGIS 三种跳转实战
开发语言·javascript·ecmascript
xiaolang_8616_wjl1 小时前
c++游戏_宝可梦大世界(源代码)
开发语言·c++·游戏
Leinwin2 小时前
Copilot Studio 实战:多模型选择、GitHub Copilot harness 计费与 Copilot Credits 额度管理
开发语言·c#
余额瞒着我当琳2 小时前
C++异常,异常的概念,异常抛出与捕获,RAII 和智能指针的设计思路,C++标准库一些指针的使用
java·开发语言·c++·算法
严谨的麻辣烫2 小时前
固定 IP 稳定性如何检测?使用 Python 实现网络连通性与耗时监控
开发语言·数据库·php
FuckPatience2 小时前
C# Winform 使用Label循环显示闪烁
开发语言·c#
念何架构之路2 小时前
OpenTelemetry核心概念
后端·目标跟踪·golang·c#·linq