C#使用Oledb读取Excel表格,使用select*from[表名] 不能读取到最后一列。跪求答案

xuyongquan12121 2012-09-04 03:30:07
// 连接字符串
string mystring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";

// 设定连接
OleDbConnection cnnxls = new OleDbConnection(mystring);
cnnxls.Open();
DataTable dt = cnnxls.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);1910102
DataSet ds = new DataSet();
string[] sheets = new string[dt.Rows.Count];
for (int i = 0; i < dt.Rows.Count; i++)
{
sheets[i] = dt.Rows[i][2].ToString().Trim();
OleDbDataAdapter myDa = new OleDbDataAdapter("select * from [" + sheets[i] + "]@", cnnxls);
// 数据源
try
{

// 填充数据
myDa.Fill(ds, sheets[i].Replace("$", string.Empty));

}
catch (Exception ex)
{
ErrorLog = "读取EXCEl出读取文件出错" + ex.Message;
return null;
}
finally
{
cnnxls.Close();
}



读取不到最后一列,把Excel表格打开随便改动一列的格式就能读取出来了。请问这是什么问题??
...全文
1082 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
nullnullcao 2013-11-06
  • 打赏
  • 举报
回复
卤煮怎么解决的????
xu397524982 2013-04-24
  • 打赏
  • 举报
回复
楼主这个问题解决了吗? 现在也碰到这个问题了
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
把要读取出的列列出来 因为默认的Excel后面有很多空的列 如果不指定 很可能会报异常
[/Quote]

这几天刚好写软件读取Excel文件

private DataSet 读取微软表格文件(string 文档名)
{
DataSet 读取表返回 = new DataSet();
读取 = new Thread(delegate()
{
string 微软表格 = @"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = " + 文档名 + "; Extended Properties = \"Excel 12.0 Xml; HDR = No\"";
OleDbConnection 表格文件 = new OleDbConnection(微软表格);
表格文件.Open();
string 读取数据 = "SELECT * FROM [Sheet1$]";
OleDbDataAdapter 连接表格 = new OleDbDataAdapter(读取数据, 表格文件);
连接表格.Fill(读取表返回, "读取Excel数据");
表格文件.Close();
}); 读取.Start();
return 读取表返回;
}

没出现所说的担忧问题。
chinahonker_liende 2012-10-19
  • 打赏
  • 举报
回复
HDR=NO 试试?
啊的发哦 2012-10-19
  • 打赏
  • 举报
回复
那就别*了
平凡的傲娇 2012-10-19
  • 打赏
  • 举报
回复
把要读取出的列列出来 因为默认的Excel后面有很多空的列 如果不指定 很可能会报异常
netddayup 2012-10-17
  • 打赏
  • 举报
回复
我也同问呀!更郁闷的是昨天的还行,今天就不行了。
  • 打赏
  • 举报
回复
同问,各种办法都解决不了
熙风 2012-09-04
  • 打赏
  • 举报
回复
话说还没遇到这种情况,。。
那就换种方法读取excel

 /// <summary>
/// 解析Excel,返回DataTable
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public static System.Data.DataTable ImpExcel(string fileName)
{
System.Data.DataTable dt = new System.Data.DataTable();
try
{
Microsoft.Office.Interop.Excel.Application app;
Workbooks wbs;
Worksheet ws;
app = new Microsoft.Office.Interop.Excel.Application();
wbs = app.Workbooks;
wbs.Add(fileName);
ws = (Worksheet)app.Worksheets.get_Item(1);
int a = ws.Rows.Count;
int b = ws.Columns.Count;
string name = ws.Name;

for (int i = 1; i <RowCount; i++)
{
DataRow dr = dt.NewRow();
for (int j = 1; j <= ColumnsCount; j++)
{
Range range = ws.get_Range(app.Cells[i, j], app.Cells[i, j]);
range.Select();
dr[j - 1] = app.ActiveCell.Text.ToString();
}
dt.Rows.Add(dr);
}
KillProcess(app);
return dt;
}
catch (Exception ex)
{
MessageBox.Show("数据绑定Excel失败! 失败原因:Excel格式不正确!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
return dt;
}
}
<span style="color:#ff0000;">-------------------------------------------<span style="font-size:24px;">方法二</span></span>
/// <summary>
/// 解析Excel,根据OleDbConnection直接连Excel
/// </summary>
/// <param name="filePath"></param>
/// <param name="name"></param>
/// <returns></returns>
public static DataSet LoadDataFromExcel(string filePath, string name)
{
try
{
string strConn;
// strConn = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = " + filePath + ";Extended Properties=Excel 8.0";
strConn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties=\"Excel 12.0 Xml;HDR=No\"";
OleDbConnection OleConn = new OleDbConnection(strConn);
OleConn.Open();
string sql = "SELECT * FROM [" + name + "$]";//可是更改Sheet名称,比如sheet2,等等
OleDbDataAdapter OleDaExcel = new OleDbDataAdapter(sql, OleConn);
DataSet OleDsExcle = new DataSet();
OleDaExcel.Fill(OleDsExcle, name);
OleConn.Close();
return OleDsExcle;
}
catch (Exception err)
{
MessageBox.Show("数据绑定Excel失败! 失败原因:" + err.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
return null;
}
}


http://blog.csdn.net/happy09li/article/details/7431967
本文介绍C#访问操作Access数据库的基础知识,并提供一个相关的例程。 1.通过ADO.NET的OleDb相关类来操作Access 主要知识点如下: using System.Data.OleDb; using System.Data; 连接字符串:String connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=product.mdb"; 建立连接:OleDbConnection connection = new OleDbConnection(connectionString); 使用OleDbCommand类来执行Sql语句: OleDbCommand cmd = new OleDbCommand(sql, connection); connection.Open(); cmd.ExecuteNonQuery(); 2.取得Access自增标识字段在插入数据后的id值 cmd.CommandText = @"select @@identity"; int value = Int32.Parse(cmd.ExecuteScalar().ToString()); return value; 3.执行事务 需要用到OleDbTransaction,关键语句如下: OleDbConnection connection = new OleDbConnection(connectionString); OleDbCommand cmd = new OleDbCommand(); OleDbTransaction transaction = null; cmd.Connection = connection; connection.Open(); transaction = connection.BeginTransaction(); cmd.Transaction = transaction; cmd.CommandText=sql1; cmd.ExecuteNonQuery(); cmd.CommandText=sql2; cmd.ExecuteNonQuery(); transaction.Commit(); 4.执行查询,返回DataSet OleDbConnection connection = new OleDbConnection(connectionString); DataSet ds = new DataSet(); connection.Open(); OleDbDataAdapter da = new OleDbDataAdapter(sql, connection); da.Fill(ds,"ds"); 5.分页查询 分页查询使用OleDbDataReader来读取数据,并将结果写到一个DataSet中返回。 以上内容封装为三个可重用的类:AccessDBUtil,AccessPageUtil,Page 代码这里下载AccessDBUtilDemo.rar (191.37 KB , 下载:999次) 本例程是一个c#的winform程序,但是数据访问类可以在Web环境下使用。 本例程演示了: 1.Access数据库的插入,更新,修改,查询; 2.带参数的sql语句的使用,而不是拼SQL; 3.使用DataReader的分页查询,而不是用嵌套的SQL语句来分页; 4.用事务同时执行多个SQL语句; 5.在插入数据的同时返回最新的ID值; 6.整型,实型,字符串,日期型,布尔型五种数据类型的操作; 7.使用正则表达式来验证整数和实数; 8.listview用来显示数据的一些基本用法。 本示例不包括: 1.高效的分页查询,仅仅是提供了一种分页的方法,但我认为DataReader应该比嵌套的SQL语句快(未测试)。 2.完善的分页封装,只提供了分页的简单包装。 3.嵌套的事务处理,提供了同时执行多个sql语句的事务处理,但不支持嵌套事务。 4.listview的使用,只是利用winform控件来演示数据访问,因此不能作为winform编程的良好示例,例如添加数据时界面并没有很好地更新。

110,537

社区成员

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

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

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