CSharp - 如何使用 C# 读取Excel文件的数据?

  显示原文与译文双语对照的内容

如何使用 C# 读取Excel文件? 我打开了一个Excel文件,读取和复制到剪贴板,然后用它去搜索电子邮件格式,但是,我不知道该怎么做。


FileInfo finfo;


Excel.ApplicationClass ExcelObj = new Excel.ApplicationClass();


ExcelObj.Visible = false;



Excel.Workbook theWorkbook;


Excel.Worksheet worksheet;



if (listView1.Items.Count> 0)


{


 foreach (ListViewItem s in listView1.Items)


 {


 finfo = new FileInfo(s.Text);


 if (finfo.Extension == ".xls" || finfo.Extension == ".xlsx" || finfo.Extension == ".xlt" || finfo.Extension == ".xlsm" || finfo.Extension == ".csv")


 {


 theWorkbook = ExcelObj.Workbooks.Open(s.Text, 0, true, 5, "", "", true, Excel.XlPlatform.xlWindows, "t", false, false, 0, true, false, false);



 for (int count = 1; count <= theWorkbook.Sheets.Count; count++)


 {


 worksheet = (Excel.Worksheet)theWorkbook.Worksheets.get_Item(count);


 worksheet.Activate();


 worksheet.Visible = false;


 worksheet.UsedRange.Cells.Select();


 }


 }


 }


}



时间:

好的

你不能像数组一样引用单元格Worksheet[0][0],它不会给你单元格A1内容,而是给你错误 ,这是要掌握Excel VSTO编程比较难理解的概念。即使在Excel打开时键入A1,您实际上也是在A1范围内输入数据。因此,你需要将单元格引用为命名范围 , 这是一个例子:


Excel.Worksheet sheet = workbook.Sheets["Sheet1"] as Excel.Worksheet; 


Excel.Range range = sheet.get_Range("A1", Missing.Value)



现在可以直接键入:


range.Text//this will give you the text the user sees


range.Value2//this will give you the actual value stored by Excel (without rounding)



如果你想执行类似此的操作:


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对象。

注:

  • 如果你没有设置可见性属性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:UsersChrisDesktopTestSheet.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)


 {


 //if you need to handle stuff


 Console.WriteLine(ex.Message);


 }


 finally


 {


 if (wkb!= null)


 ExcelTools.OfficeUtil.ReleaseRCM(wkb);



 if (excel!= null)


 ExcelTools.OfficeUtil.ReleaseRCM(excel);


 }


 }


 }


}



这里是您可能需要的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;


 }


 }



对于你的问题,你可以尝试以下:

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range.find(VS.80).aspx

cheers!

下面是一个例子


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;//give you the value found



下面是受这个


 range = sheet.Cells.Find("Value to find", Type.Missing, Type.Missing,Excel.XlLookAt.xlWhole,Excel.XlSearchOrder.xlByColumns,Excel.XlSearchDirection.xlNext,false, false, Type.Missing);



它有助于理解参数。

所有这些代码都来自我为工作编写的工具,它要求我每周一从实验室处理1000多个电子表格。

...