C#操作WPS表格

方法1、后期绑定动态调用。通过System.Type动态创建对象,避免直接依赖 COM 引用:

using System;

using System.Runtime.InteropServices;

class Program

{

static void Main()

{

object wpsApp = Activator.CreateInstance(Type.GetTypeFromProgID("Ket.Application"));

dynamic excel = wpsApp;

excel.Visible = true;

dynamic workbook = excel.Workbooks.Add();

dynamic sheet = workbook.Sheets1;

sheet.Cells1, 1.Value = "Hello WPS!";

workbook.SaveAs("C:\\Test.xlsx");

workbook.Close();

excel.Quit();

Marshal.ReleaseComObject(excel);

}

}

方法2:在C#中通过COM操作WPS Excel文件时,需引用WPS安装目录下的etapi.dll文件,并使用对应的ProgID创建实例。

3、截图例子:

using System;

using System.Drawing;

using System.Drawing.Imaging;

using System.Runtime.InteropServices;

using System.Windows.Forms;

class Program

{

STAThread // 剪贴板操作需要STA线程

static void Main()

{

try

{

// 创建Excel/WPS实例

object wpsApp = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application") ??

Type.GetTypeFromProgID("Ket.Application"));

dynamic excel = wpsApp;

excel.Visible = true; // 必须可见才能截图

// 打开指定的Excel文件

string filePath = @"c:\1.xls";

dynamic workbook = excel.Workbooks.Open(filePath);

dynamic sheet = workbook.Sheets1;

// 选择要截图的区域(A1到P25)

dynamic range = sheet.Range("A1:P25");

range.Select();

// 复制为图片到剪贴板

range.CopyPicture(XlPictureAppearance.xlScreen, XlCopyPictureFormat.xlBitmap);

// 从剪贴板获取图片

if (Clipboard.ContainsImage())

{

Image img = Clipboard.GetImage();

// 保存图片到C盘

string savePath = @"C:\ExcelScreenshot.png";

img.Save(savePath, ImageFormat.Png);

Console.WriteLine($"截图已保存至:{savePath}");

}

// 清理资源

workbook.Close(false);

excel.Quit();

Marshal.ReleaseComObject(range);

Marshal.ReleaseComObject(sheet);

Marshal.ReleaseComObject(workbook);

Marshal.ReleaseComObject(excel);

}

catch (Exception ex)

{

Console.WriteLine($"错误发生:{ex.Message}");

}

finally

{

// 强制垃圾回收

GC.Collect();

GC.WaitForPendingFinalizers();

}

}

}

// 需要添加的COM引用

public enum XlPictureAppearance

{

xlScreen = 1,

xlPrinter = 2

}

public enum XlCopyPictureFormat

{

xlBitmap = 2,

xlPicture = -4147

}

4、截图例子:

using System;

using System.Drawing;

using System.Drawing.Imaging;

using System.Runtime.InteropServices;

using System.Windows.Forms;

class Program

{

STAThread

static void Main()

{

try

{

// 创建WPS实例

object wpsApp = Activator.CreateInstance(Type.GetTypeFromProgID("Ket.Application"));

dynamic excel = wpsApp;

excel.Visible = true; // 必须可见才能截图

// 打开现有工作簿

dynamic workbook = excel.Workbooks.Open(@"C:\1.xls");

dynamic sheet = workbook.Sheets1; // 获取第一个工作表

// 选择要截图的区域(A1到P25)

dynamic range = sheet.Range("A1:P25");

range.Select();

// 复制为图片到剪贴板

range.CopyPicture(XlPictureAppearance.xlScreen, XlCopyPictureFormat.xlBitmap);

// 从剪贴板获取图片

if (Clipboard.ContainsImage())

{

Image img = Clipboard.GetImage();

// 保存图片到C盘

string savePath = @"C:\ExcelScreenshot2.png";

img.Save(savePath, ImageFormat.Png);

Console.WriteLine($"截图已保存至:{savePath}");

}

// 清理资源

workbook.Close(false);

excel.Quit();

Marshal.ReleaseComObject(range);

Marshal.ReleaseComObject(sheet);

Marshal.ReleaseComObject(workbook);

Marshal.ReleaseComObject(excel);

}

catch (Exception ex)

{

Console.WriteLine($"错误发生:{ex.Message}");

}

finally

{

// 强制垃圾回收

GC.Collect();

GC.WaitForPendingFinalizers();

}

}

}

// 需要添加的COM引用

public enum XlPictureAppearance

{

xlScreen = 1,

xlPrinter = 2

}

public enum XlCopyPictureFormat

{

xlBitmap = 2,

xlPicture = -4147

}

5、

using System;

class Program

{

static void Main()

{

try

{

Type excelType = Type.GetTypeFromProgID("KWPS.Application"); // WPS表格的ProgID

if (excelType != null)

{

dynamic excelApp = Activator.CreateInstance(excelType);

excelApp.Visible = true; // 让WPS表格可见,以便观察

Console.WriteLine("WPS Excel COM 对象创建成功!按Enter退出...");

Console.ReadLine();

excelApp.Quit(); // 关闭WPS

}

else

{

Console.WriteLine("未找到 WPS Excel COM 组件注册。");

}

}

catch (Exception ex)

{

Console.WriteLine($"出错: {ex.Message}");

}

}

}

相关推荐
SimonKing42 分钟前
SSE、WebSocket 连接丢 Redis 里?那可踩大坑了!
java·后端·程序员
倔强的石头1061 小时前
【Linux指南】动静态库系列(九):动态库如何进入进程地址空间:从磁盘 .so 到共享内存映射
java·linux·服务器
海天鹰1 小时前
C#入门:在cmd显示字符
c#
TeamDev1 小时前
JxBrowser 9.5.2 版本发布啦!
java·前端·windows·chromium·混合应用·jxbrowser·浏览器控件
鬼手点金1 小时前
Claude Code示范案例-进阶学习路径
java·服务器·前端·学习·计算机视觉·前向传播
浪子明X1 小时前
用 CMake Presets 固定跨平台构建:从本地开发到 CI 的依赖一致性实践
java·spring·ci/cd
苏supper1 小时前
记一次Nacos鉴权报错unknown user,403排查|SecurityProxy源码,fastjson2扩展包缺失
java·后端
\光辉岁月/1 小时前
6.mybatisplus学习-BaseMapper、Service、常用注解
java·mybatis·mybatisplus
微信开发api1 小时前
基于WTAPI构建社群运营平台:自动拉群与会话承接链路设计
java·大数据·网络·数据库·微信·自动化
小七在进步1 小时前
类和对象(五)
java·开发语言·算法