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.
没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