通过反射调用EXCEL的get_Range方法

九章落地 2008-08-22 02:39:17
看过您的文章,受益良多:
http://blog.csdn.net/hbxtlhx/archive/2007/07/13/1688386.aspx

我想通过反射调用EXCEL的get_Range方法,以使用Excel.Range对象操作EXCEL,自己试了好久都没成功,特来请教前辈,请不吝赐教!
非常感谢!
...全文
1407 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
九章落地 2010-05-14
  • 打赏
  • 举报
回复
三易通软件(三易通服装进销存软件,三易通服装进销存管理软件,三易通服装进销存管理系统,三易通服装店管理软件,三易通服装店管理系统,三易通服装销售管理软件,三易通服装销售管理系统,三易通服装零售管理软件,三易通服装零售管理系统,三易通服装店软件,三易通服装店收银软件)
三易通服装进销存软件(服装店管理系统),非常简单好用的服装店软件!
三易通官网:http://www.3etsoft.cn
三易通软件(pos系统,收银软件,服装仓库管理软件,三易通服装零售软件,POS收银软件,三易通服装店收银软件,服装批发软件,三易通服装专卖店管理软件,服装营销管理系统,服装软件,鞋业销售管理软件,服装收银系统,三易通服装销售管理软件,鞋服管理软件,服装分销管理软件,服装营销软件,POS管理软件,三易通服装管理软件,三易通服装店软件,专卖店管理软件,三易通服装店管理系统,服装鞋帽软件,三易通服装进销存软件,鞋业软件,三易通服装店管理软件,服装进销存管理系统,服装鞋帽管理软件,三易通鞋店管理软件,服装鞋帽管理系统,服装分销系统,服装进销存系统,服装销售管理系统,服装库存管理软件)
三易通软件介绍:http://www.3etsoft.cn/Channel.Asp?ID=1
kslynn 2010-04-06
  • 打赏
  • 举报
回复
這個問題可以這樣解決.
MethodInfo mi = excel.GetType().GetMethod("get_Range");
Object range = mi.Invoke(excel, new Object[]{"A1", "A1"});
range.GetType().InvokeMember("Value2", BindingFlags.SetProperty, null, range, new Object[]{"TEST Strings"});
不妨一試.
atlasroben 2008-08-26
  • 打赏
  • 举报
回复
你需要的这个东西我这2天做了测试可能结果对你有帮助
http://blog.csdn.net/atlasroben/archive/2008/08/26/2831250.aspx
atlasroben 2008-08-22
  • 打赏
  • 举报
回复
对了猛然想起,n日前近身剪前辈的几张连续教学贴呀,绝对有帮助
http://blog.csdn.net/jinjazz/archive/2008/08/06/2775725.aspx
http://blog.csdn.net/jinjazz/category/407229.aspx
http://blog.csdn.net/jinjazz/archive/2008/08/01/2753869.aspx
仔细看看上面这方面的东西最近比较多,估计他最近正在搞excel这类的东西:)
atlasroben 2008-08-22
  • 打赏
  • 举报
回复
为什么不用ole试试?
九章落地 2008-08-22
  • 打赏
  • 举报
回复
cell遇到数据量大的时候,写入的速度会非常非常慢,所以我才想通过Range批量写入,若不能批量写入,我只能放弃此方法.

若通过晚绑定,又想批量写入数据,不知有什么好方法?
atlasroben 2008-08-22
  • 打赏
  • 举报
回复
刚才试了,get_Range调用的时候的确会报错,我怀疑是反射没有将这个方法获取到导致这个异常的,所以我建议你通过cell对象来进行写的操作
稍微修改了下你的代码,用下面的方法能够顺利写入数据没有问题
另:我在官方的vba资料中没有找到get_range方法,但是在调用对象的时候的确有这个方法,目前在我的项目中官方vba手册上提供的所有方法和属性,对象都能够顺利通过反射获取

object[] agr1 = new object[2] { 1, 1 };
object c1 = objSheet.GetType().InvokeMember("Cells", BindingFlags.GetProperty, null, objSheet, agr1);
object[] agr2 = new object[2] { 1, 1 };
object c2 = objSheet.GetType().InvokeMember("Cells", BindingFlags.GetProperty, null, objSheet, agr2);
c2.GetType().InvokeMember("Value2", BindingFlags.SetProperty, null, c2, new object[] { "hello" });
c1.GetType().InvokeMember("Value2", BindingFlags.SetProperty, null, c1, new object[] { "hello1" })
atlasroben 2008-08-22
  • 打赏
  • 举报
