在读取Excel文件时,遇到粗体字就读不出来了,有什么办法么?

sarmoo 2008-04-24 10:20:56
我是把Excel文件作为数据源进行读取
string conStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + fileName + "; Extended Properties='Excel 8.0;HDR=YES;IMEX=1';";
OleDbConnection connection = new OleDbConnection(conStr);

但是遇到excel文件中有粗体字的部分,读下来发现都是:“????”
请问各位大侠,有什么办法解决这样的问题么?
...全文
396 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
wizardlun 2008-05-26
  • 打赏
  • 举报
回复
excel版本問題???
优途科技 2008-05-26
  • 打赏
  • 举报
回复
我刚刚测试过。没有出现楼主问题。

private DataSet BindDsFromExcel(string strFileDir, string strDataName)
{
string strConn;
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strFileDir + ";Extended Properties='Excel 8.0;HDR=False;IMEX=1'";
OleDbConnection OleConn = new OleDbConnection(strConn);
OleConn.Open();
String sql = "SELECT * FROM [" + strDataName + "$]";//strDataName 为excel下面的标签页名字,通常叫Sheet1。

OleDbDataAdapter OleDaExcel = new OleDbDataAdapter(sql, OleConn);
DataSet OleDsExcle = new DataSet();
OleDaExcel.Fill(OleDsExcle, strDataName);
OleConn.Close();
return OleDsExcle;
}


刚才我不但把字体设置为粗体,颜色我也变了,没有出现楼主的问题。楼主可以重新制作一份excel数据,因为excel经常会出现一些意想不到的错误,在程序对其进行操作的时候。
net0003 2008-05-26
  • 打赏
  • 举报
回复
我也纯粹学习,顺便顶个
lw0686 2008-04-30
  • 打赏
  • 举报
回复
纯粹学习~~
APPLESUCH5 2008-04-30
  • 打赏
  • 举报
回复
FAFA2008的方法不错嘛。
liprivate 2008-04-25
  • 打赏
  • 举报
回复
为什么没人用COM组件去读取,怎么都用OLEDB呢??
yunfeng007 2008-04-25
  • 打赏
  • 举报
回复
DataTable schemaTable = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
这个是取得架构信息的
你也可以改为
DataTable schemaTable = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[]{null,null,null,"TABLE"});
返回所有表
msdn解释:
架构表以 DataTable 的形式返回,该数据表与由 schema 参数指定的 OLE DB 架构行集具有相同的格式。使用 restrictions 参数筛选要返回到 DataTable 中的行(例如,通过指定对表名、类型、所有者或架构的限制)。在将值传递给数组时,对于不包含值的数组元素,请将空字符串或 null 包括进去。如果将空数组传递到 restrictions,则所有行(每个表一行)都按照默认顺序返回。数组中的值则对应于源表和 DataTable 中列的顺序。限制数组中的每个元素都会与架构行集中对应列的内容进行比较。例如,限制数组中的第一个元素与行集合中的第一列作比较。如果限制元素不为 null,则只会将架构行集合中与限制值完全匹配的行添加到结果 DataTable 中。

sarmoo 2008-04-25
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 yunfeng007 的回复:]
你的excel版本是什么?
我的2003用那段代码就没问题啊,dr[2]就是你的sheet表名啊
[/Quote]

我机器装的2007.
那个dr[2]在我这读出来的值是:"print_Title",呵呵,奇怪啊
yunfeng007 2008-04-25
  • 打赏
  • 举报
回复
你的excel版本是什么?
我的2003用那段代码就没问题啊,dr[2]就是你的sheet表名啊
ruanbl 2008-04-25
  • 打赏
  • 举报
回复
“????” 说明他读出来了,而不是没读出来,
问题应该放在文件上或者楼上诸位说的编码问题上,偶也不大清楚啦。
LGame 2008-04-25
  • 打赏
  • 举报
回复
学习了
huang7914 2008-04-25
  • 打赏
  • 举报
