WinForm项目开发中Excel用法实例解析

所属分类: 软件编程 / C#教程 阅读数: 49
收藏 0 赞 0 分享

在实际项目的开发过程中,所涉及的EXCEL往往会比较复杂,并且列中还会带有一些计算公式,这就给读取带来了很大的困难,曾经尝试过一些免费的第三方dll,譬如Myxls,NPOI,IExcelDataReader都会出现一些问题,最后采用OLEDB形式读取,再x64操作系统上有点问题,不过采用小技巧即可解决,可以参考链接地址:http://ellisweb.net/2010/01/connecting-to-excel-and-access-files-using-net-on-a-64-bit-server/

封装代码如下:

namespace DBUtilHelpV2
{
public class OLEDBExcelToolV2
{
static readonly string xls = ".xls";
static readonly string xlsx = ".xlsx";
string _ExcelExtension = string.Empty;//后缀
string _ExcelPath = string.Empty;//路径
string _ExcelConnectString = string.Empty;//链接字符串
static bool _X64Version = false;//是否强制使用x64链接字符串,即xlsx形式
public OLEDBExcelToolV2(string excelPath, bool x64Version)
{
  if (string.IsNullOrEmpty(excelPath))
 throw new ArgumentNullException("excelPath");
  if (!File.Exists(excelPath))
 throw new ArgumentException("excelPath");
  string _excelExtension = Path.GetExtension(excelPath);
  _ExcelExtension = _excelExtension.ToLower();
  _ExcelPath = excelPath;
  _X64Version = x64Version;
  _ExcelConnectString = BuilderConnectionString();
}
/// <summary>
/// 创建链接字符串
/// </summary>
/// <returns></returns>
private string BuilderConnectionString()
{
  Dictionary<string, string> _connectionParameter = new Dictionary<string, string>();
  if (!_ExcelExtension.Equals(xlsx) && !_ExcelExtension.Equals(xls))
  {
 throw new ArgumentException("excelPath");
  }

  if (!_X64Version)
  {
 if (_ExcelExtension.Equals(xlsx))
 {
   // XLSX - Excel 2007, 2010, 2012, 2013
   _connectionParameter["Provider"] = "Microsoft.ACE.OLEDB.12.0;";
   _connectionParameter["Extended Properties"] = "'Excel 12.0 XML;IMEX=1'";
 }
 else if (_ExcelExtension.Equals(xls))
 {
   // XLS - Excel 2003 and Older
   _connectionParameter["Provider"] = "Microsoft.Jet.OLEDB.4.0";
   _connectionParameter["Extended Properties"] = "'Excel 8.0;IMEX=1'";
 }
  }
  else
  {
 _connectionParameter["Provider"] = "Microsoft.ACE.OLEDB.12.0;";
 _connectionParameter["Extended Properties"] = "'Excel 12.0 XML;IMEX=1'";
  }

  _connectionParameter["Data Source"] = _ExcelPath;
  StringBuilder _connectionString = new StringBuilder();

  foreach (KeyValuePair<string, string> parameter in _connectionParameter)
  {
 _connectionString.Append(parameter.Key);
 _connectionString.Append('=');
 _connectionString.Append(parameter.Value);
 _connectionString.Append(';');
  }
  return _connectionString.ToString();
}
/// <summary>
/// Excel操作
/// DELETE不支持
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public int ExecuteNonQuery(string sql)
{
  int _affectedRows = -1;
  using (OleDbConnection sqlcon = new OleDbConnection(_ExcelConnectString))
  {
 try
 {
   sqlcon.Open();
   using (OleDbCommand sqlcmd = new OleDbCommand(sql, sqlcon))
   {
 _affectedRows = sqlcmd.ExecuteNonQuery();
   }
 }
 catch (Exception)
 {
   return -1;
 }
  }
  return _affectedRows;
}
/// <summary>
/// Excel操作
///获取EXCEL内sheet集合
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public string[] GetExcelSheetNames()
{
  DataTable _schemaTable = null;
  using (OleDbConnection sqlcon = new OleDbConnection(_ExcelConnectString))
  {
 try
 {
   sqlcon.Open();
   _schemaTable = sqlcon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
   String[] _excelSheets = new String[_schemaTable.Rows.Count];
   int i = 0;
   foreach (DataRow row in _schemaTable.Rows)
   {
 _excelSheets[i] = row["TABLE_NAME"].ToString().Trim();
 i++;
   }
   return _excelSheets;
 }
 catch (Exception)
 {
   return null;
 }
 finally
 {
   if (_schemaTable != null)
   {
 _schemaTable.Dispose();
   }
 }
  }
}
/// <summary>
/// 读取sheet
/// eg:select * from [Sheet1$]
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public DataTable ExecuteDataTable(string sql)
{
  using (OleDbConnection sqlcon = new OleDbConnection(_ExcelConnectString))
  {
 try
 {
   using (OleDbCommand sqlcmd = new OleDbCommand(sql, sqlcon))
   {
 using (OleDbDataAdapter sqldap = new OleDbDataAdapter(sqlcmd))
 {
   DataTable _dtResult = new DataTable();
   sqldap.Fill(_dtResult);
   return _dtResult;
 }
   }
 }
 catch (Exception)
 {
   return null;
 }
  }

}
/// <summary>
/// 获取excel所有sheet数据
/// </summary>
/// <returns>DataSet</returns>
public DataSet ExecuteDataSet()
{
  DataSet _excelDb = null;
  using (OleDbConnection sqlcon = new OleDbConnection(_ExcelConnectString))
  {
 try
 {
   sqlcon.Open();
   DataTable _schemaTable = sqlcon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
   if (_schemaTable != null)
   {
 int i = 0;
 _excelDb = new DataSet();
 foreach (DataRow row in _schemaTable.Rows)
 {
   string _sheetName = row["TABLE_NAME"].ToString().Trim();
   string _sql = string.Format("select * from [{0}]", _sheetName);
   using (OleDbCommand sqlcmd = new OleDbCommand(_sql, sqlcon))
   {
  using (OleDbDataAdapter sqldap = new OleDbDataAdapter(sqlcmd))
  {
    DataTable _dtResult = new DataTable();
    _dtResult.TableName = _sheetName;
    sqldap.Fill(_dtResult);
    _excelDb.Tables.Add(_dtResult);
  }
   }
   i++;
 }
   }
 }
 catch (Exception)
 {
   return null;
 }
  }
  return _excelDb;
}
}
}

