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

相关推荐
剩下了什么15 小时前
float32 与 float64 精度陷阱:如何在 Go 中避免错误使用
开发语言·后端·golang
指尖时光.15 小时前
Three.js 超全入门综合案例
开发语言·javascript·ecmascript
暴力求解16 小时前
Linux网络---传输层协议TCP(二)
linux·服务器·开发语言·网络·tcp/ip
吴声子夜歌16 小时前
Java面试题——基础(一)
java·开发语言
小庞在加油16 小时前
WinDbg实战:QT/跨平台项目死锁与无响应问题排查指南
开发语言·qt·windbg·工具
Vae_Mars17 小时前
C#中的delegate委托
开发语言·c#
一直走下去-明17 小时前
简单的http抓包解包完整代码
开发语言·python
caimouse17 小时前
ReactOS 图形系统分析(51):元文件子系统 — metafile.c
c语言·开发语言
学习星球18 小时前
Solid.js 实战:拆解官方 RealWorld 项目
开发语言·javascript·vue.js
OPEN-F18 小时前
Python进阶教程:正则表达式进阶与文本处理
开发语言·python·正则表达式