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

相关推荐
疯狂的喵5 小时前
C++编译期多态实现
开发语言·c++·算法
2301_765703145 小时前
C++中的协程编程
开发语言·c++·算法
m0_748708055 小时前
实时数据压缩库
开发语言·c++·算法
lly2024066 小时前
jQuery Mobile 表格
开发语言
惊讶的猫6 小时前
探究StringBuilder和StringBuffer的线程安全问题
java·开发语言
m0_748233176 小时前
30秒掌握C++核心精髓
开发语言·c++
Fleshy数模7 小时前
从数据获取到突破限制:Python爬虫进阶实战全攻略
java·开发语言
Duang007_7 小时前
【LeetCodeHot100 超详细Agent启发版本】字母异位词分组 (Group Anagrams)
开发语言·javascript·人工智能·python
froginwe117 小时前
Redis 管道技术
开发语言
u0109272717 小时前
C++中的RAII技术深入
开发语言·c++·算法