代码使用方法如下:

/// <summary>
/// 合并EXCEL数据
/// </summary>
/// <param name="_excelPath">excel路径</param>
private void HandleMergeExcel(string _excelPath)
{
  if (!string.IsNullOrEmpty(_excelPath))
  {
 OLEDBExcelToolV2 _excelHelper = new OLEDBExcelToolV2(_excelPath, true);
 DataSet _excelSource = _excelHelper.ExecuteDataSet();
 HandleExcelSource(_excelSource);
  }
}

若在x64操作系统,将第二个参数设置true,并且按照AccessDatabaseEngine_X64.exe即可正常读取

代码运行效果如下图所示:

更多精彩内容其他人还在看

C#使用oledb读取excel表格内容到datatable的方法

这篇文章主要介绍了C#使用oledb读取excel表格内容到datatable的方法,涉及C#操作oledb及datatable的相关技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#使用oledb操作excel文件的方法

这篇文章主要介绍了C#使用oledb操作excel文件的方法,涉及C#中oledb操作excel的相关技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#使用IHttpModule接口修改http输出的方法

这篇文章主要介绍了C#使用IHttpModule接口修改http输出的方法,涉及C#操作IHttpModule接口的相关技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#给图片加水印的简单实现方法

这篇文章主要介绍了C#给图片加水印的简单实现方法,涉及C#操作图片的相关技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#生成随机数的方法小结

这篇文章主要介绍了C#生成随机数的方法,实例总结了C#生成随机数的相关技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#使用jQuery实现无刷新评论提交的方法

这篇文章主要介绍了C#使用jQuery实现无刷新评论提交的方法,涉及C#结合jQuery进行Ajax操作的相关技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#读取中文文件出现乱码的解决方法

这篇文章主要介绍了C#读取中文文件出现乱码的解决方法,涉及C#中文编码的操作技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#图像对比度调整的方法

这篇文章主要介绍了C#图像对比度调整的方法,涉及C#实现图像对比度操作的相关技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#图像灰度级拉伸的方法

这篇文章主要介绍了C#图像灰度级拉伸的方法,涉及C#灰度操作的相关技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#图像线性变换的方法

这篇文章主要介绍了C#图像线性变换的方法,涉及C#操作图像线性变换的相关技巧,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多