C#读取excel指定行的某些数据问题?

HNLGDXYJS 2009-03-23 05:25:02
大家好,我想问一下怎么实现C#读取excel指定行的某些数据到datagirdview问题?
我有一个想法,分2步:
(1)首先定位要读取的是哪行,比如excel表里有一个列名为 A,我想定位到A列里值为 220的这一行...用语句怎么实现?
(2)读取上述指定行的某些数据,用FOR循环?
for (开始到结束)  //怎么开始,到何处结束?
{
if (读取的内容) read; // 读取的内容为"与指定的列号相同" 比如要读取列名分别为B,C的内容..
else continue;
}

这样可行不?用C#语句我不会写,大家可否花一点时间帮我写一下,谢谢了...

btw:正在看VBA,从图书馆借了一本书,看不懂,晕...
...全文
3407 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
HNLGDXYJS 2009-03-25
  • 打赏
  • 举报
回复

string MyExcel = "2008毕业生档案投递正稿.xls";
DataTable dt = new DataTable();
string strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=YES;IMEX=1;';" + "Data Source=" + MyExcel + ";";
OleDbConnection connection = new OleDbConnection(strConnection);
connection.Open();
try
{
string str = "Select * from [Sheet1$] where F1='220'";
OleDbDataAdapter adapter = new OleDbDataAdapter(str, connection);
adapter.Fill(dt);
}
catch
{
dt = null;
}
finally
{
connection.Close();
}


DataRow[] dr = dt.Select(" F1='220'");//找到你需要的行



DataRow[] dr = dt.Select(" F1='220'"); 这句调试时有错,
Object reference not set to an instance of an object.
有谁愿意解释下吗?
谢谢...

HNLGDXYJS 2009-03-25
  • 打赏
  • 举报
回复
DataRow[] dr = dt.Select(" F1='220'"); 这句调试时有错,
Object reference not set to an instance of an object.
有谁愿意解释下吗?

是这句本身有错,还是我自已的原因...
谢谢...
HNLGDXYJS 2009-03-24
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 stonehy520 的回复:]
应该就和读取DataTable一样
[/Quote]
谢谢,能否给几句代码?

比如我在一个textbox输入查找的学号,然后找到该学号所在行读取数据...

大家不要怪我开口闭口要代码啊,说实话,C#我很菜,可面对这么严峻的就业形势,我不敢对我并不擅长的东西花太多时间,所以才想在这,希望通过大家的力量来解决...

如果我的观点不对,大家也可以说出来,学习嘛,能进步是最重要的..
谢谢大家..
stonehy520 2009-03-24
  • 打赏
  • 举报
回复
应该就和读取DataTable一样
HNLGDXYJS 2009-03-24
  • 打赏
  • 举报
回复
小up一下,大家给点意见也行啊..谢谢..
HNLGDXYJS 2009-03-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sunshine_anycall 的回复:]
for (int i = 0; i < data.Tables[0].Rows[0].ItemArray.Length; i++)
{
str += data.Tables[0].Rows[0].ItemArray[i].ToString() + ".";
}
[/Quote]

回复sunshine_anycall,你帮我写的这个循环只是读取第0行的内容,不是寻找特定行的啊...
我的意思是我想通过查找,然到特定行(比如我有一列名为:学号,我想找学号为10001的学生),然后再读取那行的某些内容,把读到内容分别保存起来,比如保存到一个数组里,这样方便我以后读取内容...我上面没说清,不好意思..
可不可以麻烦sunshine_anycall或大家再帮我写一下..非常感谢

谢谢zzxap11楼的回复,读取指定单元格我懂一点点了,呵呵...不过这句通不过编译
MessageBox.Show(sheet.Cells[1, 1]); //显示某个cell的数据
我想应该是类型不匹配吧?

再次谢谢大家帮忙...
HNLGDXYJS 2009-03-24
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 keyeyun 的回复:]
16楼的不是已经可以读到你想要的行了吗?
[/Quote]

我看那语句是定位到特定行,但并没有告诉我怎样读那行的数据,原谅我的愚蠢吧,你也知道,写程序一个类型没搞懂,就不可能写出正确的程序,所以我不会用
DataRow[] dr = dt.Select(" F1='220'");//找到你需要的行
这一行中的DataRow[] dr来读取一行中的指定数据...因为我不懂他是什么类型,怎样转为string? (强制吗?)

而且我上面也说过, DataRow[] dr = dt.Select(" F1='220'");//找到你需要的行
这一行编译没错,但调试的时候有错,错误信息: Object reference not set to an instance of an object.


还有 Object reference not set to an instance of an object.
这一行中的 "F1"是列名吗? 我可以换成我excel表里的学号吗? (学号是我EXCEL表里一个列的列名..)

请大家解释一下,谢谢了...
epngllh 2009-03-24
  • 打赏
  • 举报
回复
最笨的方法就是先读到dataset中.然后就方便了....
keyeyun 2009-03-24
  • 打赏
  • 举报
