C# 脚本 连接 不上 wps 表格

使用问题 · 31 次浏览
蔚蓝的天空 创建于 3小时42分钟前

功能 是 对当前活动的wps表格进行操作: 在1行前面插入1行, 在C列前面插入2列, C2单元格赋值“类型”,D2单元格赋值“排重“。

老提示连不上wps 表格,各位高手看看,怎么修改一下。还是我的电脑有问题,

 

using System;
using System.Runtime.InteropServices;

public static void Exec(Quicker.Public.StepContext context)
{
    object wpsApp = null;
    object activeSheet = null;

    try
    {
        // ==== 1. 连接逻辑(与成功测试脚本完全一致)====
        // 只尝试获取已运行的实例,不再尝试创建新实例,以保持与测试行为一致。
        string[] progIds = { "KET.Application", "ET.Application", "Excel.Application" };
        bool connected = false;

        foreach (string progId in progIds)
        {
            try
            {
                wpsApp = Marshal.GetActiveObject(progId);
                connected = true;
                break; // 成功即退出
            }
            catch (COMException)
            {
                // 连接失败,继续尝试下一个
            }
        }

        if (!connected || wpsApp == null)
        {
            // 如果循环结束都未连接成功,直接抛异常
            throw new Exception("无法连接到正在运行的WPS表格。\n请确保:\n1. WPS表格窗口已打开并处于活动状态\n2. 已打开一个工作簿文件\n3. 可尝试重启WPS表格程序再试");
        }

        // ==== 2. 获取活动工作表 ====
        Type appType = wpsApp.GetType();
        activeSheet = appType.InvokeMember("ActiveSheet",
            System.Reflection.BindingFlags.GetProperty, null, wpsApp, null);

        if (activeSheet == null)
        {
            throw new Exception("已连接,但未找到活动工作表。请确保WPS中打开了工作簿。");
        }

        Type sheetType = activeSheet.GetType();

        // ==== 3. 执行表格操作 ====
        // a. 在第1行前插入1行
        object rows = sheetType.InvokeMember("Rows",
            System.Reflection.BindingFlags.GetProperty, null, activeSheet,
            new object[] { "1:1" });
        rows.GetType().InvokeMember("Insert",
            System.Reflection.BindingFlags.InvokeMethod, null, rows, null);
        Marshal.ReleaseComObject(rows);

        // b. 在C列前插入2列
        for (int i = 0; i < 2; i++)
        {
            object columns = sheetType.InvokeMember("Columns",
                System.Reflection.BindingFlags.GetProperty, null, activeSheet,
                new object[] { "C:C" });
            columns.GetType().InvokeMember("Insert",
                System.Reflection.BindingFlags.InvokeMethod, null, columns, null);
            Marshal.ReleaseComObject(columns);
        }

        // c. 为C2和D2单元格赋值
        object cellC2 = sheetType.InvokeMember("Cells",
            System.Reflection.BindingFlags.GetProperty, null, activeSheet,
            new object[] { 2, 3 }); // C2
        cellC2.GetType().InvokeMember("Value",
            System.Reflection.BindingFlags.SetProperty, null, cellC2,
            new object[] { "类型" });
        Marshal.ReleaseComObject(cellC2);

        object cellD2 = sheetType.InvokeMember("Cells",
            System.Reflection.BindingFlags.GetProperty, null, activeSheet,
            new object[] { 2, 4 }); // D2
        cellD2.GetType().InvokeMember("Value",
            System.Reflection.BindingFlags.SetProperty, null, cellD2,
            new object[] { "排重" });
        Marshal.ReleaseComObject(cellD2);

        // ==== 4. 操作完成 ====
        throw new Exception("✅ 操作成功完成!\n1. 已在第1行前插入1行\n2. 已在C列前插入2列\n3. C2已赋值'类型'\n4. D2已赋值'排重'");
    }
    catch (Exception ex)
    {
        throw new Exception("表格操作结果:\n" + ex.Message);
    }
    finally
    {
        // ==== 5. 清理COM对象 ====
        if (activeSheet != null)
        {
            try { Marshal.ReleaseComObject(activeSheet); } catch { }
        }
        if (wpsApp != null)
        {
            try { Marshal.ReleaseComObject(wpsApp); } catch { }
        }
    }
}


回复内容
涛涛涛 3小时5分钟前
#1

你试试看用这样的方式可以控制wps表格不,如果可以就按这样试着修改一下
调用wps表格,将二维数组或函数公式写入单元格 - Quicker

回复主贴