由于要读取到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,关于内存释放的问题呢?
恳请熟悉这个方面的专家给一点意见或者资料,谢谢
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,关于内存释放的问题呢?
恳请熟悉这个方面的专家给一点意见或者资料,谢谢
把excel当作一个数据库处理
COM 操作excel 没用过 不好说
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;
去看一下吧!http://www.cnblogs.com/linfuguo/archive/2006/08/19/480976.html
而且相关Excel也必须有规律,不然太乱了也不好办!
2》还有默认EXCEL第一行为列名(这个要在DATAGRID属性里面,列要钩上运行时自动创建。不添加绑定列)
3》如果要在列中自己创建列,把列名自己定,然后导入后,读不出来,不显示!
4》就算读进去了,要是再拿个EXCEL表,读进去,怎么能够实现紧接着上一个EXCEL文件下面在DATAGRID中显示~
5》假如第一个EXCEL 有5个字段,第2个10个字段,读不读得进去,读进去有什么效果?唉,一连串的问题~不知道哪位大侠能帮忙解决~~~??小弟刚出道~~谢谢了~~