回复
16楼的不是已经可以读到你想要的行了吗?
HNLGDXYJS 2009-03-24
  • 打赏
  • 举报
回复
我又想了一下,根据这个循环
for (int i = 0; i < data.Tables[0].Rows[0].ItemArray.Length; i++)
{
str += data.Tables[0].Rows[0].ItemArray[i].ToString() + ".";
}
读取第0行的内容...

我就可以用16楼的方法确定行,赋给上面循环中的rows[i],i就是我要的行数,这样可不可以,如果可以,C#语句怎样写,只是一唏代码,大家就帮我写一下啦,谢谢了啊...
HNLGDXYJS 2009-03-24
  • 打赏
  • 举报
回复
谢谢lsj_zrp的回答,可是这句会在调试是有错误:
DataRow[] dr = dt.Select(" F1='220'");//找到你需要的行
错误信息:Object reference not set to an instance of an object.

请问是什么原因,如果上述没错的话,那我要怎样使用这个已确定的行.
你能帮我确定了是哪行,但我却仍不会用 DataRow[] dr 这个对象来访问那行的内容,调试了一下午,还是不行..我C#菜得没话说,痛苦中...可否再明示一下,感激不尽...

也请大家帮我看一下,谢谢...
十八道胡同 2009-03-24
  • 打赏
  • 举报
回复
顶起,关注!我也不会的
lsj_zrp 2009-03-24
  • 打赏
  • 举报
回复
DataTable dt = new DataTable();
string strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=YES;IMEX=1;';"+ "Data Source=" + strFileName + ";";
OleDbConnection connection = new OleDbConnection(strConnection);
connection.Open();
try
{
string str = "Select * from [Sheet1$] where F1='220'";
OleDbDataAdapter adapter = new OleDbDataAdapter(str, connection);
adapter.Fill(dt);
}
catch
{
dt = null;
}
finally
{
connection.Close();
}

DataRow[] dr = dt.Select(" F1='220'");//找到你需要的行
zzxap 2009-03-23
  • 打赏
  • 举报
回复
using Excel=Microsoft.Office.Interop.Excel;
.......

Object refmissing = System.Reflection.Missing.Value;
Excel._Application exc = new Excel.ApplicationClass();
exc.Visible = true;
Excel.Workbooks workbooks = exc.Workbooks;
workbooks._Open("c:\\test.xls",refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing);

Excel.Worksheet sheet = (Excel.Worksheet)exc.Worksheets.get_Item(1);

MessageBox.Show(sheet.Cells[1, 1]); //显示某个cell的数据

mabailin 2009-03-23
  • 打赏
  • 举报
回复
留着学习
HNLGDXYJS 2009-03-23
  • 打赏
  • 举报
回复
谢谢zzxap先...可是我看不懂..

这些不能直接用C#语句吗? 一定要用VBA,我不会VBA,很惨...

我是这样想的,后正工作量不多,能尽快解决就尽快解决.所以不是很情愿的去看VBA,我做这些都是中午,下午的一点点时间在宿舍对着电脑做的,其他时间我一般在图书馆,学一些基础知识..

你在三楼说:把excel数据读取到dataset,在dataset离就好定位行数列数了...
我是这样做的:

string MyExcel = "2008毕业生档案投递正稿.xls";
string MySheet = "Sheet1";
OleDbConnection MyConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=" + MyExcel + ";Excel 8.0;HDR=YES");
string MySQL = "SELECT * FROM ["+MySheet+"$]"; //"SELECT * FROM ["+MySheet+"$]";
OleDbCommand MyCommand = new OleDbCommand(MySQL, MyConnection);
OleDbDataAdapter MyAdapter = new OleDbDataAdapter(MyCommand);
DataSet MySet = new DataSet();
MyAdapter.Fill(MySet);
this.dataGridView1.DataSource = MySet.Tables[0];

这样做是把整个excel表弄到datagirdview里了,那这样我该怎样在datagirdview里读取我想要的数据里,比如某一行
的某些数据..
谢谢大家帮忙...麻烦大家了..
格拉 2009-03-23
  • 打赏
  • 举报
回复
不难吧
sunshine_anycall 2009-03-23
  • 打赏
  • 举报
