读取Execl 日期出现乱码

专心做码农 2012-01-10 10:41:41
读取方法:

/// <summary>
/// 读取Execl 返回Dataset
/// </summary>
/// <param name="strConnection">Execl物理路径</param>
/// <returns></returns>
public static DataSet ExeclToDataset(string sConnection)
{
if (sConnection != "")
{
//string sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strConnection + ";Extended Properties=Excel 8.0;";
string sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sConnection + ";Extended Properties= 'Excel 8.0;HDR=YES;IMEX=1;TypeGuessRow=100';";

using (OleDbConnection objConn = new OleDbConnection(sConnectionString))
{

try
{
objConn.Open();
//返回Excel的架构,包括各个sheet表的名称,类型,创建时间和修改时间等
DataTable dtSheetName = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });
//excel中表名的数组
ArrayList array = new ArrayList();
for (int i = 0; i < dtSheetName.Rows.Count; i++)
{
string strTableName =dtSheetName.Rows[i]["TABLE_NAME"].ToString().Substring(0,dtSheetName.Rows[i]["TABLE_NAME"].ToString().IndexOf("$"));
if (!array.Contains(strTableName))
{
array.Add(strTableName);
}
}

//包含excel中表名的字符串数组
string[] strTableNames = new string[dtSheetName.Rows.Count];
DataSet ds = new DataSet();//表集合
for (int k = 0; k < array.Count; k++)
{

OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM [" + array[k].ToString() + "$]", objConn);
OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();
objAdapter1.SelectCommand = objCmdSelect;

DataSet objDataset1 = new DataSet();

objAdapter1.Fill(objDataset1, array[k].ToString());
objDataset1.Tables[array[k].ToString()].Columns[0].ColumnName = "F1";
ds.Tables.Add(objDataset1.Tables[0].Copy());
//释放资源
objDataset1.Dispose();
objCmdSelect.Dispose();
}
if (ds != null)
{
return ds;
}
return null;


}
catch (System.Data.OleDb.OleDbException E)
{
objConn.Close();
throw new Exception(E.Message);
}

}
}
else
{
return null;
}

}


卡号 卡类型 旧状态 当前状态 变动时间
aa a b A 2012-1-10


返回的dataset 中 变动时间为 40918 不是正确的2012-1-10


求解释
...全文
554 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
专心做码农 2012-01-18
  • 打赏
  • 举报
回复
话说 前几天银联给我发的数据包直接把日期这个字段去掉了

全部放在了表头以20120101这种字符串显示了

读取.csv我这个还没来的及做

过几天再仔细测试 明天回家过年先
专心做码农 2012-01-18
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 h475410885 的回复:]
楼主解决没有。。
日期变成数字了,其实excel在转换格式的时候就自动把日期变成数字了,
那这个数字是怎么来的呢 ? 如果你把日期改成1900年1月1日,那么你可以看到他的转换结果是1,以此类推,40918 是哪一天就明白了吧。


给你两个方法

C# code


 方法一:
//strValue是你的日期40918 值带进来
public static string ……
[/Quote]

ok了 你的方法都可以

就是int类型我换为了double了

2012-01-01 12:00:00 可以转换出来
youkuxiaobin 2012-01-14
  • 打赏
  • 举报
回复
h475410885 2012-01-14
  • 打赏
  • 举报
回复
楼主解决没有。。
日期变成数字了,其实excel在转换格式的时候就自动把日期变成数字了,
那这个数字是怎么来的呢 ? 如果你把日期改成1900年1月1日,那么你可以看到他的转换结果是1,以此类推,40918 是哪一天就明白了吧。


给你两个方法

 方法一:
//strValue是你的日期40918 值带进来
public static string getDateStr(string strValue)
  {
  int i = Convert.ToInt32(strValue);
   DateTime d1 = Convert.ToDateTime("1900-1-1");
   DateTime d2 = d1.AddDays(i - 2);
   string strTemp = d2.ToString("d");

   return strTemp;
  }
  方法二:
  DateTime.FromOADate(Convert.ToInt32(strValue)).ToString("d");