回复
能将你的测试demo发给我一个吗?我帮你测下
atlasroben@gmail.com
九章落地 2008-08-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 atlasroben 的回复:]
先在前面将cells1,cells反射得到然后再执行
get_Range
///下面手写的没测试过
range = excel.GetType().InvokeMember("get_Range", System.Reflection.BindingFlags.InvokeMethod, System.Type.DefaultBinder, excel, new object[]{cells1,cells2});

[/Quote]
我就是按您上面的法子调用,但总是提示"未知名称 异常"...
自己亦找不到原因,您有空最好能实际测试下.
谢谢
atlasroben 2008-08-22
  • 打赏
  • 举报
回复
先在前面将cells1,cells反射得到然后再执行
get_Range
///下面手写的没测试过
range = excel.GetType().InvokeMember("get_Range", System.Reflection.BindingFlags.InvokeMethod, System.Type.DefaultBinder, excel, new object[]{cells1,cells2});
atlasroben 2008-08-22
  • 打赏
  • 举报
回复
唉丫丫在5分钟前刚刚将这个word的东西调试完毕呀~~~~一样的excel一样的操作,vba的对象不同而已,都是反射嘿嘿正好蹭分啦,~~~
 private void button2_Click(object sender, EventArgs e)
{
//System.Data.DataRowView dr = (System.Data.DataRowView)this.comboBox1.SelectedItem;
//this.button2.Text = dr.Row.ItemArray[0].ToString();
return;
string x = @"d:\1.rtf";
string y = @"d:\2.rtf";
//开启一个word appliction对象
object wordapp;

Type wordType = Type.GetTypeFromProgID("Word.Application");
wordapp = Activator.CreateInstance(wordType);
funMergeRtf(x, y, wordapp);
wordapp.GetType().InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, System.Type.DefaultBinder, wordapp, null);
}
/// <summary>
/// 将第二个参数中的文件内容放入第一个参数里面
/// </summary>
/// <param name="strSource">存放的文件路径</param>
/// <param name="strTag">取内容的对象路径</param>
/// <param name="wordapp">已经打开的wordapplication对象</param>
private void funMergeRtf(string strSource, string strTag, object wordapp)
{
//由于项目中不引用word对象,同时为了使2003与2007的文档都能读取,而不因客户机的office版本影响程序操作word
//使用发射进行调用
//定义将要使用到的对象
object docSource;//源文档对象
object docTag;//目标文档对象
object documents;//appliction的文档集合
object range;//文本的范围对象
object paragraph;//文档的段落对象集合
object newparagraph;
//object savechanges//保存对象的枚举参数
object result;//结果
Type typeWord = wordapp.GetType();//设定对象类型
try
{
documents = typeWord.InvokeMember("Documents", System.Reflection.BindingFlags.GetProperty, System.Type.DefaultBinder, wordapp, null);//获取文档集合对象
docSource = documents.GetType().InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod, System.Type.DefaultBinder, documents, new object[] { strSource });//打开指定源文件并且获取对象
//docSource = typeDocuments.InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod, System.Type.DefaultBinder, documents, new object[] { strSource });//打开指定源文件并且获取对象
docTag = documents.GetType().InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod, System.Type.DefaultBinder, documents, new object[] { strTag });//打开指定源文件并且获取对象
range = docTag.GetType().InvokeMember("Content", System.Reflection.BindingFlags.GetProperty, System.Type.DefaultBinder, docTag, null);//获取目标rtf中的所有内容存放入range对象
paragraph = docSource.GetType().InvokeMember("Paragraphs", System.Reflection.BindingFlags.GetProperty, System.Type.DefaultBinder, docSource, null);//获取源rtf中的所有段落集合对象等待插入新段落
newparagraph = paragraph.GetType().InvokeMember("Add", System.Reflection.BindingFlags.InvokeMethod, System.Type.DefaultBinder, paragraph, null);//新建一个段落
paragraph.GetType().InvokeMember("Range", System.Reflection.BindingFlags.SetProperty, System.Type.DefaultBinder, newparagraph, new object[] { range });//将目标rtf中的内容放入源文档
docTag.GetType().InvokeMember("Close", System.Reflection.BindingFlags.InvokeMethod, System.Type.DefaultBinder, docTag, null);//关闭目标文档
docSource.GetType().InvokeMember("SaveAs", System.Reflection.BindingFlags.InvokeMethod, System.Type.DefaultBinder, docSource, new object[] { strSource });//在保存以后关闭源文档
docSource.GetType().InvokeMember("Close", System.Reflection.BindingFlags.InvokeMethod, System.Type.DefaultBinder, docSource, null);//关闭目标文档
}
catch
{

}






}

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