C#.net 2005读取Excel日期数据

yanlingoffice 2010-06-24 10:09:50
在利用winform读取Excel的日期格式数据时,有的机器读入的是日期,如:6/24,有的读入的是数字,如:40351(程序和读取的Excel文件都是一模一样的,只是客户机不一样)。是否是因为客户机的日期默认设置不一样引起的,还是其他什么原因?
读取Excel文件的代码如下:
/// <summary>
/// 读取Excel数据
/// </summary>
/// <param name="strFilePath">Excel文件的路径</param>
/// <param name="strSheetName">要读取的sheet的名称</param>
/// <returns>dt</returns>
private DataTable getExcelData( string strFilePath, string strSheetName )
{
OleDbConnection Conn = new OleDbConnection( @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strFilePath + @";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'" );

string strSqlText = "SELECT * FROM [" + strSheetName + "$]";


OleDbCommand Cmd = new OleDbCommand( strSqlText, Conn );
DataTable daoruDt = new DataTable();

try
{

OleDbDataAdapter da = new OleDbDataAdapter( Cmd );
da.Fill( daoruDt );
return daoruDt;
}
catch( OleDbException oleEx )
{
throw oleEx;
}
catch( Exception ex )
{
throw ex;
}
}
...全文
1217 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jeremiah 2010-06-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dawn_wuxiaotang 的回复:]

string strSqlText = "SELECT * FROM [" + strSheetName + "$]";


我想请教一下,你如何读取到excel中的Sheet名称呢?
[/Quote]

using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;

string strConn = @"Provider = Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source =" + filePath;
OleDbConnection conn = = new OleDbConnection(strConn);
conn.Open();
System.Data.DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
conn.Close();

List<string> tblName = new List<string>();
for (int i = 0; i <= dt.Rows.Count - 1; i++)
{
tblName.Add(dt.Rows[i]["TABLE_NAME"].ToString());
}

Jeremiah 2010-06-24
  • 打赏
  • 举报
回复
如果担心选择的日期格式会因为系统的设置不同, 改产生不同.
可以在运行之前修改一下.以固定格式.

using System;
using System.Globalization;
using System.Threading;

DateTime dt = DateTime.Now;
CultureInfo ci = new CultureInfo("en-US");
// Displays dt, formatted using the ShortDatePattern
// and the CultureInfo.
Console.WriteLine(dt.ToString("MM/dd/yyyy", ci));

这样或许会解决你的问题.
dawn_wuxiaotang 2010-06-24
  • 打赏
  • 举报
回复
string strSqlText = "SELECT * FROM [" + strSheetName + "$]";


我想请教一下,你如何读取到excel中的Sheet名称呢?
Jeremiah 2010-06-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yanlingoffice 的回复:]

zjy118你好,我觉得你这段代码给出的时,在读取之后的转化。还是不能解决以下这个问题
string strSqlText = "SELECT * FROM [" + strSheetName + "$]";
后面加一句查询:
string strSqlText = "SELECT * FROM [" + strSheetName + "$] where f2 ='(一个日期)'";
f……
[/Quote]

EXCEL里面设置好了.
Excel的日期列, 设置成为日期型的,指定格式 试一下.
右键,选择列首 -Format Cells - Number,选择Date, 然后再指定格式.

导入的时候Excel的日期如果是Invalid的,在Excel列为日期型的情况下,返回给C#的会是一个空值.
不过为了保险起见, 可以用DateTime.TryParse()把错误的值转换成为特定的某一日期.
Jeremiah 2010-06-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yanlingoffice 的回复:]

zjy118你好,我觉得你这段代码给出的时,在读取之后的转化。还是不能解决以下这个问题
string strSqlText = "SELECT * FROM [" + strSheetName + "$]";
后面加一句查询:
string strSqlText = "SELECT * FROM [" + strSheetName + "$] where f2 ='(一个日期)'";
f……
[/Quote]

EXCEL里面设置好了.
Excel的日期列, 设置成为日期型的,指定格式 试一下.
右键,选择列首 -Format Cells - Number,选择Date, 然后再指定格式.

导入的时候Excel的日期如果是Invalid的,在Excel列为日期型的情况下,返回给C#的会是一个空值.
不过为了保险起见, 可以用DateTime.TryParse()把错误的值转换成为特定的某一日期.
myhope88 2010-06-24
  • 打赏
  • 举报
回复
这个貌似挺麻烦的
jxncncdx 2010-06-24
  • 打赏
  • 举报
回复
学习学习!
yanlingoffice 2010-06-24
  • 打赏
  • 举报
回复
zjy118你好,我觉得你这段代码给出的时,在读取之后的转化。还是不能解决以下这个问题
string strSqlText = "SELECT * FROM [" + strSheetName + "$]";
后面加一句查询:
string strSqlText = "SELECT * FROM [" + strSheetName + "$] where f2 ='(一个日期)'";
f2代表的是入库日期,因为读取入库日期一下子是数字一下子是日期,所以这个条件怎么处理?


xy325432 2010-06-24
  • 打赏
  • 举报
回复
学习,帮你顶下。。
zjy118 2010-06-24
  • 打赏
  • 举报
回复
转载 yundingyuan的博客

//按钮事件

