由于要读取到Excel表,所以上网看了2种解决方案1。 ADO.NET   string fileName=null;
if(DialogResult.OK==openFile.ShowDialog())
fileName=openFile.FileName; string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = "+fileName+";Extended Properties=Excel 8.0" ;
string strCmd="SELECT * FROM [Sheet1$]";
OleDbConnection con = new OleDbConnection(strCon);
try
{
con.Open();
OleDbCommand cmd=new OleDbCommand(strCmd,con);
OleDbDataAdapter da=new OleDbDataAdapter(cmd);
DataSet ds=new DataSet();
da.Fill(ds,"[Sheet1$]");


}
catch(Exception ex)
{
textBox1.Text=ex.Message;
}
finally
{
con.Close();
}2.  COM
    private void button1_Click(object sender, System.EventArgs e)
{
System.Threading.Thread t=new System.Threading.Thread(new System.Threading.ThreadStart(run));
t.Start();
runExcel();
}
private  void run()
{
runExcel();
GC.Collect();
}
private  void runExcel()
{
Excel.Application excel=new Excel.Application();
object va=Type.Missing;
excel.Application.Workbooks.Open(@"C:\hello.xls",va,va,va,va,va,va,va,va,va,va,va,va,va,va);

Excel.Worksheet sheet=new Excel.WorksheetClass();
Excel.Worksheet sheet=(Excel.Worksheet)excel.Worksheets[1];
Excel.Range r=(Excel.Range)sheet.UsedRange.Cells[1,1];
string s=r.Text.ToString(); 
textBox1.Text=s;
excel.Workbooks.Close();
excel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(r);
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
GC.Collect();
excel=null;
sheet=null;

}上面是2种实现代码,但是有如下问题:如果是ADO.NET 如果cell里面是日期,比如1990-1-1的话会返回1,那么延伸一下,对于Excel表里面的数据如果通过ado的方式读出来怎么对应数据类型和转换问题
使用ADO.NET还有一个问题就是会把Excel的第一行默认为 列名 这个问题怎么解决?如果是COM,关于内存释放的问题呢?
恳请熟悉这个方面的专家给一点意见或者资料,谢谢

解决方案 »

  1.   

    ADO.NET
    把excel当作一个数据库处理
    COM 操作excel 没用过 不好说
      

  2.   

    这不释放了内存么?
    excel.Workbooks.Close();
    excel.Quit();
    System.Runtime.InteropServices.Marshal.ReleaseComObject(r);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
    GC.Collect();
    excel=null;
    sheet=null;
      

  3.   

    我整合了个关于ExcelManager的管理类库,已经开源
    去看一下吧!http://www.cnblogs.com/linfuguo/archive/2006/08/19/480976.html
      

  4.   

    我建立你按照我开源的项目那个例子那样,写一个xml架构文档用于存放列名,这样就知道是什么了!
    而且相关Excel也必须有规律,不然太乱了也不好办!
      

  5.   

    我也遇到和楼主一样的问题,用得是第一种方法:1》ADO读出来的数据,有些丢失了,数据类型转换问题~~
    2》还有默认EXCEL第一行为列名(这个要在DATAGRID属性里面,列要钩上运行时自动创建。不添加绑定列)
    3》如果要在列中自己创建列,把列名自己定,然后导入后,读不出来,不显示!
    4》就算读进去了,要是再拿个EXCEL表,读进去,怎么能够实现紧接着上一个EXCEL文件下面在DATAGRID中显示~
    5》假如第一个EXCEL  有5个字段,第2个10个字段,读不读得进去,读进去有什么效果?唉,一连串的问题~不知道哪位大侠能帮忙解决~~~??小弟刚出道~~谢谢了~~