View Code
1 #region 导出按钮
2 /// <summary>
3 /// 导出按钮
4 /// </summary>
5 /// <param name="sender"></param>
6 /// <param name="e"></param>
7 protected void btnExport_Click(object sender, EventArgs e)
8 {
9 try
10 {
11 DataTable dt = new DataTable();
12 dt.Columns.Add("用户名称", typeof(string));
13 dt.Columns.Add("真实名称", typeof(string));
14 dt.Columns.Add("省份名称", typeof(string));
15 dt.Columns.Add("单位", typeof(string));
16 dt.Columns.Add("课程名称", typeof(string));
17 dt.Columns.Add("在线学习时间", typeof(string));
18 dt.Columns.Add("在线学习次数", typeof(string));
19 dt.Columns.Add("提交作业数", typeof(string));
20 dt.Columns.Add("未提交作业数", typeof(string));
21 dt.Columns.Add("发帖数", typeof(string));
22 dt.Columns.Add("精华帖数", typeof(string));
23 dt.Columns.Add("课程总成绩", typeof(string));
24 foreach (DataRow row in ((DataTable)ViewState["dataSourse"]).Rows)//ViewState["DataSourse"]为获得要导出的datatable
25 {
26 DataRow dr = dt.NewRow();
27 dr["用户名称"] = row["用户名称"].ToString();
28 dr["真实名称"] = row["真实名称"].ToString();
29 dr["省份名称"] = row["省份名称"].ToString();
30 dr["单位"] = row["单位"].ToString();
31 dr["课程名称"] = row["课程名称"].ToString();
32 dr["在线学习时间"] = row["在线学习时间"].ToString();
33 dr["在线学习次数"] = row["在线学习次数"].ToString();
34 dr["提交作业数"] = row["提交作业数"].ToString();
35 dr["未提交作业数"] = row["未提交作业数"].ToString();
36 dr["发帖数"] = row["发帖数"].ToString();
37 dr["精华帖数"] = row["精华帖数"].ToString();
38 dr["课程总成绩"] = row["课程总成绩"].ToString();
39 dt.Rows.Add(dr);
40 }
41 string fileAndPath = Server.MapPath("../TempFolder/Template.xls"); //获得模板Excel文件的全路径
42 string path = Request.PhysicalApplicationPath + "TempFolder";//获得当前应用程序服务器的根目录的物理系统路径
43 string fileName = ExcelHelper.DataTableToExcel(fileAndPath, path, dt, ExcelEdition.Excel2003);//将datatable转换为Excel
44 if (string.IsNullOrEmpty(fileName))
45 {
46 this.ShowMessage("没有生成Excle文件。");
47 return;
48 }
49 if (!File.Exists(fileName))
50 throw new FileNotFoundException("文件不存在。");
51 //获得文件信息
52 FileInfo downloadFile = new FileInfo(fileName);
53
54 Response.Clear();
55 //设置返回流的头信息
56 Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(downloadFile.Name, System.Text.Encoding.UTF8));
57 Response.AddHeader("Content-Length", downloadFile.Length.ToString());
58 //设置文件内容类型
59 Response.ContentType = "application/x-excel";
60
61 //将指定的文件直接写入 HTTP 响应输出流,而不在内存中缓冲该文件。
62 //避免WriteFile输出时会占用服务器大量内存.效率低下,不能下载大文件的问题.
63 Response.TransmitFile(downloadFile.FullName);
64
65 Response.Flush();
66 File.Delete(fileName);
67 Response.End();
68 }
69 catch (Exception ex)
70 {
71 ShowMessage(ex.Message);
72 }
73 }
74 #endregion
datatableToExcel方法代码:
View Code
1 /// <summary>
2 /// 写入Excel文档(需有符合格式的文件模板)
3 /// </summary>
4 /// <remarks>
5 /// <param name="filePath">文件名称</param>
6 /// <p
7 aram name="dt">数据源</param>
8 /// <param name="edition">Excel版本信息</param>
9 public static string DataTableToExcel(string filePath, string outputDirectory, DataTable dt, ExcelEdition edition)
10 {
11 return DataTableToExcel(filePath, outputDirectory, "[sheet1$]", GetColumnNames(dt), dt, edition);
12 }
从载datatableToExcel方法代码:
View Code
1 /// <summary>
2 /// 写入Excel文档(需有符合格式的文件模板)
3 /// </summary>
4 /// <remarks>
5 /// </remarks>
6 /// <param name="filePath">文件名称</param>
7 /// <param name="sheetName">工作表名称</param>
8 /// <param name="columnNames">列名</param>
9 /// <param name="dt">数据源</param>
10 /// <param name="edition">Excel版本信息</param>
11 public static string DataTableToExcel(string filePath, string outputDirectory, string sheetName,
12 string columnNames, DataTable dt, ExcelEdition edition)
13 {
14 //参数检查
15 if (string.IsNullOrEmpty(filePath) || string.IsNullOrEmpty(sheetName) || string.IsNullOrEmpty(outputDirectory))
16 {
17 throw new ArgumentNullException("参数不能为空");
18 }
19 if (!Directory.Exists(outputDirectory)) throw new DirectoryNotFoundException("目录不存在");
20 //if (!File.Exists(filePath)) throw new FileNotFoundException("文件不存在");
21 if (File.Exists(filePath))
22 {
23 FileInfo fileInfo = new FileInfo(filePath);
24 if (fileInfo.Attributes.ToString().IndexOf("ReadOnly") != -1)
25 {
26 try
27 {
28 fileInfo.Attributes = FileAttributes.Normal;
29 }
30 catch (Exception)
31 {
32 throw new ArgumentException("改变文件只读属性时出错,请手动去掉模板文件的只读属性");
33 }
34
35 }
36 }
37 else
38 {
39 throw new FileNotFoundException("文件不存在");
40 }
41 if (null == dt) return null;
42
43 //根据模板生成文件
44 string destFileName = CopyFromTemplate(filePath, outputDirectory);
45
46 //根据Excel版本生成连接串
47 string connectionString = CreateConnection(destFileName, edition);
48
49 OleDbTransaction transaction = null;
50 OleDbCommand cmd = null;
51 OleDbConnection connection = null;
52 try
53 {
54 connection = new OleDbConnection(connectionString);
55
56 //创建工作区格式
57 CreateSheet(connection, sheetName, columnNames);
58
59 if (connection.State != ConnectionState.Open) connection.Open();
60 transaction = connection.BeginTransaction(); //开启事务
61
62 cmd = new OleDbCommand();
63 cmd.Connection = connection;
64 cmd.Transaction = transaction;
65
66 foreach (DataRow row in dt.Rows)
67 {
68 //插入记录
69 cmd.CommandText = GetInsertRecordString(dt, row, sheetName);
70 cmd.ExecuteNonQuery();
71 }
72 transaction.Commit(); //提交事务
73 }
74 catch (Exception ex)
75 {
76 transaction.Rollback(); //回滚事务
77 connection.Close();
78
79 if (File.Exists(destFileName))
80 File.Delete(destFileName); //删除Excel文件
81
82 //包装异常再次抛出
83 throw new ApplicationException("写入Excel失败");
84 //throw ExceptionManager.WrapExcepion(ex, "写入Excel失败," + ex.Message, typeof(ExcelAccessException));
85 }
86 finally
87 {
88 cmd.Dispose();
89 transaction.Dispose();
90 connection.Dispose();
91 }
92 return destFileName;
93 }
获得datatable的列名称:
View Code
1 /// <summary>
2 /// 获得列名
3 /// </summary>
4 /// <param name="dt">数据源</param>
5 /// <returns>全部列名</returns>
6 private static string GetColumnNames(DataTable dt)
7 {
8 StringBuilder sb = new StringBuilder();
9 foreach (DataColumn column in dt.Columns)
10 {
11 sb.Append(string.Format("[{0}],", column.ColumnName));
12 }
13 string columnNames = sb.ToString().TrimEnd(',');
14 return columnNames;
15 }
16 #endregion
//根据模板创建副本:
CopyFromTemplate方法代码:
View Code
1 /// <summary>
2 /// 根据模板创建副本
3 /// </summary>
4 /// <param name="filePath">原始文件路径</param>
5 /// <param name="outputDirectory">输入路径</param>
6 /// <returns>新文件路径</returns>
7 private static string CopyFromTemplate(string filePath, string outputDirectory)
8 {
9 FileInfo file = new FileInfo(filePath);
10 string destFileName = Path.Combine(outputDirectory, file.Name.Replace(file.Extension, string.Empty) +
11 "-" + DateTime.Now.ToString("yyyy-MM-dd") + "(" + Guid.NewGuid() + ")" + file.Extension);
12 File.Copy(filePath, destFileName);
13
14 return destFileName;
15 }
//创建工作区
CreateSheet方法代码:
View Code
1 /// <summary>
2 /// 创建工作区
3 /// </summary>
4 /// <param name="connection">OleDB连接</param>
5 /// <param name="sheetName">工作区名称</param>
6 /// <param name="columnNames">列名</param>
7 private static void CreateSheet(OleDbConnection connection, string sheetName, string columnNames)
8 {
9 string createTableScript = GetCreateTableString(sheetName, columnNames.Split(','));
10
11 connection.Open();
12
13 using (OleDbCommand cmd = new OleDbCommand(createTableScript, connection))
14 {
15 cmd.ExecuteNonQuery();
16 }
17
18 connection.Close();
19 }
ExcelHelper类代码:
namespace Ifmsoft.Framework.Data
{
public enum ExcelEdition
{
Excel97,
Excel2000,
Excel2003,
Excel2007
} public class ExcelHelper
{
private ExcelHelper() { } /// <summary>
/// 获得Excel连接串
/// </summary>
/// <param name="filePath">文件路径</param>
/// <param name="edition">Excel版本号</param>
/// <returns>Excel连接串</returns>
private static string CreateConnection(string filePath, ExcelEdition edition)
{
switch (edition)
{
case ExcelEdition.Excel97:
return " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + filePath +
";Extended Properties=Excel 5.0";
case ExcelEdition.Excel2000:
return " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + filePath +
";Extended Properties=Excel 8.0";
case ExcelEdition.Excel2003:
return " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + filePath +
";Extended Properties=Excel 8.0";
case ExcelEdition.Excel2007:
return "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath +
";Extended Properties=\"Excel 12.0;HDR=YES\"";
default:
return " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + filePath +
";Extended Properties=Excel 8.0";
}
} /// <summary>
/// 格式化工作表名称“[sheet1$]”
/// </summary>
/// <remarks>
/// 履 历:
/// NO 日期 版本 姓名 内容
/// 1 2008/10/06 V0L01 IFM)于鹏 初版
/// </remarks>
/// <param name="sheetName">工作表名称</param>
/// <returns></returns>
public static string FormatSheetName(string sheetName)
{
return "[" + sheetName + "$]";
} /// <summary>
/// 读取Excel文件到Dataset
/// </summary>
/// <remarks>
/// 履 历:
/// NO 日期 版本 姓名 内容
/// 1 2008/10/06 V0L01 IFM)于鹏 初版
/// </remarks>
/// <param name="filePath">文件路径</param>
/// <param name="edition">Excel版本号</param>
/// <returns></returns>
public static DataSet ExecuteDataset(string filePath, ExcelEdition edition)
{
return ExecuteDataset(filePath, "[sheet1$]", edition);
} /// <summary>
/// 读取Excel文件到Dataset
/// </summary>
/// <remarks>
/// 履 历:
/// NO 日期 版本 姓名 内容
/// 1 2008/10/06 V0L01 IFM)于鹏 初版
/// </remarks>
/// <param name="filePath">文件路径</param>
/// <param name="sheetName">工作表名</param>
/// <param name="edition">Excel版本号</param>
/// <returns></returns>
public static DataSet ExecuteDataset(string filePath, string sheetName, ExcelEdition edition)
{
if (string.IsNullOrEmpty(filePath) || string.IsNullOrEmpty(sheetName))
{
throw new ArgumentNullException("参数不能为空");
}
if (!File.Exists(filePath)) throw new FileNotFoundException("文件不存在"); string connectionString = CreateConnection(filePath, edition);
string commandText = " SELECT * FROM " + sheetName;
DataSet ds = new DataSet(); using (OleDbConnection connection = new OleDbConnection(connectionString))
{
connection.Open(); using (OleDbDataAdapter da = new OleDbDataAdapter(commandText, connection))
{
da.Fill(ds, sheetName);
connection.Close();
}
} return ds;
} /// <summary>
/// 读取Excel文件到DataTable
/// </summary>
/// <remarks>
/// 履 历:
/// NO 日期 版本 姓名 内容
/// 1 2008/10/06 V0L01 IFM)于鹏 初版
/// </remarks>
/// <param name="filePath">文件路径</param>
/// <param name="edition">Excel版本号</param>
/// <returns></returns>
public static DataTable ExecuteDataTable(string filePath, ExcelEdition edition)
{
return ExecuteDataTable(filePath, "[sheet1$]", edition);
} /// <summary>
/// 读取Excel文件到DataTable
/// </summary>
/// <remarks>
/// 履 历:
/// NO 日期 版本 姓名 内容
/// 1 2008/10/06 V0L01 IFM)于鹏 初版
/// </remarks>
/// <param name="filePath">文件路径</param>
/// <param name="sheetName">工作表名</param>
/// <param name="edition">Excel版本号</param>
/// <returns></returns>
public static DataTable ExecuteDataTable(string filePath, string sheetName, ExcelEdition edition)
{
//ValidationManager.ArgumentNotNullOrEmpty(filePath, "filePath");
//ValidationManager.ArgumentNotNullOrEmpty(sheetName, "sheetName");
if (string.IsNullOrEmpty(filePath) || string.IsNullOrEmpty(sheetName))
{
throw new ArgumentNullException("参数不能为空");
}
if (!File.Exists(filePath)) throw new FileNotFoundException("文件不存在"); string connectionString = CreateConnection(filePath, edition);
string commandText = " SELECT * FROM " + sheetName;
DataTable dt = new DataTable(); using (OleDbConnection connection = new OleDbConnection(connectionString))
{
connection.Open(); using (OleDbDataAdapter da = new OleDbDataAdapter(commandText, connection))
{
da.Fill(dt);
connection.Close();
}
}
return dt;
} /// <summary>
/// 写入Excel文档(需有符合格式的文件模板)
/// </summary>
/// <remarks>
/// 履 历:
/// NO 日期 版本 姓名 内容
/// 1 2008/10/06 V0L01 IFM)于鹏 初版
/// </remarks>
/// <param name="filePath">文件名称</param>
/// <param name="dt">数据源</param>
/// <param name="edition">Excel版本信息</param>
public static string DataTableToExcel(string filePath, string outputDirectory, DataTable dt, ExcelEdition edition)
{
return DataTableToExcel(filePath, outputDirectory, "[sheet1$]", GetColumnNames(dt), dt, edition);
} /// <summary>
/// 写入Excel文档(需有符合格式的文件模板)
/// </summary>
/// <remarks>
/// 履 历:
/// NO 日期 版本 姓名 内容
/// 1 2008/10/06 V0L01 IFM)于鹏 初版
/// </remarks>
/// <param name="filePath">文件名称</param>
/// <param name="sheetName">工作表名称</param>
/// <param name="dt">数据源</param>
/// <param name="edition">Excel版本信息</param>
public static string DataTableToExcel(string filePath, string outputDirectory, string sheetName,
DataTable dt, ExcelEdition edition)
{
return DataTableToExcel(filePath, outputDirectory, sheetName, GetColumnNames(dt), dt, edition);
} /// <summary>
/// 写入Excel文档(需有符合格式的文件模板)
/// </summary>
/// <remarks>
/// 履 历:
/// NO 日期 版本 姓名 内容
/// 1 2008/10/06 V0L01 IFM)于鹏 初版
/// </remarks>
/// <param name="filePath">文件名称</param>
/// <param name="sheetName">工作表名称</param>
/// <param name="columnNames">列名</param>
/// <param name="dt">数据源</param>
/// <param name="edition">Excel版本信息</param>
public static string DataTableToExcel(string filePath, string outputDirectory, string sheetName,
string columnNames, DataTable dt, ExcelEdition edition)
{
//参数检查
if (string.IsNullOrEmpty(filePath) || string.IsNullOrEmpty(sheetName) || string.IsNullOrEmpty(outputDirectory))
{
throw new ArgumentNullException("参数不能为空");
}
if (!Directory.Exists(outputDirectory)) throw new DirectoryNotFoundException("目录不存在");
//if (!File.Exists(filePath)) throw new FileNotFoundException("文件不存在");
if (File.Exists(filePath))
{
FileInfo fileInfo = new FileInfo(filePath);
if (fileInfo.Attributes.ToString().IndexOf("ReadOnly") != -1)
{
try
{
fileInfo.Attributes = FileAttributes.Normal;
}
catch (Exception)
{
throw new ArgumentException("改变文件只读属性时出错,请手动去掉模板文件的只读属性");
} }
}
else
{
throw new FileNotFoundException("文件不存在");
}
if (null == dt) return null; //根据模板生成文件
string destFileName = CopyFromTemplate(filePath, outputDirectory); //根据Excel版本生成连接串
string connectionString = CreateConnection(destFileName, edition); OleDbTransaction transaction = null;
OleDbCommand cmd = null;
OleDbConnection connection = null;
try
{
connection = new OleDbConnection(connectionString); //创建工作区格式
CreateSheet(connection, sheetName, columnNames); if (connection.State != ConnectionState.Open) connection.Open();
transaction = connection.BeginTransaction(); //开启事务 cmd = new OleDbCommand();
cmd.Connection = connection;
cmd.Transaction = transaction; foreach (DataRow row in dt.Rows)
{
//插入记录
cmd.CommandText = GetInsertRecordString(dt, row, sheetName);
cmd.ExecuteNonQuery();
}
transaction.Commit(); //提交事务
}
catch (Exception ex)
{
transaction.Rollback(); //回滚事务
connection.Close(); if (File.Exists(destFileName))
File.Delete(destFileName); //删除Excel文件 //包装异常再次抛出
throw new ApplicationException("写入Excel失败");
//throw ExceptionManager.WrapExcepion(ex, "写入Excel失败," + ex.Message, typeof(ExcelAccessException));
}
finally
{
cmd.Dispose();
transaction.Dispose();
connection.Dispose();
}
return destFileName;
} ///// <summary>
///// 写入Excel文档(需有符合格式的文件模板)
///// </summary>
///// <remarks>
///// 履 历:
///// NO 日期 版本 姓名 内容
///// 1 2008/10/06 V0L01 IFM)于鹏 初版
///// </remarks>
///// <param name="filePath">文件名称</param>
///// <param name="sheetName">工作表名称</param>
///// <param name="columnNames">列名</param>
///// <param name="dt">数据源</param>
///// <param name="edition">Excel版本信息</param>
//public static void DataTableToExcel(string filePath, string outputDirectory, string sheetName,
// string columnNames, DataTable dt, ExcelEdition edition)
//{
// //参数检查
// //ValidationManager.ArgumentNotNullOrEmpty(filePath, "filePath");
// //ValidationManager.ArgumentNotNullOrEmpty(outputDirectory, "outputDirectory");
// //ValidationManager.ArgumentNotNullOrEmpty(sheetName, "sheetName");
// if (!File.Exists(filePath)) throw new FileNotFoundException("文件不存在");
// if (!Directory.Exists(outputDirectory)) throw new DirectoryNotFoundException("目录不存在");
// if (null == dt) return; // //根据模板生成文件
// string destFileName = CopyFromTemplate(filePath, outputDirectory); // //根据Excel版本生成连接串
// string connectionString = CreateConnection(destFileName, edition); // OleDbTransaction transaction = null;
// OleDbCommand cmd = null;
// OleDbConnection connection = null;
// try
// {
// connection = new OleDbConnection(connectionString); // //创建工作区格式
// CreateSheet(connection, sheetName, columnNames); // if (connection.State != ConnectionState.Open) connection.Open();
// transaction = connection.BeginTransaction(); //开启事务 // cmd = new OleDbCommand();
// cmd.Connection = connection;
// cmd.Transaction = transaction; // foreach (DataRow row in dt.Rows)
// {
// //插入记录
// cmd.CommandText = GetInsertRecordString(dt, row, sheetName);
// cmd.ExecuteNonQuery();
// }
// transaction.Commit(); //提交事务
// }
// catch (Exception ex)
// {
// transaction.Rollback(); //回滚事务
// connection.Close(); // if (File.Exists(destFileName))
// File.Delete(destFileName); //删除Excel文件 // //包装异常再次抛出
// //throw ExceptionManager.WrapExcepion(ex, "写入Excel失败," + ex.Message, typeof(ExcelAccessException));
// }
// finally
// {
// cmd.Dispose();
// transaction.Dispose();
// connection.Dispose();
// }
//} /// <summary>
/// 获取 Excel 连接对象
/// (用于读取 Excel 2000 及更高版本文件)。
/// </summary>
/// <param name="fullPath">文件的完全路径。</param>
/// <param name="firstRowAsHeader">是否将第一行作为表头处理。</param>
/// <param name="modeValue">Excel 导入混合类型,通常使用 ImportMixedType.Text。</param>
/// <returns>Excel 连接对象。</returns>
public static OleDbConnection GetExcelConnection(string fullPath, bool firstRowAsHeader, ImportMixedType modeValue)
{
return GetExcelConnection(fullPath, firstRowAsHeader, modeValue, ExcelVersion.Excel8);
} /// <summary>
/// 获取 Excel 连接对象。
/// </summary>
/// <param name="fullPath">文件的完全路径。</param>
/// <param name="firstRowAsHeader">是否将第一行作为表头处理。</param>
/// <param name="modeValue">Excel 导入混合类型,通常使用 ImportMixedType.Text。</param>
/// <param name="excelVersionNumber">Excel 文件版本号。</param>
/// <returns>Excel 连接对象。</returns>
public static OleDbConnection GetExcelConnection(string fullPath, bool firstRowAsHeader, ImportMixedType modeValue, ExcelVersion excelVersionNumber)
{
if (fullPath == null)
throw new ArgumentNullException("fullPath", "参数值不能为空引用。"); if (fullPath.Trim() == string.Empty)
throw new ArgumentException("参数值不能为空字符串。", "fullPath"); if (!File.Exists(fullPath))
throw new FileNotFoundException(string.Format("访问给定路径下的文件失败。文件路径:{0}", fullPath)); string hdrString = "No";
if (firstRowAsHeader)
{
hdrString = "Yes";
} string excelVersionString = string.Empty;
switch (excelVersionNumber)
{
case ExcelVersion.Excel5:
excelVersionString = "Excel 5.0";
break; case ExcelVersion.Excel8:
excelVersionString = "Excel 8.0";
break;
} // 构造连接字符串
string connectionString = string.Format(@"
Provider=Microsoft.Jet.OLEDB.4.0;
Data Source={0};
Extended Properties=""{1};HDR={2};IMEX={3};""
", fullPath, excelVersionString, hdrString, modeValue); return new OleDbConnection(connectionString);
#region Excel 连接串详解
//
// Connection String -- 连接字符串
//
// # 在书写连接字符串须十分仔细,因为如果连接串中存在错误,
// Jet Engine 不会给出恰当的错误细节。
//
// # Syntax 语法如下:
// Provider=Microsoft.Jet.OLEDB.4.0;Data Source=<Full Path of Excel File>; Extended Properties="Excel 8.0; HDR=No; IMEX=1"
//
//
// Extended Properties -- 扩展属性
//
// # Excel <Excel 8.0/Excel 5.0>
// 指定 Excel Sheet 的版本。
// 对于 Excel 2000 及更高版本,应选用 Excel 8.0;
// 对于其他版本,应选用 Excel 5.0。
//
// # HDR= <Yes/No>
// 该属性用于为各列指定列头。
// 若该值为 Yes,则首行被作为列头处理;
// 若该值为 No,则由系统自动产生列头,形如:F1, F2 等。
//
// # IMEX= <0/1/2>
// IMEX 指 IMport EXport mode。该属性具有三种可能的值。
//
// * IMEX=0 和 IMEX=2 将导致 ImportMixedTypes 的值被忽略而使用 ‘Majority Types’ 的缺省值。
// 这种情况下,将获取前 8 行数据及其各列的数据类型。
//
// * IMEX=1 是将 ImportMixedTypes 值设置为 Text 类型的唯一方式。
// 这样,每样东东都被作为文本处理。
//
//
// 以上信息参考:
// http://www.codeproject.com/useritems/Excel_Connectivity.asp //
#endregion Excel 连接串详解
} /// <summary>
/// 读取给定连接给定表的内容至 DataTable。
/// </summary>
/// <param name="cn">给定连接</param>
/// <param name="sheetName">给定 WorkSheet 的名称</param>
/// <returns>包含给定 Sheet 数据的 DataTable</returns>
public static System.Data.DataTable ExecuteDataTable(OleDbConnection cn, string sheetName)
{
System.Data.DataTable dt = null; if (sheetName == null)
throw new ArgumentNullException("sheetName", "参数值不能为空引用。"); if (sheetName.Trim() == string.Empty)
throw new ArgumentException("参数值不能为空字符串。", "sheetName"); string queryString = string.Format("SELECT * FROM [{0}$]", sheetName);
dt = new System.Data.DataTable(sheetName);
OleDbDataAdapter da = new OleDbDataAdapter(queryString, cn);
da.Fill(dt);
return dt;
} #region 私有方法
/// <summary>
/// 根据模板创建副本
/// </summary>
/// <param name="filePath">原始文件路径</param>
/// <param name="outputDirectory">输入路径</param>
/// <returns>新文件路径</returns>
private static string CopyFromTemplate(string filePath, string outputDirectory)
{
FileInfo file = new FileInfo(filePath);
string destFileName = Path.Combine(outputDirectory, file.Name.Replace(file.Extension, string.Empty) +
"-" + DateTime.Now.ToString("yyyy-MM-dd") + "(" + Guid.NewGuid() + ")" + file.Extension);
File.Copy(filePath, destFileName); return destFileName;
} /// <summary>
/// 创建工作区
/// </summary>
/// <param name="connection">OleDB连接</param>
/// <param name="sheetName">工作区名称</param>
/// <param name="columnNames">列名</param>
private static void CreateSheet(OleDbConnection connection, string sheetName, string columnNames)
{
string createTableScript = GetCreateTableString(sheetName, columnNames.Split(',')); connection.Open();
using (OleDbCommand cmd = new OleDbCommand(createTableScript, connection))
{
cmd.ExecuteNonQuery();
} connection.Close();
} /// <summary>
/// 获得创建工作区格式脚本
/// </summary>
/// <param name="sheetName">工作区名称</param>
/// <param name="names">列名</param>
/// <returns>创建脚本</returns>
private static string GetCreateTableString(string sheetName, string[] names)
{
StringBuilder sb = new StringBuilder(); sb.Append(string.Format("CREATE TABLE {0} (", sheetName));
for (int i = 0; i < names.Length; i++)
{
if (i == names.Length - 1)
sb.Append(string.Format("{0} VARCHAR(100))", names[i]));
else
sb.Append(string.Format("{0} VARCHAR(100),", names[i]));
} return sb.ToString();
} /// <summary>
/// 获得插入记录脚本
/// </summary>
/// <param name="dt">数据源</param>
/// <param name="row">当前数据行</param>
/// <returns>插入记录脚本</returns>
private static string GetInsertRecordString(DataTable dt, DataRow row, string sheetName)
{
StringBuilder sb = new StringBuilder(); sb.Append(string.Format("INSERT INTO {0} VALUES(", sheetName));
for (int i = 0; i < dt.Columns.Count; i++)
{
if (i == dt.Columns.Count - 1)
sb.Append(string.Format("'{0}')", row[i].ToString().Replace("'", "''")));
else
sb.Append(string.Format("'{0}',", row[i].ToString().Replace("'", "''")));
} return sb.ToString();
} /// <summary>
/// 获得列名
/// </summary>
/// <param name="dt">数据源</param>
/// <returns>全部列名</returns>
private static string GetColumnNames(DataTable dt)
{
StringBuilder sb = new StringBuilder();
foreach (DataColumn column in dt.Columns)
{
sb.Append(string.Format("[{0}],", column.ColumnName));
}
string columnNames = sb.ToString().TrimEnd(',');
return columnNames;
}
#endregion #region 枚举
/// <summary>
/// Excel 导入混合类型。
/// </summary>
public enum ImportMixedType
{
/// <summary>
/// 多值(数)类型 0,慎用此值!
/// </summary>
Majority0 = 0,
/// <summary>
/// 文本类型,通常使用该值。
/// </summary>
Text = 1,
/// <summary>
/// 多值(数)类型 2,慎用此值!
/// </summary>
Majority2 = 2
} /// <summary>
/// Excel 文件版本。
/// 读取 Excel 2000 及更高版本文件时应选用 Excel8;
/// 读取其他版本文件时均选用 Excel5。
/// </summary>
public enum ExcelVersion
{
/// <summary>
/// 读取低于 Excel 2000 的版本文件时应选用此值。
/// </summary>
Excel5 = 0,
/// <summary>
/// 读取 Excel 2000 及更高版本文件时应选用此值。
/// </summary>
Excel8 = 1
} #endregion 枚举
}
}