赞
踩
一、利用第三方库dll读取Excel文件
1.优点:利用第三方库ClosedXML、Npoi、OpenXML、EPPlus等dll读取Excel文件,程序编写简单,与excel文件直观读取差不多。
2.缺点:读取小数据量比较快,上100万单元格数据就比较慢,需要7000毫秒以上。
二、利用OLEDB读取Excel文件
1.优点:读取速度快。100万单元格数据3000毫秒左右。
2.缺点:数据读取单元格的属性单一。
/// <summary>
/// OLEDB读取EXCEL文件到DATATABLE中
/// </summary>
/// <param name="path">文件名</param>
/// <param name="sheetName">Sheet名</param>
/// <returns>返回DataTable</returns>
private DataTable ReadExcelToDataSet(string path, string sheetName, bool HDR = true)
{
string connstring = string.Empty;
if (HDR) { connstring = Program.oledbcon + path + Program.constr; } //链接字符串
//string oledbcon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="; //链接字符
//string constr = ";Extended Properties=\"Excel 12.0; HDR=YES; IMEX=1;\"";
else { connstring = Program.oledbcon + path + ";Extended Properties=\"Excel 12.0; HDR=NO; IMEX=1;\""; }
using (OleDbConnection conn = new OleDbConnection(connstring))
{
conn.Open();
DataTable set = new DataTable();
string sql = string.Format("SELECT * FROM[{0}$]", sheetName);
OleDbDataAdapter ada = new OleDbDataAdapter(sql, connstring);
ada.Fill(set);
conn.Close();
return set;
}
}
三、利用LINQToEXCEL读取EXCEL 文件
1.优点:与OLEDB读取速度相当
2.缺点:数据读取单元格的属性单一。表格数据较规整。
#region LinqToExcel操作
/// <summary>
/// LinqToExcel方式将Excel文件读入到DataTable中
/// </summary>
/// <param name="excelfilename">Excel电子表格的完整路径</param>
/// <param name="sheetname">工作表名称</param>
/// <returns>DataTable sdt 返回DataTable数据</returns>
private static DataTable ReadExcelToDataTable(string excelfilename, string sheetname) //,bool MeterHead=true
{
DataTable sdt = new DataTable();
try
{
var excel = new ExcelQueryFactory(excelfilename); //建立链接
List<string> list = GetColumnNames(excel, sheetname); //获取工作表列名
foreach (string s in list) { sdt.Columns.Add(s); } //写入sdt列名
int colCount = sdt.Columns.Count; //列数
var indianaCompanies = from c in excel.Worksheet(sheetname)
select c;
foreach (var cell in indianaCompanies) // 一行数据
{
DataRow dr = sdt.NewRow();
for (int i = 0; i < colCount; i++)
{
dr[i] = cell[i].Value.ToString().Trim(); //第一列数据
}
sdt.Rows.Add(dr);
}
}
catch (Exception)
{
throw;
}
return sdt;
}
/// <summary>
/// LinqToExcel方式将Excel文件读入到DataTable中
/// </summary>
/// <param name="excelfilename"></param>
/// <param name="sheetname"></param>
/// <returns></returns>
private static DataTable ReadExcelToDataTable(ExcelQueryFactory excelfilename, string sheetname) //,bool MeterHead=true
{
DataTable sdt = new DataTable();
//var excel = new ExcelQueryFactory(excelfilename); //建立链接
try
{
if (excelfilename != null)
{
List<string> list = GetColumnNames(excelfilename, sheetname); //获取工作表列名
foreach (string s in list) { sdt.Columns.Add(s); } //写入sdt列名
int colCount = sdt.Columns.Count; //列数
var indianaCompanies = from c in excelfilename.Worksheet(sheetname)
select c;
//int col = indianaCompanies.Count(); //总行数
//int col = excelfilename.GetColumnNames(sheetname).Count(); //总列数
foreach (var cell in indianaCompanies) // 一行数据
{
DataRow dr = sdt.NewRow();
for (int i = 0; i < colCount; i++)
{
dr[i] = cell[i].Value.ToString().Trim(); //第一列数据
}
sdt.Rows.Add(dr);
}
}
}
catch (Exception)
{
throw;
}
return sdt;
}
/// <summary>
/// 获取工作簿中工作表名称
/// </summary>
/// <param name="excelfilename"></param>
/// <returns></returns>
private static List<string> GetWorkSheetNames(ExcelQueryFactory excelfilename)
{
List<string> list = new List<string>();
try
{
if (excelfilename != null)
{
foreach (string s in excelfilename.GetWorksheetNames())
{ list.Add(s); }
}
}
catch (Exception)
{
throw;
}
return list;
}
/// <summary>
/// 获得excelfilename文件工作表sheetname的列名
/// </summary>
/// <param name="excelfilename"></param>
/// <param name="sheetname"></param>
/// <returns></returns>
private static List<string> GetColumnNames(ExcelQueryFactory excelfilename, string sheetname)
{
List<string> names = new List<string>();
//var excel = new ExcelQueryFactory(excelfilename); //建立链接
try
{
if (excelfilename != null)
{
foreach (string columnname in excelfilename.GetColumnNames(sheetname))
{
names.Add(columnname);
}
}
}
catch (Exception)
{
throw;
}
return names;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。