当前位置: 首页 > news >正文

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,如需转载请自行联系原作者

相关文章:

  • 【我的《冒号课堂》学习笔记】设计模式(3)行为模式
  • 一行时间的输出
  • android wifi SWOL低功耗模式
  • 3287 货车运输
  • Windows SQL2008数据库系列一数据的导入导出
  • dataTable 查询,重置
  • Jsoup学习总结
  • 工作步骤
  • linux分区,磁盘系统的管理,文件系统制作
  • H5上传图片前端预览显示
  • 大型企业网络配置系列课程详解(六) --PPP链路的配置与相关概念的理解
  • 2、使用vmware虚拟机安装Linux(以redhat5.8为例)中常见问题
  • C字符串与NSString之间的转换
  • 集合(三)CopyOnWriteArrayList
  • linux基础,zip、tar
  • [译]前端离线指南(上)
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Java教程_软件开发基础
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • JS函数式编程 数组部分风格 ES6版
  • js中forEach回调同异步问题
  • Vue 2.3、2.4 知识点小结
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 前端代码风格自动化系列(二)之Commitlint
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​MySQL主从复制一致性检测
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (14)Hive调优——合并小文件
  • (2)nginx 安装、启停
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (九)c52学习之旅-定时器
  • (五)MySQL的备份及恢复
  • (转)EXC_BREAKPOINT僵尸错误
  • (转载)hibernate缓存
  • ***监测系统的构建(chkrootkit )
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .apk 成为历史!
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .net MySql
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [ C++ ] 继承
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)
  • [BZOJ2850]巧克力王国