回复
试下OleDB
OleDbConnection objConn = null;
DataSet data = new DataSet();
try
{
string strConn = @"Provider=Microsoft.ACE.OleDb.12.0;Data Source=c:"待发工资.xlsx;Extended Properties='Excel 12.0;HDR=YES'";//IMEX=1为只读
//"Provider=Microsoft.Jet.OleDb.4.0;data source=c:"待发工资.xlsx;Extended Properties=""Excel 12.0;HDR=YES;IMEX=1""";
objConn = new OleDbConnection(strConn);
objConn.Open();
//System .Data . DataTable schemaTable = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);
//int SheetIndex = 0;
//string tableName = schemaTable.Rows[SheetIndex][2].ToString().Trim();

string strSql = "Select * From [Sheet1$]";
OleDbCommand objCmd = new OleDbCommand(strSql, objConn);
OleDbDataAdapter sqlada = new OleDbDataAdapter();
sqlada.SelectCommand = objCmd;
sqlada.Fill(data);
string str = "";
for (int i = 0; i < data.Tables[0].Rows[0].ItemArray.Length; i++)
{
str += data.Tables[0].Rows[0].ItemArray[i].ToString() + ".";
}
MessageBox.Show(str);
objConn.Close();
}
catch (Exception ex)
{
objConn.Close();
Console.WriteLine(ex.Message.ToString());
}
sunshine_anycall 2009-03-23
  • 打赏
  • 举报
回复
三种方法操作excel文档
1:使用Microsoft.Office.Interop.Excel,调用EXCEL COM组件,操作EXCEL文件
2:使用OleDb 操作EXCEL数据源,进而利用ADO.net。
3:使用OPEN XML,访问EXCEL zip文件并使用DOM。

zzxap 2009-03-23
  • 打赏
  • 举报
回复
最近的系统需要在SQL数据库与Execl之间互导数据,找了一些资料,ADO.NET可以使用使用Microsoft.Jet.OleDb访问访问Excel,网上已经有很多类似的资源,俺整理了两种方法,第一种方法可以从Excel中批量导入数据到SQL中,实现如下:
' 连接字符串
Dim xlsPath As String = Server.MapPath("~/app_data/ExcelFile.xls") ' 绝对物理路径
Dim connStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & xlsPath & "; Extended Properties=Excel 8.0;"
' 查询语句
Dim sql As String = "SELECT * FROM [Sheet1$]"

Dim ds As DataSet = New DataSet()
Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(sql, connStr)
da.Fill(ds) ' 填充DataSet

' 在这里对DataSet中的数据进行操作

' 输出,绑定数据
GridView1.DataSource = ds.Tables(0)
GridView1.DataBind()
俺只整理了绑定到GridView中的代码。

第二种方法针对自定义Excel数据表的导入,此方法在读取Excel文件时系统自动会打开一个Excel.exe进程,使用myExcel.Workbooks.Close无法关闭,俺也整理了如何关闭Excel.exe进程的代码,HTML代码如下:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Excel.aspx.vb" Inherits="_Excel" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>读取Excel数据</title>
</head>
<body>
<form id="form1" runat="server">
<div>
第<asp:TextBox ID="TextBox3" runat="server" Width="60px" Text="1" />工作表
第<asp:TextBox ID="TextBox1" runat="server" Width="60px" Text="1" />行
第<asp:TextBox ID="TextBox2" runat="server" Width="60px" Text="1" />列<br />
Excel数据:<input id="File1" runat="server" name="File1" size="30" type="file" />
<asp:Button ID="BtnRExcel" runat="server" Text="读取Excel的某行某列" /></div>
</form>
</body>
</html>
VB.NET代码:
Imports Microsoft.Office.Interop

Partial Class _Excel
Inherits System.Web.UI.Page

Protected Sub BtnRExcel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BtnRExcel.Click
Dim strPath As String = File1.PostedFile.FileName
If strPath = "" Then
Me.Response.Write("请选择要导入的Excel数据文件!")
Else

Dim excelFilePath As String = strPath
Dim myExcel As Excel.Application = New Excel.ApplicationClass() '创建一个Excel对象
Dim oMissing As Object = System.Reflection.Missing.Value
myExcel.Application.Workbooks.Open(excelFilePath, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing)
Dim myBook As Excel.Workbook = myExcel.Workbooks(1) '定义一个工作表组
Dim mySheet As Excel.Worksheet = CType(myBook.Worksheets(CInt(TextBox3.Text)), Excel.Worksheet) '定义一个工作表

Dim r As Excel.Range = CType(mySheet.Cells(CInt(TextBox1.Text), CInt(TextBox2.Text)), Excel.Range)

Me.Response.Write("Excel中第" & TextBox1.Text & "行 第" & TextBox2.Text & "列的值:" & (r.Value).ToString)
ExcelGC(myExcel, myBook, mySheet, r)

End If

End Sub

'关闭Excel进程
Private Shared Sub ExcelGC(ByRef myExcel As Excel.Application, ByRef myBook As Excel.Workbook, ByRef mySheet As Excel.Worksheet, ByRef r As Excel.Range)
myBook.Close(False, Type.Missing, Type.Missing)
myExcel.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(r)
System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel)
System.Runtime.InteropServices.Marshal.ReleaseComObject(mySheet)
System.Runtime.InteropServices.Marshal.ReleaseComObject(myBook)
mySheet = Nothing
myBook = Nothing
myExcel = Nothing
r = Nothing
GC.Collect()
End Sub
End Class
加载更多回复(3)

110,549

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