object does not contain a definition for get_range

简介:

原因[1]

在VS2012中调用COM Interop DLL操作Excel通过get_Range去获取Range时,会发生Object does not contain a definition for get_Range的错误。其原因和解决方案:

Misha's explanation is correct - when using No PIA, methods returning object are treated as if they return dynamic in order to simulate the VBA semantics of COM Variants. Because the return value of sh.Cells is Object, sh.get_Range is dispatched dynamically, and the dynamic COM binder does not support the get_Range syntax exposed in C# before indexed properties were supported. We've tried to maintain backwards compatibility wherever possible when you turn on Embed Interop Types for a COM reference, but this is one place where some further tweaking is required.


The workaround you proposed will work - a cleaner workaround is the one Mike Rosenblum pointed out to use C# 4.0's new indexed properties syntax, which the dynamic COM binder does understand. You can then represent the operation with the following code:

Excel.Range r = sh.Range[sh.Cells[1, 1], sh.Cells[2, 2]];

See Also
get_Range method missing with embedded interop assembly

 

具体来讲[2]

由于Framework版本不同,因此支持的也不一样

例如:
在 .NET Framework 3.5 語法

Excel.Range r = sh.Range(sh.Cells[1, 1], sh.Cells[2, 2]);
在 .NET Framework 4.0-4.5 改用
Excel.Range r = sh.Range[sh.Cells[1, 1], sh.Cells[2, 2]];

 

winform导出Excel代码:

使用方法:    ExportExcel("条形码数据一览", GetSearchData);//GetSearchData可以传datatable 或者datagridview下面代码是传递Datatable的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/// <summary> 
           /// 查询的数据导出为Excel 
           /// </summary> 
           /// <param name="fileName">导出文件名</param> 
           /// <param name="myDGV">导出的datatable数据</param> 
           private  void  ExportExcel( string  fileName, MDataTable myDGV) 
          
                string  saveFileName =  ""
                SaveFileDialog saveDialog =  new  SaveFileDialog(); 
                saveDialog.DefaultExt =  "xls"
                saveDialog.Filter =  "Excel文件|*.xls"
                saveDialog.FileName = fileName; 
                saveDialog.ShowDialog(); 
                saveFileName = saveDialog.FileName; 
                if  (saveFileName.IndexOf( ":" ) < 0)  return //被点了取消 
                Microsoft.Office.Interop.Excel.Application xlApp =  new  Microsoft.Office.Interop.Excel.Application(); 
                if  (xlApp ==  null
               
                     MessageBox.Show( "无法创建Excel对象,可能您的机子未安装Excel" ); 
                     return
               
   
                Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks; 
                Microsoft.Office.Interop.Excel.Workbook workbook = 
  workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet); 
                Microsoft.Office.Interop.Excel.Worksheet worksheet = 
  (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1]; //取得sheet1 
   
   
                //写入标题 
                for  ( int  i = 0; i < myDGV.Columns.Count; i++) 
               
                     worksheet.Cells[1, i + 1] = myDGV.Columns[i].ColumnName; 
                     //标题 
                     Microsoft.Office.Interop.Excel.Range titleRange = worksheet.Range[worksheet.Cells[1, 1],  
worksheet.Cells[1, i + 1]]; //选中标题 
                     titleRange.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;  //水平居中 
               
                //写入数值 
                for  ( int  r = 0; r < myDGV.Rows.Count; r++) 
               
                     for  ( int  i = 0; i < myDGV.Columns.Count; i++) 
                    
                          worksheet.Cells[r + 2, i + 1] = myDGV.Rows[r][i].Value; 
                          //设置边框 
                          Microsoft.Office.Interop.Excel.Range allRange = worksheet.Range[worksheet.Cells[1, 1],  
worksheet.Cells[r + 1, i + 1]]; 
                          allRange.Borders.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous; 
                    
                     System.Windows.Forms.Application.DoEvents(); 
               
                //设置最后一行边框 
                Microsoft.Office.Interop.Excel.Range endRange = worksheet.Range[worksheet.Cells[1, 1],  
worksheet.Cells[myDGV.Rows.Count + 1,myDGV.Columns.Count]]; 
                endRange.Borders.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous; 
                worksheet.Columns.EntireColumn.AutoFit(); //列宽自适应 
                if  (saveFileName !=  ""
               
                     try 
                    
                          workbook.Saved =  true
                          workbook.SaveCopyAs(saveFileName); 
                    
                     catch  (Exception ex) 
                    
                          MessageBox.Show( "导出文件时出错,文件可能正被打开!\n"  + ex.Message); 
                    
   
               
                xlApp.Quit(); 
                GC.Collect(); //强行销毁 
                MessageBox.Show( "文件: "  + fileName +  ".xls 保存成功" "信息提示" , MessageBoxButtons.OK, MessageBoxIcon.Information); 
          

 

其他DataGridview导出Excel的资料:

http://www.360doc.com/content/11/1211/17/8147167_171489298.shtml  winform应用使用DataGridView数据导出到Excel

http://ruantnt.blog.163.com/blog/static/190525452201110185199346/  winform(c#) DataGridView导出Excel 
http://hi.baidu.com/wenshangang/item/1227f415fab1a35a2a3e229f  Winform中dataGridView控件导出到excel表格中

http://blog.sina.com.cn/s/blog_62cd5a980101905a.html  WinForm中DataGridView导出为Excel(快速版)

http://www.cr173.com/html/7906_1.html  WinForm下DataGridView导出Excel的实现

 

 

参考文章

1. ST@N 原文地址 How to: 解决 Object does not contain a definition for get_Range.

2.kongwei521, VS2013中Winform导出Excel文件时报“object”未包含“get_Range”的定义解决方法,2014-5.

 

 

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。




  本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/5787411.html,如需转载请自行联系原作者

相关文章
|
物联网 API JavaScript
数据中台驱动下的工业软件集成
当前大中型离散制造型企业信息化建设过程中,普遍存在数据交互复杂度高、基础数据语义多样化,以及升级维护难度大等痛点。本文引入阿里云数据总线、服务总线以及数字工厂等产品,探讨一种基于工业数据中台的工业软件集成解决方案。
3334 0
数据中台驱动下的工业软件集成
|
机器学习/深度学习 人工智能 物联网
《未来智能时代下的人工智能发展趋势与挑战》
【2月更文挑战第5天】随着人工智能技术的不断发展,我们迎来了智能时代的到来。本文将探讨人工智能在未来的发展趋势和面临的挑战,分析其在各个领域的应用前景和影响。
596 1
|
机器学习/深度学习 人工智能 分布式计算
编程语言未来发展趋势探析:简化与标准化、并发与分布式、智能应用新篇章
编程语言未来发展趋势探析:简化与标准化、并发与分布式、智能应用新篇章
290 1
|
人工智能 JavaScript 前端开发
最新季报!阿里云AI相关收入三位数增长
最新季报!阿里云AI相关收入三位数增长
268 1
时间序列分析实战(六):ARIMA乘法(疏系数)模型建模及预测
时间序列分析实战(六):ARIMA乘法(疏系数)模型建模及预测
|
消息中间件 存储 Kafka
Lindorm Ganos轨迹点快速聚合能力简介
本文介绍了Ganos时空数据库在Lindorm流引擎上的全新能力与最佳实践,帮助客户解决车辆网场景中轨迹点实时聚合生成轨迹线的能力。Lindorm Ganos实现了Lindorm宽表、流、计算等引擎在时空领域的打通,支持原生时空类型与多种时空算子,支持多种不同的时空索引,不仅可用于传统的周边查询,还面向了历史轨迹的查询分析、实时地理围栏查询、点面查询等更加复杂的业务需求。
|
安全 Java 测试技术
在线音乐播放系统的设计与实现(论文+源码)_kaic
在线音乐播放系统的设计与实现(论文+源码)_kaic
|
SQL 存储 Oracle
zyplayer-doc1.1.2发布,一款开源好用的WIKI文档管理系统
zyplayer-doc是一款现代化的适合团队和个人使用的WIKI文档管理工具,同时还包含数据库文档、Api接口文档 在线文档:zyplayer-doc使用文档 体验地址:http://doc.zyplayer.com 开源地址:https://gitee.com/zyplayer/zyplayer-doc 本此更新参与的社区贡献者: - diantu - Mdai - 〝走走停停 - handy - 护身法
801 1
zyplayer-doc1.1.2发布,一款开源好用的WIKI文档管理系统
|
存储 NoSQL 搜索推荐
【Redis从头学-7】Redis中的Set数据类型实战场景之用户画像去重、共同关注、专属粉丝
【Redis从头学-7】Redis中的Set数据类型实战场景之用户画像去重、共同关注、专属粉丝
471 0