读取excel文件解决空行的问题

Yancey_Wu 2014-10-04 05:23:47
最近做个东西需要读取excel经过一些处理后存入数据库,打算使用NPOI来实现。发现了一个问题,即便excel表格中只是真实数据一行(除表头),NPOI 的sheet.PhysicalNumberOfRows 返回的却有很多行,好像将表格中的空行也算进去了,除了判断每个CELL为空外,有没有什么好的办法来判断空行呢? 大家多多交流一下
  ISheet sheet = wk.GetSheetAt(0);   //读取当前表数据
for (int j = 0; j <= sheet.PhysicalNumberOfRows; j++) //LastRowNum 是当前表的总行数
{

IRow row = sheet.GetRow(j); //读取当前行数据
if (row != null)
{

for (int k = 0; k <= row.LastCellNum; k++) //LastCellNum 是当前行的总列数
{

ICell cell = row.GetCell(k); //当前表格

if (cell != null)
{

sbr.Append(cell.ToString()+"**"); //获取表格中的数据并转换为字符串类型
}

sbr.Append("-----\r\n");
}

...全文
2952 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
changuncle 2016-09-09
  • 打赏
  • 举报
回复
论坛还是大神多啊,小弟本来也想问这个问题,这下受教了,谢谢各位解答
Yancey_Wu 2014-10-07
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
我不用 npoi。 Excel的编程模型都是一致的,所以你可以去 Excel-Home 之类的论坛去先学习 vba for excel 编程,用excel自身“录制宏”,然后再学习使用其他开发平台操作它。 对于使用 .net 框架内置的原生 Excel 对象框架来说,你应该首先选择行结束,然后再读取。例如
var st = workbook.Worksheets["我的工作表"];
var start = st.Range["A12"];
var end = start.End[excel.XlDirection.xlDown];
var datas = (object[,])st.Range[start, end].Value2;
这样就把一列数据读入一个 object[,] 数组中。 再比如说写
var maxN = worksheet.Range["A1"].End[excel.XlDirection.xlDown].Row;
这就找到 A1 下边的数据结束行。
感谢您启发性的回答
  • 打赏
  • 举报
回复
空行,读取出来,在filter一下,把空行过滤掉
wangweimutou 2014-10-06
  • 打赏
  • 举报
回复
这个逻辑应该只能自己写呢,要是遇到的是复杂表格的话,每个的算法不一样呢,至于用什么方式无所谓
ww_2446135903 2014-10-06
  • 打赏
  • 举报
回复
读取excel文件数据到数据库问题 //连接数据库 public OleDbConnection CreateCon() { string strconn = "Provider=Microsoft.Jet.OLEDB.4.0;Data source=" + Server.MapPath("UserScore.mdb") + ";User Id=admin;Password=;"; OleDbConnection odbc = new OleDbConnection(strconn); return odbc; } //显示excel文件数据 protected void Button2_Click(object sender, EventArgs e) { string sqlstr = "select * from Score"; OleDbConnection conn = CreateCon(); conn.Open(); OleDbCommand mycom = new OleDbCommand(sqlstr, conn); OleDbDataReader dr = mycom.ExecuteReader(); dr.Read(); if (dr.HasRows) { GetDataSet(sqlstr); } else { Label1.Visible = true; Label1.Text = "<script language=javascript>alert('数据库中没有数据信息,请先导入再查询!');location='ExcelToAccess.aspx';</script>"; } dr.Close(); conn.Close(); } //将excel文件数据导入到Aceess数据库并绑定控件示例 protected void ExcelToAccess_Click(object sender, EventArgs e) { //定义Excel列表 string StyleSheet = "Sheet1"; //调用自定义LoadData方法,将Excel文件中数据读到ASPNET页面中 LoadData(StyleSheet); //定义查询的SQL语句 string sql = "select ID,用户姓名,试卷,成绩,考试时间 from Score"; //创建Oledb数据库连接 OleDbConnection con = CreateCon(); con.Open();//打开数据库连接 OleDbCommand com = new OleDbCommand(sql, con); //开始事务 OleDbTransaction tran = con.BeginTransaction(); com.Transaction = tran; //创建适配器 OleDbDataAdapter da = new OleDbDataAdapter(com); OleDbCommandBuilder cb = new OleDbCommandBuilder(da); //创建DataSet数据集 DataSet ds = new DataSet(); //填充数据集 da.Fill(ds); int curIndex = 0; if (ds.Tables[0].Rows.Count > 0) { curIndex = Convert.ToInt32(ds.Tables[0].Rows[0][0]); } //创建一个内存表 DataTable tb = this.getExcelDate(); string selsql = ""; for (int i = 0; i < tb.Rows.Count; i++) { string UserName = tb.Rows[i][0].ToString(); selsql = "select count(*) from Score where 用户姓名='" + UserName + "'"; } //判断Excel文件中是否已经导入到Access数据库中 if (ExScalar(selsql) > 0) { Label1.Visible = true; Label1.Text = "<script language=javascript>alert('该Excle中的数据已经导入数据库中!');location='ExcelToAccess.aspx';</script>"; } else { //循环读取Excel文件中数据,并添加到Access事先创建好的数据库表中 for (int i = 0; i < tb.Rows.Count; i++) { DataRow dr = ds.Tables[0].NewRow(); dr[0] = ++curIndex; dr[1] = tb.Rows[i][0]; dr[2] = tb.Rows[i][1]; dr[3] = tb.Rows[i][2]; dr[4] = tb.Rows[i][3]; ds.Tables[0].Rows.Add(dr); } try { da.Update(ds);//执行插入操作 tran.Commit();//事务提交 Label1.Visible = true; Label1.Text = "<script language=javascript>alert('数据导入成功!');location='ExcelToAccess.aspx';</script>"; } catch { tran.Rollback();//事务回滚 Label1.Visible = true; Label1.Text = "<script language=javascript>alert('数据导入失败!');location='ExcelToAccess.aspx';</script>"; } finally { con.Close();//关闭数据库连接 } } }
devmiao 2014-10-04
  • 打赏
  • 举报
回复
sheet.LastRowNum呢
  • 打赏
  • 举报
回复
我不用 npoi。 Excel的编程模型都是一致的,所以你可以去 Excel-Home 之类的论坛去先学习 vba for excel 编程,用excel自身“录制宏”,然后再学习使用其他开发平台操作它。 对于使用 .net 框架内置的原生 Excel 对象框架来说,你应该首先选择行结束,然后再读取。例如
var st = workbook.Worksheets["我的工作表"];
var start = st.Range["A12"];
var end = start.End[excel.XlDirection.xlDown];
var datas = (object[,])st.Range[start, end].Value2;
这样就把一列数据读入一个 object[,] 数组中。 再比如说写
var maxN = worksheet.Range["A1"].End[excel.XlDirection.xlDown].Row;
这就找到 A1 下边的数据结束行。
wjq 2014-10-04
  • 打赏
  • 举报
回复
以个人经验来说,没有。只能靠判断关键字段是否有数据判断。

111,097

社区成员

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

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

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