C#:导入Excel通用类(CSV格式)

时间:2021-12-15 08:54:01
  • 一、引用插件LumenWorks.Framework.IO.dll(CsvReader)

     插件下载地址:https://pan.baidu.com/s/1X9Sl4bWTNHJOJb_v-KUndA  提取密码 0az3

  • 二、定义通用接口IExcelData.cs和IDataTransform.cs

  IDataTransform.cs

public interface IDataTransform { List<Dictionary<string, string>> DataTableToDictionary(DataTable dt); }

  IExcelData.cs    

public interface IExcelData : IDataTransform
{
/// <summary>
/// Excel工作薄所有表格转化成DataTable对应字典
/// </summary>
Dictionary<string, DataTable> DataTableDictionary { get; } /// <summary>
/// Excel工作薄所有表格的名称集合
/// </summary>
List<string> SheetNames { get; } /// <summary>
/// Excel工作薄所有表格数据集合
/// </summary>
List<DataTable> DataTableList { get; } /// <summary>
/// 表格数量
/// </summary>
int SheetCount { get; } /// <summary>
/// Excel文件路径
/// </summary>
string FilePath { get; } /// <summary>
/// Excel流
/// </summary>
Stream ExcelStream { get; } /// <summary>
/// Excel文件类型
/// </summary>
ExcelType ExcelType { get; } /// <summary>
/// 获取Excel第一列数据集合
/// </summary>
List<Dictionary<string, string>> GetFirstRecords(); /// <summary>
/// 执行方法
/// </summary>
void Load();
}
  • 三、定义通用类CsvData.cs

     CsvData.cs

public class CsvData : IExcelData
{
#region 属性值
public Dictionary<string, DataTable> DataTableDictionary
{
get { throw new NotImplementedException(); }
}
public List<string> SheetNames
{
get { throw new NotImplementedException(); }
}
public List<DataTable> DataTableList
{
get { throw new NotImplementedException(); }
}
public int SheetCount
{
get { throw new NotImplementedException(); }
}
private string m_filePath;
public string FilePath
{
get { return m_filePath; }
}
private Stream m_stream;
public Stream ExcelStream
{
get { return m_stream; }
}
public ExcelType ExcelType
{
get { throw new NotImplementedException(); }
}
private List<Dictionary<string, string>> m_Records;
public List<Dictionary<string, string>> Records { get { return m_Records; } }
#endregion
#region 构造
public CsvData(string path)
{
m_filePath = path;
}
public CsvData(Stream stream)
{
m_stream = stream;
}
#endregion
#region 方法
public List<Dictionary<string, string>> DataTableToDictionary(DataTable dt)
{
throw new NotImplementedException();
} public List<Dictionary<string, string>> GetFirstRecords()
{
return m_Records;
} /// <summary>
/// 执行方法
/// </summary>
public void Load()
{
if (!string.IsNullOrEmpty(m_filePath))
Load(m_filePath);
else
Load(m_stream);
} /// <summary>
/// 执行方法
/// </summary>
/// <param name="m_filePath">文件路径</param>
private void Load(string m_filePath)
{
using (FileStream fs=File.Open(m_filePath,FileMode.Open,FileAccess.Read))
{
using (StreamReader sr=new StreamReader(fs))
{
using (CsvReader csvReader=new CsvReader(sr,false))
{
m_Records = new List<Dictionary<string, string>>();
int count = csvReader.FieldCount;
string[] keys = new string[count];
string[] array = new string[count];
IEnumerator rows = csvReader.GetEnumerator();
try
{
while (rows.MoveNext())
{
if (csvReader.CurrentRecordIndex==)
{
keys = (string[])rows.Current;
for (int i = ; i < keys.Length; i++)
{
string s = keys[i].Replace('"', ' ').Trim();
keys[i] = s;
}
}
else
{
array = (string[])rows.Current;
Dictionary<string, string> dic = new Dictionary<string, string>();
for (int i = ; i < keys.Length; i++)
{
dic.Add(keys[i], array[i]);
}
m_Records.Add(dic);
}
}
}
catch
{
throw;
}
}
}
}
} /// <summary>
/// 执行方法
/// </summary>
/// <param name="m_stream">文件流</param>
private void Load(Stream m_stream)
{
using (StreamReader sr=new StreamReader(m_stream))
{
while (true)
{
var line = sr.ReadLine();
if (line=="")
{
break;
}
}
for (int i = ; i < ; i++)
{
sr.Read();
}
using (CsvReader csvReader=new CsvReader(sr,false))
{
m_Records = new List<Dictionary<string, string>>();
int count = csvReader.FieldCount;
string[] keys = new string[count];
string[] array = new string[count];
IEnumerator rows = csvReader.GetEnumerator();
try
{
while (rows.MoveNext())
{
if (csvReader.CurrentRecordIndex==)
{
keys = (string[])rows.Current;
for (int i = ; i < keys.Length; i++)
{
string s = keys[i].Replace('"', ' ').Trim();
keys[i] = s;
}
}
else
{
array = (string[])rows.Current;
Dictionary<string, string> dic = new Dictionary<string, string>();
for (int i = ; i < keys.Length; i++)
{
dic.Add(keys[i], array[i]);
}
m_Records.Add(dic);
}
}
}
catch
{ throw;
}
}
}
}
#endregion
}

注:以上的通用类将CSV格式的Excel转换成DataTable,识别Excel中的首列为数据库表的列项,会提取这一列如果判断匹配,这个就是业务代码了,以上未提供,根据需求自己编写就好。

原著:清风一人醉http://www.cnblogs.com/W--Jing/

以上方法可以个人分享研究!

不可做商业项目,违者必究!