You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
242 lines
8.9 KiB
242 lines
8.9 KiB
using System;
|
|
using System.Data;
|
|
using System.IO;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Reflection;
|
|
|
|
namespace Sog
|
|
{
|
|
public static class CsvHelper
|
|
{
|
|
/// <summary>
|
|
/// 写入CSV文件
|
|
/// </summary>
|
|
/// <param name="dt">DataTable</param>
|
|
/// <param name="fileName">文件全名</param>
|
|
/// <returns>是否写入成功</returns>
|
|
public static bool SaveCSV(DataTable dt, string fullFileName)
|
|
{
|
|
var r = false;
|
|
FileStream fs = new FileStream(fullFileName, System.IO.FileMode.Create, System.IO.FileAccess.Write);
|
|
StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.Default);
|
|
string data = "";
|
|
|
|
//写出列名称
|
|
for (int i = 0; i < dt.Columns.Count; i++)
|
|
{
|
|
data += dt.Columns[i].ColumnName.ToString();
|
|
if (i < dt.Columns.Count - 1)
|
|
{
|
|
data += ",";
|
|
}
|
|
}
|
|
sw.WriteLine(data);
|
|
|
|
//写出各行数据
|
|
for (int i = 0; i < dt.Rows.Count; i++)
|
|
{
|
|
data = "";
|
|
for (int j = 0; j < dt.Columns.Count; j++)
|
|
{
|
|
data += dt.Rows[i][j].ToString();
|
|
if (j < dt.Columns.Count - 1)
|
|
{
|
|
data += ",";
|
|
}
|
|
}
|
|
sw.WriteLine(data);
|
|
}
|
|
|
|
sw.Close();
|
|
fs.Close();
|
|
|
|
r = true;
|
|
return r;
|
|
}
|
|
|
|
|
|
public static List<T> GetByFullPath<T>(string fullFileName) where T : class, new()
|
|
{
|
|
DataTable dt = OpenCSV(fullFileName);
|
|
return TableToEntity<T>(dt);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 打开CSV 文件
|
|
/// </summary>
|
|
/// <param name="fileName">文件全名</param>
|
|
/// <returns>DataTable</returns>
|
|
public static DataTable OpenCSV(string fullFileName)
|
|
{
|
|
return OpenCSV(fullFileName, 0, 0, 0, 0, true);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 打开CSV 文件
|
|
/// </summary>
|
|
/// <param name="fileName">文件全名</param>
|
|
/// <param name="firstRow">开始行</param>
|
|
/// <param name="firstColumn">开始列</param>
|
|
/// <param name="getRows">获取多少行</param>
|
|
/// <param name="getColumns">获取多少列</param>
|
|
/// <param name="haveTitleRow">是有标题行</param>
|
|
/// <returns>DataTable</returns>
|
|
public static DataTable OpenCSV(string fullFileName, Int16 firstRow = 0, Int16 firstColumn = 0, Int16 getRows = 0, Int16 getColumns = 0, bool haveTitleRow = true)
|
|
{
|
|
DataTable dt = new DataTable();
|
|
FileStream fs = new FileStream(fullFileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);
|
|
StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);
|
|
//记录每次读取的一行记录
|
|
string strLine = "";
|
|
//记录每行记录中的各字段内容
|
|
string[] aryLine;
|
|
//标示列数
|
|
int columnCount = 0;
|
|
//是否已建立了表的字段
|
|
bool bCreateTableColumns = false;
|
|
//第几行
|
|
int iRow = 1;
|
|
|
|
//去除无用行
|
|
if (firstRow > 0)
|
|
{
|
|
for (int i = 1; i < firstRow; i++)
|
|
{
|
|
sr.ReadLine();
|
|
}
|
|
}
|
|
|
|
// { ",", ".", "!", "?", ";", ":", " " };
|
|
string[] separators = { "," };
|
|
//逐行读取CSV中的数据
|
|
while ((strLine = sr.ReadLine()) != null)
|
|
{
|
|
strLine = strLine.Trim();
|
|
aryLine = strLine.Split(separators, System.StringSplitOptions.RemoveEmptyEntries);
|
|
|
|
if (bCreateTableColumns == false)
|
|
{
|
|
bCreateTableColumns = true;
|
|
columnCount = aryLine.Length;
|
|
//创建列
|
|
for (int i = firstColumn; i < (getColumns == 0 ? columnCount : firstColumn + getColumns); i++)
|
|
{
|
|
DataColumn dc
|
|
= new DataColumn(haveTitleRow == true ? aryLine[i] : "COL" + i.ToString());
|
|
dt.Columns.Add(dc);
|
|
}
|
|
|
|
bCreateTableColumns = true;
|
|
|
|
if (haveTitleRow == true)
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
|
|
|
|
DataRow dr = dt.NewRow();
|
|
for (int j = firstColumn; j < (getColumns == 0 ? columnCount : firstColumn + getColumns); j++)
|
|
{
|
|
dr[j - firstColumn] = aryLine[j];
|
|
}
|
|
dt.Rows.Add(dr);
|
|
|
|
iRow = iRow + 1;
|
|
if (getRows > 0)
|
|
{
|
|
if (iRow > getRows)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
sr.Close();
|
|
fs.Close();
|
|
return dt;
|
|
}
|
|
|
|
/// <summary>
|
|
/// DataTable转换成实体类
|
|
/// </summary>
|
|
/// <typeparam name="T"></typeparam>
|
|
/// <param name="dt"></param>
|
|
/// <returns></returns>
|
|
public static List<T> TableToEntity<T>(DataTable dt) where T : class, new()
|
|
{
|
|
List<T> list = new List<T>();
|
|
try
|
|
{
|
|
foreach (DataRow row in dt.Rows)
|
|
{
|
|
T entity = new T();
|
|
PropertyInfo[] pArray = entity.GetType().GetProperties();
|
|
|
|
foreach (PropertyInfo p in pArray)
|
|
{
|
|
if (dt.Columns.Contains(p.Name))
|
|
{
|
|
if (!p.CanWrite) continue;
|
|
var value = row[p.Name];
|
|
if (value != DBNull.Value)
|
|
{
|
|
Type targetType = p.PropertyType;
|
|
Type convertType = targetType;
|
|
if (targetType.IsGenericType && targetType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
|
|
{
|
|
//可空类型
|
|
NullableConverter nullableConverter = new NullableConverter(targetType);
|
|
convertType = nullableConverter.UnderlyingType;
|
|
}
|
|
if (!string.IsNullOrEmpty(convertType.FullName) && !string.IsNullOrEmpty(value.ToString()))
|
|
{
|
|
value = Convert.ChangeType(value, convertType);
|
|
}
|
|
switch (convertType.FullName)
|
|
{
|
|
case "System.Decimal":
|
|
p.SetValue(entity, Convert.ToDecimal(value), null);
|
|
break;
|
|
case "System.String":
|
|
p.SetValue(entity, Convert.ToString(value), null);
|
|
break;
|
|
case "System.Int32":
|
|
p.SetValue(entity, Convert.ToInt32(value), null);
|
|
break;
|
|
case "System.Int64":
|
|
p.SetValue(entity, Convert.ToInt64(value), null);
|
|
break;
|
|
case "System.Int16":
|
|
p.SetValue(entity, Convert.ToInt16(value), null);
|
|
break;
|
|
case "System.Double":
|
|
p.SetValue(entity, Convert.ToDouble(value), null);
|
|
break;
|
|
case "System.DateTime":
|
|
p.SetValue(entity, Convert.ToDateTime(value), null);
|
|
break;
|
|
default:
|
|
p.SetValue(entity, value, null);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
list.Add(entity);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine(ex.Message);
|
|
}
|
|
|
|
if (list.Count > 0)
|
|
return list;
|
|
else
|
|
return null;
|
|
}
|
|
}
|
|
}
|