如何使用VSTO顺利地从C#到Excel的数据,并返回

我正在为C#编写Excel的应用程序级别加载项。

该加载项用于从外部源获取数据(加载项为此提供了一些GUI选项等)到Excel中。 这些数据不会被更新并发送回数据源或类似的东西 – 虽然用户当然可以自由编辑本地Excel应用程序中的数据。

数据以XML格式到达,目前我已经使用代码生成工具能够将xml文档反序列化为C#对象。 数据遵循关系模型。

我现在想的事情是:

  • 我应该用DataTables翻译一切到DataSet对象?
  • 如果我已经这样做了,那么我怎样才能把这些数据导入Excel工作表? 是否有可能例如在excel和databind中创build一个表到我的数据表/数据集?
  • 真的,我不认为我想要一个“表”本身,但只是将数据放入单元格中,然后用户可以使用单元格。 提供二维数组是否更好? 但是从DataTable数据行转换到2D数组不是一件痛苦的事情吗?

还有一些其他的问题

  • 从Excel读取数据到C#的最简单/最好的方法是什么? 我想我大概会满意在这里得到二维数组。 但遍历“范围”对象似乎很麻烦。 必须有一些更好的方法?
  • 该工作表可能会在第一行有列名,然后在其余行中有数据。 当用户select组成我的“表”的单元格时,有什么办法让C#代码识别它? 或者这只是我将不得不在代码中手动处理?

如果有些问题看起来很愚蠢的话,我从来没有用过这个道歉。 任何帮助表示赞赏。

这里有一些例子,从我以前的工作,打开Excel中,并从Excel中获取数据:公共类ExcelModule {私人Excel.Application Excel中; 私人Excel.Workbook excelBook; 私人Excel.Worksheet excelSheet;

object misValue = System.Reflection.Missing.Value; object oMissing = System.Reflection.Missing.Value; public ExcelModule() { } public void OpenWorksheet(string fileName, int sheetNum) { excelApp = new Excel.Application(); excelBook = excelApp.Workbooks.Open(fileName, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); excelSheet = (Excel.Worksheet)excelBook.Worksheets.get_Item(sheetNum); } public string GetValue(string cellAddress) { if (excelSheet.get_Range(cellAddress, cellAddress).Value2 != null) return excelSheet.get_Range(cellAddress, cellAddress).Value2.ToString(); else return ""; } public int Close() { excelApp.Quit(); return 0; } ~ExcelModule() { excelApp.Quit(); } } 

要将数据写入Excel,您可以使用:

 excelSheet.get_Range(cellAddress, cellAddress).Value2 = "your text"; 

注意:*我正在使用Office2007的VS10

不知道为什么我的问题是downvoted …至less给出理由,下一次他们怎么会变得更好?

无论如何。 在我看来,最好的解决scheme是将我的数据放入DataSet中,然后在Excel应用程序中创build一个ListObject,并使用它的数据绑定function将我的数据导入到Excel中。

之前没有意识到这个伟大的控制。

在Excel中使用范围和二维数组将会给你带来更好的performance。 在这里,当您将传入的xml反序列化为对象时,不需要将其转换为数据集,然后转换为2d数组。 会推荐在你的代码层直接转换你的对象到二维数组,然后绑定到Excel表中的范围。 为了将读取的数据从范围读回到2d数组中,然后将其转换回到可以序列化的对象并将其发送回服务器。 现在,如何有效或精确地使用范围或数组将取决于工作表中数据的外观。 为了区分标题和数据,你可以看看命名的范围,这可能是有帮助的。

Excel表格(又名“ListObjects”)给你免费的格式,而且它们很容易使用。 相应的types是ListObject

你可以在LINQ中使用它们,而不必制造一个DataSet对象:

 ListObject myTable; // usually declared somewhere else, eg. via the designer var data = from x in myObjects select new { Foo = x.Foo, Bar = x.Bar }; myTable.SetDataBinding(data.ToList()); 

这将使用reflection来填充表格中的数据。 在上面的例子中,您将有两个名为Foo和Bar的列,以及您在myObjects具有多个元素的行。

当然,你可以使用更复杂的查询。 在你的情况下,使用Linq到XML可能是一个好主意。 关键是,你可以做一些你想要的东西。

此外,您可以将任何IList<object>放入SetDataBinding

Interesting Posts