c# 反射 调用excel 请高人指点

pbc1984 2008-11-17 08:47:35
object hrexcel;

Type excelType = Type.GetTypeFromProgID("Excel.Application");
hrexcel = Activator.CreateInstance(excelType);
SetObjPeoperty(hrexcel,"Visible","true");
SetObjPeoperty(hrexcel,"UserControl","true");
object workbooks=GetObjPeoperty(hrexcel,"Workbooks");
object xBk =CallObjMethod(workbooks,"Add",new object[]{true});
object excelSheet=GetObjPeopertyWithParam(xBk,"Worksheets",new object[]{1});
object[] agr2 = new object[2] { 1, 1 };
object excelcellcell=GetObjPeopertyWithParam(excelSheet,"Cells",agr2);

为什么最后这个方法一直提示 未知的名称 ?请大家帮忙
...全文
305 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
特别 2009-01-14
  • 打赏
  • 举报
回复
接上面

//选择
oType = execelRange.GetType();
oType.InvokeMember("Select",
System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Default,
null, execelRange, null);
特别 2009-01-14
  • 打赏
  • 举报
回复

Type oType = null;

object hrexcel;

Type excelType = Type.GetTypeFromProgID("Excel.Application");
hrexcel = Activator.CreateInstance(excelType);

oType = hrexcel.GetType();

//SetObjPeoperty(hrexcel, "Visible", "true");
oType.InvokeMember("Visible", System.Reflection.BindingFlags.SetProperty | BindingFlags.Default, null, hrexcel, new object[] { true });

//SetObjPeoperty(hrexcel, "UserControl", "true");
oType.InvokeMember("UserControl", System.Reflection.BindingFlags.SetProperty | System.Reflection.BindingFlags.Default, null, hrexcel, new object[] { true });

//object workbooks = GetObjPeoperty(hrexcel, "Workbooks");
object workbooks = oType.InvokeMember("Workbooks", System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Default, null, hrexcel, null);

//object xBk = CallObjMethod(workbooks, "Add", new object[] { true });
oType = workbooks.GetType();
object xBk = oType.InvokeMember("Add", System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Default, null, workbooks, new object[] { true });

//object excelSheet = GetObjPeopertyWithParam(xBk, "Worksheets", new object[] { 1 });
oType = xBk.GetType();
object excelSheet = oType.InvokeMember("Worksheets",
System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Default,
null, xBk, new object[] { 1 });
object[] agr2 = new object[2] { 1, 1 };

//该方法可以正常执行
//object excelcellcell = GetObjPeopertyWithParam(excelSheet, "Cells", agr2);
object excelcellcell = oType.InvokeMember("Cells",
System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Default,
null, excelSheet, agr2);

//如果用反射的话,没有get_Range方法,只有Range方法
object execelRange = oType.InvokeMember("Range",
System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Default,
null, excelSheet, new object[] { "A1:A3" });

//选择
oType = execelRange.GetType();
oType.InvokeMember("Select",
System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Default,



未发现楼主最后一行代码不能执行
然后
如果用反射的话,没有get_Range方法,只有Range方法
WaZi1984 2009-01-14
  • 打赏
  • 举报
回复
object excelcellcell=GetObjPeopertyWithParam(excelSheet,"Cells",agr2);

改成

object excelcellcell=GetObjPeopertyWithParam(hrexcel,"Cells",agr2);
Jack123 2008-11-18
  • 打赏
  • 举报
回复
up
pbc1984 2008-11-18
  • 打赏
  • 举报
回复
由于考虑到不同的版本 所以想用反射来实现

object objApp;
object objBook;
object objBooks;
object objSheets;
object objSheet;
//object objRange;
object objCells;
object[] Parameters;
object Cells1;
object Cells2;
object range;

Type objExcelType = Type.GetTypeFromProgID("Excel.Application");
if (objExcelType == null)
{
return;
}
objApp = Activator.CreateInstance(objExcelType);
if (objApp == null)
{
return;
}

//设置属性

SetObjPeoperty(objApp,"Visible","true");
SetObjPeoperty(objApp,"UserControl","true");


//获取Workbook集
objBooks = objApp.GetType().InvokeMember("Workbooks", BindingFlags.GetProperty, null, objApp, null);


//添加一个新的Workbook
objBook = objBooks.GetType().InvokeMember("Add", BindingFlags.InvokeMethod, null, objBooks, null);

//获取Sheet集
objSheets = objBook.GetType().InvokeMember("Worksheets", BindingFlags.GetProperty, null, objBook, null);

//获取第一个Sheet对象
Parameters = new Object[1] { 1 };
objSheet = objSheets.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, objSheets, Parameters);
for (int j=0; j<dataArray.GetLength(1);j++)
{
switch(dt.Columns[j].DataType.ToString())
{
case "System.String":
formatstring="@";
break;
case "System.DateTime":
formatstring="yyyy-mm-dd";
break;
default:
formatstring="G/通用格式";
break;
}
for(int k=0;k<dataArray.GetLength(0);k++)
{
Parameters = new Object[2] { startRow+k, startCol+j}; //test
Cells1= objSheet.GetType().InvokeMember("Cells",BindingFlags.GetProperty, null, objSheet, Parameters);
SetObjPeoperty(Cells1,"NumberFormatLocal",formatstring);
SetObjPeoperty(Cells1,"Value2",dataArray[k,j]);

}
}

这样是可以的 但是有个问题 为什么的worksheet的get_Range方法通过反射不能调用?msdn 说不适合写代码 不明白具体原因 cell 填充太慢了
sendy_dou 2008-11-17
  • 打赏
  • 举报
回复
如二楼为什么不直接用呢?

WorkSheets.Cells 返回
public interface Range
Member of Microsoft.Office.Interop.Excel
.net提示 无法解析这个类型!
pbc1984 2008-11-17
  • 打赏
  • 举报
回复
private static object GetObjPeopertyWithParam(object Obj, string member,object Params)
{
// Assumes a using statement in the file:
// using System.Reflection;
Type objType = Obj.GetType();
return objType.InvokeMember(member,
BindingFlags.Default |
BindingFlags.GetProperty,
null, Obj, new object[] {Params});
}


没有引用啊 需要用反射
pbc1984 2008-11-17
  • 打赏
  • 举报
回复
private static object GetObjPeopertyWithParam(object Obj, string member,object Params)
{
// Assumes a using statement in the file:
// using System.Reflection;
Type objType = Obj.GetType();
return objType.InvokeMember(member,
BindingFlags.Default |
BindingFlags.GetProperty,
null, Obj, new object[] {Params});
}


没有引用啊 需要用反射
wjq 2008-11-17
  • 打赏
  • 举报
回复
我很莫名,你已经引用了Excel的com了,为什么还要反射.....
哪个方法? GetObjPeopertyWithParam? 你当前的类里定义过这个函数了?
_空指针_ 2008-11-17
  • 打赏
  • 举报
回复
不懂,学习

110,567

社区成员

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

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

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