zell419 2012-01-14
  • 打赏
  • 举报
回复
专心做码农 2012-01-12
  • 打赏
  • 举报
回复
好吧 EXECL中 2012-1-1 0:00:00 的格式是日期

我读取的时候是按照文本形式读的

现在银联使用的报表工具把日期2012-1-1 0:00:00 都改成20120101 这样的文本形式了

现在程序导入功能可以实现了 但是这个问题还是没找到解决的方法

我这两天再找下 读取.csv看下行不
风2013 2012-01-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yy_lxk 的回复:]

是2012-1-1 0:00:00 读出来是40909
[/Quote]
应该是你当前单元格的格式出了问题,
2012-1-1 0:00:00 在EXCEL中的数值格式是40909.00
设置一下,把他设置为常规格式,再重新导入,应该就可以了....
风2013 2012-01-11
  • 打赏
  • 举报
回复
应该不会出现这种问题的,也有可能是你的链接语句出了问题

xlsx 连接语句
sConnectionString = "Provider=Microsoft.Ace.OleDb.12.0;Data Source=" + sConnection +
";Extended Properties='Excel 12.0 Xml; HDR=YES; IMEX=1'";

xls 连接语句
sConnectionString = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + sConnection +
";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'";

用这两个链接语句试试看
专心做码农 2012-01-11
  • 打赏
  • 举报
回复
日期格式这块可以不考虑了

现在日期格式为20110101 这种了
专心做码农 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 feng1366259807 的回复:]
应该不会出现这种问题的,也有可能是你的链接语句出了问题

xlsx 连接语句
sConnectionString = "Provider=Microsoft.Ace.OleDb.12.0;Data Source=" + sConnection +
";Extended Properties='Excel 12.0 Xml; HDR=YES; IMEX=1'";

xls 连接语……
[/Quote]

第一个 报错“未在本地计算机上注册“Microsoft.Ace.OleDb.12.0”提供程序。”
安装2007后和下面一样

第二个 Execl中是2012-1-1 0:00:00 读出来是40909
段传涛 2012-01-10
  • 打赏
  • 举报
回复
直接读取 会有问题的。
最好再加一个遍历,遇到特殊格式,列为自定义类型 就可以了。
专心做码农 2012-01-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 h475410885 的回复:]
这个可能是格式无法解析出来,
你看看在excel中日期转换成字符格式,或者直接在'2012-1-10 日期前加一个单引号读取看看还是否为40918
[/Quote]
我把日期粘贴到txt里面 再粘回来 就可以了

不过单元格的格式是文本 不是日期

加了' 单引号是可以 单元格的格式也变成文本了

这些数据要从银联拿到 下午去当面咨询一下去

h475410885 2012-01-10
  • 打赏
  • 举报
回复
这个可能是格式无法解析出来,
你看看在excel中日期转换成字符格式,或者直接在'2012-1-10 日期前加一个单引号读取看看还是否为40918

专心做码农 2012-01-10
  • 打赏
  • 举报
回复

改成这样以后
IMEX=0

日期能够读取出来

但是我的数据缺失了 有些列名,字段没有读出来
专心做码农 2012-01-10
  • 打赏
  • 举报
回复
话说 好吧 感觉要杯具了

银联方面用的是Execl导出工具 为了好看,实用 他们都设置了相应的类型 日期对应日期 金钱对应金钱

数字就是数字

上面的方法恐怕不能用了 听说读取的时候可以以“GBK” 格式进行读取 有相关例子没?

哪位大牛介绍一个

或者用其他的方法读取Execl 也行 最主要的数据没错
专心做码农 2012-01-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jason_dct 的回复:]
直接读取 会有问题的。
最好再加一个遍历,遇到特殊格式,列为自定义类型 就可以了。
[/Quote]

怎么设置为自定义类型

62,242

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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