C# Excel 解决方案

<SCRIPT src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript> </SCRIPT> <IFRAME name=google_ads_frame marginWidth=0 marginHeight=0 src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-0660578626274101&amp;dt=1227798924218&amp;lmt=1227660492&amp;output=html&amp;slotname=5846816625&amp;correlator=1227798924218&amp;url=http%3A%2F%2Fwww.zxbc.cn%2Fhtml%2F20081126%2F68321.html&amp;ea=0&amp;ref=http%3A%2F%2Fwww.zxbc.cn%2Fhtml%2F20081126%2F68321_2.html&amp;frm=0&amp;ga_vid=337886013.1227798924&amp;ga_sid=1227798924&amp;ga_hid=1912940174&amp;flash=10.0.12.36&amp;u_h=800&amp;u_w=1280&amp;u_ah=800&amp;u_aw=1280&amp;u_cd=32&amp;u_tz=480&amp;u_his=1&amp;u_java=true&amp;dtd=16" frameBorder=0 width=300 scrolling=no height=250 allowTransparency></IFRAME>

因为现在用到的是winform,对web的解决没有去关注,所以现在只是对winform操作excel做笔记

以前做考试系统的时候,接触过excel导入,不过当时不是我负责所以了解不多,只是知道在.net中excel可以想其他数据源一样访问。

C# 操作Excel分两种情况

1.利用office组件,就是要安装office(或者下载dll添加引用也可以,没试过) 。代码1

2.不利用office组件,而是用TextWriter的某些子类编写器将字节流写入文件,这些文件其实不是真正的excel文件(可以用记事本打开不乱码),虽然能用excel打开。如果你在把这些导出的文件当作excel数据源,就不行了。

其实还有一种方法虽然不利用office组件不过当导出到excel的时候有有一个事先创建好的excel文件(这样比用office组件好点,毕竟有别的编译器可以生成excel文件,不过这样也只是自欺欺人吧)。这个方法是导出的时候也把已经创建好的excel当做数据源用OleDbCommand.ExecuteNonQuery()等方法写入excel。我们把这标记为代码3,以便下面提供代码。

相关代码:

我们先看最后一种方法代码(我开始用的是这个不上不下的方法)

代码3

/// <summary>
/// 将DataTable导出为excel 自动创建excel
/// </summary>
/// <param name="dt"> 数据源</param>
/// <param name="ExcelFileName"> 要保存的excel的name</param>
/// <param name="strWorkSheetName">创建的表的名字 </param>
public static string ExportTable2ExcelFile(DataTable dt, string ExcelFileName, string strWorkSheetName)
{
if (File.Exists(ExcelFileName) == false)
{
return "指定文件不存在!";
}

if (dt == null)
{
return "数据不能为空!";
}

if (strWorkSheetName.ToString() == "")
{
return "数据表名不可以为空!";
}
dt.TableName = strWorkSheetName;

int iRows = dt.Rows.Count;
int iCols = dt.Columns.Count;

StringBuilder stringBuilder;
string connString;

if (iRows == 0)
{
return "没有可导入数据!";
}

stringBuilder = new StringBuilder();


connString = ExcelOperation.GetExcelConnection(ExcelFileName);// "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFileName + ";Extended Properties=Excel 8.0;";

//先查看此Excel中是否有相关Table,如果有的话就删除,然后导入新的。
//生成创建表的脚本
stringBuilder.Append("CREATE TABLE ");
stringBuilder.Append(dt.TableName + " ( ");
for (int i = 0; i < iCols; i++)
{
//此处是本版本改进中最实用的地方
string strType = ExcelOperation.GetOleDataType(dt.Columns[i]);
if (i < iCols - 1)
stringBuilder.Append(string.Format("{0} {1},", dt.Columns[i].ColumnName, strType));
else
stringBuilder.Append(string.Format("{0} {1})", dt.Columns[i].ColumnName, strType));
}


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


OleDbCommand objCmd = new OleDbCommand();
objCmd.Connection = objConn;

//插入新表
objCmd.CommandText = stringBuilder.ToString();

try
{
objConn.Open();
//插入新表
objCmd.ExecuteNonQuery();

}
catch (Exception e)
{
return "在Excel中创建表失败!错误信息:" + e.Message;
}

stringBuilder.Remove(0, stringBuilder.Length);

stringBuilder.Append("INSERT INTO ");
stringBuilder.Append(dt.TableName + " ( ");

//先插入标头
for (int i = 0; i < iCols; i++)
{
if (i < iCols - 1)
stringBuilder.Append(dt.Columns[i].ColumnName + ",");
else
stringBuilder.Append(dt.Columns[i].ColumnName + ") values (");
}

for (int i = 0; i < iCols; i++)
{

if (i < iCols - 1)
stringBuilder.Append("@" + dt.Columns[i].ColumnName + ",");
else
stringBuilder.Append("@" + dt.Columns[i].ColumnName + ")");
}


//建立插入动作的Command
objCmd.CommandText = stringBuilder.ToString();
OleDbParameterCollection oleParam = objCmd.Parameters;

oleParam.Clear();
for (int i = 0; i < iCols; i++)
{
OleDbType oleDbType = ExcelOperation.GetRefOleDataType(dt.Columns[i]);

//此处是本版本改进中最实用的地方
oleParam.Add(new OleDbParameter("@" + dt.Columns[i].ColumnName, oleDbType));
}


//遍历DataTable将数据插入新建的Excel文件中
foreach (DataRow row in dt.Rows)
{
for (int i = 0; i < oleParam.Count; i++)
{
oleParam[i].Value = row[i];
}

objCmd.ExecuteNonQuery();


}
return "数据已成功导入Excel!";
}
}

