好,
关于Excel VSTO编程,要掌握的更困难的概念之一是,您不会像数组那样引用单元格,Worksheet[0][0]
不会给您单元格A1,它会出错。即使在打开Excel的情况下键入A1,您实际上也在向范围A1输入数据。因此,您将单元格称为“命名范围”。这是一个例子:
Excel.Worksheet sheet = workbook.Sheets["Sheet1"] as Excel.Worksheet;
Excel.Range range = sheet.get_Range("A1", Missing.Value)
现在,您可以键入:
range.Text
range.Value2
如果您想做这样的事情:
Excel.Range range = sheet.get_Range("A1:A5", Missing.Value)
if (range1 != null)
foreach (Excel.Range r in range1)
{
string user = r.Text
string value = r.Value2
}
也许有更好的方法,但这对我有用。
之所以需要使用Value2
而不是使用Value
该Value
属性,是因为该属性已参数化,并且C#尚不支持它们。
至于清理代码,我将在明天上班时发布该代码,我没有代码,但这非常简单。您只需按照创建对象的相反顺序关闭并释放它们。您不能使用Using()
块,因为Excel.Application或Excel.Workbook没有实现IDisposable
,如果不清理,内存中将保留一个悬挂的Excel对象。
注意:
- 如果您未设置该
Visibility
属性,则不会显示Excel,这可能会使您的用户感到不安,但是如果您只想提取数据,那可能就足够了
- 您可以使用OleDb,也可以使用。
希望您能入门,如果需要进一步说明,请告诉我。我会发布一个完整的
这是一个完整的示例:
using System;
using System.IO;
using System.Reflection;
using NUnit.Framework;
using ExcelTools = Ms.Office;
using Excel = Microsoft.Office.Interop.Excel;
namespace Tests
{
[TestFixture]
public class ExcelSingle
{
[Test]
public void ProcessWorkbook()
{
string file = @"C:\Users\Chris\Desktop\TestSheet.xls";
Console.WriteLine(file);
Excel.Application excel = null;
Excel.Workbook wkb = null;
try
{
excel = new Excel.Application();
wkb = ExcelTools.OfficeUtil.OpenBook(excel, file);
Excel.Worksheet sheet = wkb.Sheets["Data"] as Excel.Worksheet;
Excel.Range range = null;
if (sheet != null)
range = sheet.get_Range("A1", Missing.Value);
string A1 = String.Empty;
if( range != null )
A1 = range.Text.ToString();
Console.WriteLine("A1 value: {0}", A1);
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
if (wkb != null)
ExcelTools.OfficeUtil.ReleaseRCM(wkb);
if (excel != null)
ExcelTools.OfficeUtil.ReleaseRCM(excel);
}
}
}
}
我明天将发布ExcelTools中的函数,我也没有该代码。
编辑:按照承诺,这是您可能需要的ExcelTools函数。
public static Excel.Workbook OpenBook(Excel.Application excelInstance, string fileName, bool readOnly, bool editable,
bool updateLinks) {
Excel.Workbook book = excelInstance.Workbooks.Open(
fileName, updateLinks, readOnly,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, editable, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing);
return book;
}
public static void ReleaseRCM(object o) {
try {
System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
} catch {
} finally {
o = null;
}
}
坦率地说,如果您使用VB.NET,则这些工作会容易得多。它在C#中,因为我没有编写它。VB.NET很好地处理了选项参数,而C#则做不到,因此是Type.Missing。连续两次键入Type.Miss后,您就会在房间中尖叫!
关于您的问题,您可以尝试执行以下操作:
http://msdn.microsoft.com/zh-CN/library/microsoft.office.interop.excel.range.find(VS.80).aspx
当我从会议回来时,我将举一个例子。
编辑:这是一个例子
range = sheet.Cells.Find("Value to Find",
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing,
Excel.XlSearchDirection.xlNext,
Type.Missing,
Type.Missing, Type.Missing);
range.Text;
这是另一个受本网站启发的示例:
range = sheet.Cells.Find("Value to find", Type.Missing, Type.Missing,Excel.XlLookAt.xlWhole,Excel.XlSearchOrder.xlByColumns,Excel.XlSearchDirection.xlNext,false, false, Type.Missing);
它有助于了解参数。
PS我是喜欢学习COM自动化的那些奇怪的人之一。所有这些代码都来自我为工作而编写的工具,该工具要求每个星期一从实验室处理1000多个电子表格。