通过OleDb将数据保存到Excel

在这里有一点需要注意的就是 文件是会自动创建的。如果预先创建出一个以xls结尾的文件会出现异常。

要让程序自动的创建文件 一定要主要连接字符串的拼写。

private const string CONN_STRING = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=no;IMEX=0'";


上面的连接字符串在使用时传入具体的路径即可。

protected override void Save(IReportData data, Data.IColumnMappingCollection mappings,
string path)
{
StringBuilder fieldString
= new StringBuilder();
StringBuilder fieldParamStr
= new StringBuilder();
StringBuilder fieldStringNovar
= new StringBuilder();
using (OleDbConnection conn = new OleDbConnection(string.Format(ObjectUtil.SysCulture, CONN_STRING, path)))
using (OleDbCommand cmd = new OleDbCommand())
{
cmd.Connection
= conn;
conn.Open();
foreach (var col in mappings.ColumnMappings)
{
fieldString.Append(
",").Append("[").Append(col.DisplayName).Append("] ").
Append(ToOledbType(col.DataType).ToString());
fieldStringNovar.Append(
",").Append("[").Append(col.DisplayName).Append("]");
fieldParamStr.Append(
",@").Append(col.FieldName);
cmd.Parameters.Add(
new OleDbParameter(col.FieldName, OleDbType.VarChar));
}
cmd.CommandText
= string.Format(ObjectUtil.SysCulture, "CREATE TABLE {0} ({1})", "Sheet1",
fieldString.ToString().Substring(
1));
cmd.ExecuteNonQuery();
cmd.CommandText
= string.Format(ObjectUtil.SysCulture, "INSERT INTO {0} ({1}) VALUES ({2})",
"Sheet1", fieldStringNovar.ToString().Substring(1),
fieldParamStr.ToString().Substring(
1));
foreach (var row in data.Rows)
{
foreach (var col in mappings.ColumnMappings)
{
if (row[ReportUtil.GetDisplayFieldName(col)] == DBNull.Value)//row[col.FieldName]
cmd.Parameters[col.FieldName].Value = DBNull.Value;
else
{
if (col.DataType == XmlDataType.DateTime || col.DataType == XmlDataType.Date)
{
DateTime dateTime;
if (DateTime.TryParse(row[ReportUtil.GetDisplayFieldName(col)].ToString(),
out dateTime))
cmd.Parameters[col.FieldName].Value
= dateTime.ToShortDateString();
else
cmd.Parameters[col.FieldName].Value
= DBNull.Value;
}
else
cmd.Parameters[col.FieldName].Value
= row[ReportUtil.GetDisplayFieldName(col)];
}
//cmd.Parameters[col.FieldName].Value = row[col.FieldName] ==
// DBNull.Value ? " " : row[ReportUtil.GetDisplayFieldName(col)].ToString();
}
cmd.ExecuteNonQuery();
}
}
}


上面的方法做了日期类型的转换。感觉应该会有更好的办法。希望高人指点。这里在插入数据时 没有清除 parameters

而是为parameters 重新赋值。同样是可行的。有一个问题希望知道的大哥说一声:为什么comand对象要using起来,他到底使用了什么非托管资源?  上面所遍历的对象不是大家常见的dataset 什么时候有空重新整一个常用的。对了还要特别注意一点就是字段要用[]包括,这是一个很好的习惯。有时异常就是这个原因。

转载于:https://www.cnblogs.com/water-xiao/archive/2011/09/19/2181798.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值