/// <summary>
/// 获取与本地DataSet中指定列的类型对应的OleDbType的数据类型字符串
/// </summary>
/// <param name="dataColumn"></param>
/// <returns></returns>

 

public static string GetOleDataType(DataColumn dataColumn)
{
switch (dataColumn.DataType.Name)
{
case "String"://字符串
{
return "VarChar";
}
case "Double"://数字
{
return "Double";
}
case "Decimal"://数字
{
return "Decimal";
}
case "DateTime"://时间
{
return "Date";
}
default://
{
return "VarChar";
}
}
}

/// <summary>
/// 获取与本地DataSet中指定列的类型对应的OleDbType类型
/// </summary>
/// <param name="dataColumn"></param>
/// <returns></returns>
public static OleDbType GetRefOleDataType(DataColumn dataColumn)
{
switch (dataColumn.DataType.Name)
{
case "String"://字符串
{
return OleDbType.VarChar;
}
case "Double"://数字
{
return OleDbType.Double;
}
case "Decimal"://数字
{
return OleDbType.Decimal;
}
case "DateTime"://时间
{
return OleDbType.Date;
}
default:
{
return OleDbType.VarChar;
}
}
}
public static string GetExcelConnection(string strFilePath)
{
if (!File.Exists(strFilePath))
{
throw new Exception("指定的Excel文件不存在!");
}
return
@"Provider=Microsoft.Jet.OLEDB.4.0;" +
@"Data Source=" + strFilePath + ";" +
@"Extended Properties=" + Convert.ToChar(34).ToString() +
@"Excel 8.0;" + "Imex=2;HDR=Yes;" + Convert.ToChar(34).ToString();
}
2.不利用office组件,而是用TextWriter的某些子类编写器将字节流写入文件。

这个提供一个类库的使用吧,就不发代码了4百多行,可以到下面的网址去下。项目是vs2003做的要转换下然后把RKLib.ExportData.dll复制到bin下引用(或直接引用)然后就可以直接用了

导出到excel的代码: RKLib.ExportData.Export objExport = new RKLib.ExportData.Export("Win");
objExport.ExportDetails(dt, Export.ExportFormat.Excel, saveFileDialog1.FileName);

这个还提供了web导出和CSV格式导出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章