请问关于excel不同版本调用问题

yejunteng 2007-12-05 04:06:02
excel2000和excel2003打开excel文件的方法参数不同,所以需要在程序里判断安装环境是2000还是2003,然后调用不同的方法.
问题有2个:
1.如何在C#中判断安装环境的excel版本;
2.如何让C#编译时忽略调用不同方法导致参数不匹配错误,如本机装2000,则编译时2003的方法肯定不能通过;
...全文
859 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
桃子 2011-07-13
  • 打赏
  • 举报
回复
谢谢,看完了,很有启发...
北京的雾霾天 2007-12-11
  • 打赏
  • 举报
回复
可以考虑动态调用Excel,从而避免因为版本不同而使用程序无法编辑或调试。可以参考下面的代码来动态的调用Excel功能:


private void button1_Click(object sender, EventArgs e)
{
object objApp;
object objBook;
object objBooks;
object objSheets;
object objSheet;
object objRange;
object objCells;
object[] Parameters;

try
{
// 获取Excel类型并建立其实例
Type objExcelType = Type.GetTypeFromProgID("Excel.Application");
if (objExcelType == null)
{
return;
}
objApp = Activator.CreateInstance(objExcelType);
if (objApp == null)
{
return;
}
//获取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);

try
{

//获取操作范围
for (int i = 1; i < 100; i++)
{
Parameters = new Object[2] { 1, i };
objCells = objSheet.GetType().InvokeMember("Cells", BindingFlags.GetProperty, null, objSheet, Parameters);
//向指定单元格填写内容值
Parameters = new Object[1] { "Hello, World!" };
objCells.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, objCells, Parameters);
}

}
catch (Exception operException)
{
MessageBox.Show(operException.Message);
}
finally
{
//不提示保存
Parameters = new Object[1] { false };
objApp.GetType().InvokeMember("DisplayAlerts", BindingFlags.SetProperty, null, objApp, Parameters);

//保存文件并退出
Parameters = new Object[1] { @"D:\a.xls" };
objBook.GetType().InvokeMember("SaveAs", BindingFlags.InvokeMethod, null, objBook, Parameters);
objApp.GetType().InvokeMember("Quit", BindingFlags.InvokeMethod, null, objApp, null);
GC.Collect();
}
}
catch (Exception theException)
{
String errorMessage;
errorMessage = "Error: ";
errorMessage = String.Concat(errorMessage, theException.Message);
errorMessage = String.Concat(errorMessage, " Line: ");
errorMessage = String.Concat(errorMessage, theException.Source);

MessageBox.Show(errorMessage, "Error");
}
}
laoshi10 2007-12-11
  • 打赏
  • 举报
回复
Excel._Workbook xlBook=xlApp.Workbooks.Open(filename,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing);
这段代码如何用反射来做?
跟下面差不多,但因为Open方法并不是xlApp的直接成员,不知道如何调用它?
-----------------分割線---------------------
object Workbooks = xlApp.GetType().GetProperty("Workbooks").GetValue(xlApp, null);
MethodInfo method = Workbooks.GetType().GetMethod("Open");
Excel._Workbook xlBook = (Excel._Workbook)method.Invoke(Workbooks, new object[]{"filename",
Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value, Missing.Value,});
yejunteng 2007-12-11
  • 打赏
  • 举报
回复
非常感谢laoshi10 & hbxtlhx !
龙宜坡 2007-12-09
  • 打赏
  • 举报
回复
楼上有的读,那写呢?
wwsoso 2007-12-09
  • 打赏
  • 举报
回复

纯C#代码的Excel读取源代码
2007-12-8 21:31:01
本代码使用纯C#编写,不需要Office Excel Com组件的支持,它的功能包括:读出在工作簿(workbook)中的所有Worksheet,读出所有WorkSheet中的单元,读取单元的内容(文本,数字,日期或错误),读取单元的格式(字体,对齐,线条类型,背景等),够读取文件中的图片,获取图象的大小,位置,数据和格式
yejunteng 2007-12-07
  • 打赏
  • 举报
回复
请问:
Excel._Application xlApp=new Excel.ApplicationClass();
object missing=Type.Missing;
Excel._Workbook xlBook=xlApp.Workbooks.Open(filename,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing);
这段代码如何用反射来做?
跟下面差不多,但因为Open方法并不是xlApp的直接成员,不知道如何调用它?

Type t = typeof(Excel.ApplicationClass);
Object xlApp=t.InvokeMember(null,BindingFlags.DeclaredOnly|BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.CreateInstance,null,null,null);
Object[] args = new Object[]{filename,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing};
Excel._Workbook xb=(Excel._Workbook)t.InvokeMember("Open",BindingFlags.Default|BindingFlags.InvokeMethod,null,xlApp,args);

解决上面问题马上给分,谢谢!

yejunteng 2007-12-06
  • 打赏
  • 举报
回复
我用的是2003,公司大部分用户使用的也是2003,但有台服务器因历史原因一直使用2000,我又不方便在2000环境下编译,各位能不能给个具体点的办法?
zhbo2001 2007-12-06
  • 打赏
  • 举报
回复
为每个版本做一个dll,然后在程序里,根据版本,使用动态加载程序集的方法。
dmhaifeng 2007-12-06
  • 打赏
  • 举报
回复
程序是死的,人是活的;不给程序指路,想让它自己走,貌似不太可能!
建议楼主去写重载方法!
大道至简VP 2007-12-06
  • 打赏
  • 举报
回复
做一个中间层,根据不同的excel版本,调用不同的接口。
曲滨_銘龘鶽 2007-12-05
  • 打赏
  • 举报
回复
com 应该是向下兼容的尤其是ms 的
你因用 2000 的在 2003 下应该不会出问题
但是如果引用 2003 的就不好说了

就像用 ado1.5 的编译完vb程序现在还好用一样!
yejunteng 2007-12-05
  • 打赏
  • 举报
回复
第一个问题应该没问题;
第二个问题,如何调用不同方法而编译不出问题?
shrinerain 2007-12-05
  • 打赏
  • 举报
回复
新建Excel实例以后, 检查.Version属性就可以了
falx2004 2007-12-05
  • 打赏
  • 举报
回复
1 通过读注册表 找到安装目录
2 找到execl的组件或者.exe
3 通过Fileversion.getversion方法获取版本
4 通过判断版本调用不同方法

111,125

社区成员

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

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

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