c# – 使用工作表作为数据源的VSTO Excel的简单示例

我想我遇到了一个“最简单的答案是找到最难的答案”,而且我没有遇到任何以直截了当的方式给我的搜索.这是针对现有的VSTO(C#)项目中的Excel 2010和VS 2010.

我有一个Excel工作表,其中包含4列数据,我想用作DataGridView的源.有人可以提供(1)从特定工作表获取数据并使用它填充自定义对象的C#代码片段? (2)将对象(如IEnumerable列表)绑定到Datagridview,以及(3)用于网格所固有的更新和删除功能的一些片段,并反馈给源工作表.

我知道我在这里要求很多,但是很多VSTO信息似乎是分开的,并不总是很容易找到.谢谢!

解决方法

编辑:很好,我只是注意到,我错过了大部分的问题,获取更新并删除了工作表.我完全不知道如果这是可能的,但我认为这使我的解决方案毫无价值.我会离开这里,也许它可以帮助任何方式.

为什么需要VSTO?据我所知,VSTO用于Office加载项.但是,由于您希望在DataGridView中显示数据,我假设您有一个WinForms应用程序应该只是访问一个工作簿.在这种情况下,您可以使用Office Interop简单地打开工作簿.只需将Microsoft.Office.Interop.Excel的引用添加到您的项目中,并使用Microsoft.Office.Interop.Excel添加;声明.

Excel Interop的MSDN参考文档可以在这里找到:http://msdn.microsoft.com/en-us/library/ms262200%28v=office.14%29.aspx

我会给你的Excel部分,也许别人可以做其余的.

首先,打开Excel和工作簿:

Application app = new Application();
// Optional,but recommended if the user shouldn't see Excel.
app.Visible = false;
app.ScreenUpdating = false;
// AddTomru parameter is optional,but recommended in automation scenarios.
Workbook workbook = app.Workbooks.Open(filepath,AddTomru: false);

然后以某种方式获取正确的工作表.你有几个可能性:

// Active sheet (should be the one which was active the last time the workbook was saved).
Worksheet sheet = workbook.ActiveSheet;
// First sheet (notice that the first is actually 1 and not 0).
Worksheet sheet = workbook.Worksheets[1];
// Specific sheet.
// Caution: Default sheet names differ for different localized versions of Excel.
Worksheet sheet = workbook.Worksheets["Sheet1"];

然后得到正确的范围.您没有指定如何知道所需数据的位置,所以我认为它是固定的列.

// If you also kNow the row count.
Range range = sheet.Range["A1","D20"];
// If you want to get all rows until the last one that has some data.
Range lastUsedCell = sheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell);
string columnName = "D" + lastUsedCell.Row;
Range range = sheet.Range["A1",columnName];

获取值:

// Possible types of the return value:
// If a single cell is in the range: Different types depending on the cell content
// (string,DateTime,double,...)
// If multiple cells are in the range: Two dimensional array that exactly represents
// the range from Excel and also has different types in its elements depending on the
// value of the Excel cell (should always be that one in your case)
object[,] values = range.Value;

然后可以将该二维对象数组用作DataGridView的数据源.我没有使用WinForms多年,所以我不知道你是否可以直接绑定,或者首先需要获取数据到一些特定的格式.

最后再次关闭Excel:

workbook.Close(SaveChanges: false);
workbook = null;
app.Quit();
app = null;
// Yes,we really want to call those two methods twice to make sure all
// COM objects AND all RCWs are collected.
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();

使用Interop后正确关闭Excel是一项任务,因为您必须确保所有对COM对象的引用已经被释放.我找到的最简单的方法是进行所有的工作,除了打开和关闭Excel和工作簿(所以我的第一个和最后一个代码块)在一个单独的方法.这样可以确保在调用Quit时,该方法中使用的所有COM对象都超出了范围.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...