protected void btnQueryExcel_Click(object sender, EventArgs e)
{
DataSet ds; string strError;
string SaveFilePath = Server.MapPath(Page.Request.ApplicationPath) + "\\UpLoadExcel";
if (!System.IO.Directory.Exists(SaveFilePath))
System.IO.Directory.CreateDirectory(SaveFilePath);
if (FileUpload1.FileName.Trim() =="")
{
alert("请选择要导入的Excel");
return;
}
FileUpload1.SaveAs(SaveFilePath + "\\" + FileUpload1.FileName);

string Sql = "SELECT * FROM [CCS$];";
bool bRet = ImportDataFromExcelToDs(out ds, SaveFilePath + "\\" + FileUpload1.FileName, Sql, out strError);
if (!bRet)
{
alert(strError);
return;
}
if (ds.Tables.Count == 0 && ds.Tables[0].Rows.Count > 0)
{
alert("没有数据");
return;
}

if (!QueryExcelData(ds, out strError))
{
alert(strError);
return;
}

}

/// <summary>
/// 将DataSet当中的数据导入到Excel当中
/// </summary>
/// <param name="ds"></param>
/// <param name="strError"></param>
/// <returns></returns>
private bool QueryExcelData(DataSet ds, out string strError)
{
gvClient.DataSource = null;
gvClient.DataBind();
strError = "";
List<ClientStructure> datas = new List<ClientStructure>();
try
{
#region 给对象赋值

for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
DataRow dr = ds.Tables[0].Rows[i];
ClientStructure data = new ClientStructure();

//序号(展现用)
data.SN = i + 1;
//公司ID
data.CorpID = CheckUser().CorpID;
//客户名称(暂无用)
data.ClientName = dr[0].ToString().Replace("\n","");

if (data.ClientName == "")
{
break;
}

//客户编码(根据客户编码查询客户ID)
data.ClientKey = dr[1].ToString().Replace("\n", "");

if (data.ClientKey == "")
{
break;
}

//月份 查询数据格式为数字
try
{
data.RecordMonth = DateTime.FromOADate(Convert.ToInt32(dr[2].ToString())).ToString

("yyyy-MM");
}
catch
{
data.RecordMonth = "";
}

//月份,查询数据格式为日期格式
try
{
if (data.RecordMonth=="")
{
data.RecordMonth = Convert.ToDateTime(dr[2].ToString()).ToString("yyyy-MM");
}
}
catch
{
data.RecordMonth = "";
}
//将对象添加到集合当中
datas.Add(data);
}
#endregion
}
catch (System.Exception e)
{
strError = e.Message;
return false;
}
gvClient.DataSource = datas;
gvClient.DataBind();



ViewState["data"] = datas;
return true;

//ClientStructureManager manager = new ClientStructureManager();
//return manager.AddClientStructureFromExcel(datas, out strError);

}

private bool ImportDataFromExcelToDs(out System.Data.DataSet ds, string FileName, string Sql, out string strError)
{
ds = new DataSet();
strError = "";
string Connection = GetConn(FileName);
if (Connection.Equals(""))
{
strError = "所选文件不是Excel";
return false;
}
System.Data.OleDb.OleDbConnection OConnection = new System.Data.OleDb.OleDbConnection(Connection);
try
{
System.Data.OleDb.OleDbCommand Ocmd = new System.Data.OleDb.OleDbCommand(Sql, OConnection);
System.Data.OleDb.OleDbDataAdapter adp = new System.Data.OleDb.OleDbDataAdapter(Ocmd);
OConnection.Open();
adp.Fill(ds);
OConnection.Close();
}
catch
{
if (OConnection.State == ConnectionState.Open)
OConnection.Close();
}
return true;
}

private string GetConn(string FileName)
{
int index = FileName.LastIndexOf(".");
string suffix = FileName.Substring(index + 1);
if (suffix.Equals("xls"))
return "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FileName + ";Extended Properties=Excel 8.0;";
else if (suffix.Equals("xlsx"))
return "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FileName + ";Extended Properties=Excel 12.0;";
else
return "";
}



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/WeiZhang_son_Ding/archive/2010/04/28/5537632.aspx
yanlingoffice 2010-06-24
  • 打赏
  • 举报
回复
问题补充:能否时导入Excel的日期格式数据的结果统一起来,要么导入都是数字,要么导入都是日期格式
yanlingoffice 2010-06-24
  • 打赏
  • 举报
回复
以日期为查询条件去取Excel数据的问题还是没有解决。
不知道这个问题该怎么办,,,,,

读取数据后,格式化日期数据的问题已经解决。代码如下:
////strChukuRiqi:从Excel中读取的出库如期
double dI = 0;
if( double.TryParse( strChukuRiqi, out dI ) ) ////判断读取的是否是数字
{
DateTime.FromOADate( dI ).ToString( "yyyy-MM-dd" );////如果读取的是数字,则用FromOADate进行转化
}
else
{
Conver.ToDateTime( strChukuRiqi ).ToString( "yyyy-MM-dd" );
}
yanlingoffice 2010-06-24
  • 打赏
  • 举报
回复
我指的是Sheet的名称,由用户指定,然后做为一个参数传入
yanlingoffice 2010-06-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 w59879213 的回复:]
引用 4 楼 yanlingoffice 的回复:

zjy118你好,我觉得你这段代码给出的时,在读取之后的转化。还是不能解决以下这个问题
string strSqlText = "SELECT * FROM [" + strSheetName + "$]";
后面加一句查询:
string strSqlText = "SELECT * FROM [" + strSheetName +……
[/Quote]

又用户指定,做为一个参数传入

110,566

社区成员

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

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

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