回复
你把你的Excel文本值 給格式化 一下 然後再讀 !
sarmoo 2008-04-25
  • 打赏
  • 举报
回复
我的Excel文件例如是这样的:

省份 城市 参数
北京 北京 123
广东 广州 456
。。。。。。

其中在Excel中,省份、城市这个是占第一行,其中“省份”二字是加粗B字体

我在代码中: querySql = "select 省份,城市 from [Sheet1$]";
然后用adapter Fill 到dataset中, 而后在使用时,可以通过
foreach (DataRow row in dataset.Tables[0].Rows)
{
province = row[省份];
}
这里,省份和城市这些就都可以作为列名来使用了,比较方便;
可是现在因为是粗体,在读到的table中就没有“省份”这列了,所以问问大家针对加粗的字体是不是有什么方法处置?
懒牛科技 2008-04-24
  • 打赏
  • 举报
回复
应该是编码问题,把列都设置为字符就应该可以
FAFA2008 2008-04-24
  • 打赏
  • 举报
回复
我这里有一个将 Excel 数据表读入内存的方法,至于楼主所说的粗体字无法读取的问题,我也不太清楚。

public DataSet ImportExcelFile(string FileName, string SheetName)
{
DataSet ds;
OleDbDataAdapter MyCommand;
OleDbConnection MyConnection;
string ConnectionString;

ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0; data source=" + FileName + "; Extended Properties=Excel 8.0;";
MyConnection = new OleDbConnection(ConnectionString);
MyCommand = new OleDbDataAdapter("select * from [" + SheetName + "$]", MyConnection);
ds = new DataSet();

try
{
MyCommand.Fill(ds);
return ds;
}
catch (Exception ex)
{
throw ex;
}
finally
{
MyConnection.Close();
MyConnection.Dispose();
}
}
FAFA2008 2008-04-24
  • 打赏
  • 举报
回复
我这里有一个将 Excel 数据表读入内存的方法,至于搂主所说的遇到粗体字就无法读取的问题,我也不太明白。

public DataSet ImportExcelFile(string FileName, string SheetName)
{
DataSet ds;
OleDbDataAdapter MyCommand;
OleDbConnection MyConnection;
string ConnectionString;

ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0; data source=" + FileName + "; Extended Properties=Excel 8.0;";
MyConnection = new OleDbConnection(ConnectionString);
MyCommand = new OleDbDataAdapter("select * from [" + SheetName + "$]", MyConnection);
ds = new DataSet();

try
{
MyCommand.Fill(ds);
return ds;
}
catch (Exception ex)
{
throw ex;
}
finally
{
MyConnection.Close();
MyConnection.Dispose();
}
}
sarmoo 2008-04-24
  • 打赏
  • 举报
回复
我试了楼上的代码,怎么根本读不到我想要的东西?而且到sqlada.Fill也报Exception:“定义了过多字段”
另外问下dr[2]应该是什么值?
yunfeng007 2008-04-24
  • 打赏
  • 举报
回复

string strConn = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source="
+ _xlsPathName + ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'";

objConn = new OleDbConnection(strConn);
objConn.Open();
DataTable schemaTable = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
OleDbDataAdapter sqlada = new OleDbDataAdapter();
foreach (DataRow dr in schemaTable.Rows)
{
string strSql = "Select * From [" + dr[2].ToString().Trim() + "]";
OleDbCommand objCmd = new OleDbCommand(strSql, objConn);
sqlada.SelectCommand = objCmd;
sqlada.Fill(ds, dr[2].ToString().Trim());
}
objConn.Close();

我把xls中的部分字也设置为粗体的,我这样写怎么没有出现和楼主你一样的问题?
sarmoo 2008-04-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mqcan 的回复:]
应该是编码问题,把列都设置为字符就应该可以
[/Quote]

什么意思?如何把列都设置为字符?能具体说下么?
changjiangzhibin 2008-04-24
  • 打赏
  • 举报
回复
也许是编码问题
加载更多回复(2)

110,536

社区成员

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

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

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