• c#结构体、打他table、excel、csv互转


    1.csv相关

      1   public static class CsvHelper
      2     {
      3         /// <summary>
      4         /// 根据csv路径获取datatable
      5         /// </summary>
      6         /// <param name="csvPath"></param>
      7         /// <param name="errMsg"></param>
      8         /// <returns></returns>
      9         public static DataTable GetDataTable(string csvPath, out string errMsg)
     10         {
     11             var result = GetDt(csvPath, out errMsg, true);
     12             GC.Collect();
     13             GC.WaitForPendingFinalizers();
     14             GC.Collect();
     15             GC.WaitForPendingFinalizers();
     16             return result;
     17         }
     18         private static DataTable GetDt(string csvPath, out string errMsg, bool hasTitle = false)
     19         {
     20             var dt = new DataTable();
     21             try
     22             {
     23                 //将数据读入到DataTable中  
     24                 if (!File.Exists(csvPath))
     25                 {
     26                     errMsg = "找不到csv文件" + csvPath;
     27                     return null;
     28                 }
     29                 using (StreamReader sr = new StreamReader(csvPath))
     30                 {
     31                     string line = sr.ReadLine();
     32                     if (!string.IsNullOrEmpty(line))
     33                     {
     34                         var columes = line.Split(',');
     35                         //生成列头
     36                         for (var i = 0; i < columes.Length; i++)
     37                         {
     38                             var name = "column" + i;
     39                             if (hasTitle)
     40                             {
     41                                 var txt = columes[i];
     42                                 if (!string.IsNullOrWhiteSpace(txt))
     43                                 {
     44                                     name = txt;
     45                                 }
     46                             }
     47                             while (dt.Columns.Contains(name)) name = name + "_1"; //重复行名称会报错。
     48                             dt.Columns.Add(new DataColumn(name, typeof(string)));
     49                         }
     50 
     51                         if (!hasTitle)
     52                         {
     53                             var dr = dt.NewRow();
     54                             for (var iCol = 0; iCol < columes.Length; iCol++)
     55                             {
     56                                 var range = columes[iCol];
     57                                 dr[iCol] = range;
     58                             }
     59                             dt.Rows.Add(dr);
     60                         }
     61                         line = sr.ReadLine();
     62                         //生成行数据
     63                         while (!string.IsNullOrWhiteSpace(line))
     64                         {
     65                             columes = line.Split(',');
     66                             var dr = dt.NewRow();
     67                             for (var iCol = 0; iCol < columes.Length; iCol++)
     68                             {
     69                                 var range = columes[iCol];
     70                                 dr[iCol] = range;
     71                             }
     72                             dt.Rows.Add(dr);
     73                             line = sr.ReadLine();
     74                         }
     75                     }
     76                 }
     77                 errMsg = "";
     78                 return dt;
     79             }
     80             catch (Exception ex)
     81             {
     82                 LogHelper.Log(ex);
     83                 errMsg = ex.Message;
     84                 return null;
     85             }
     86         }
     87 
     88         /// <summary>
     89         /// 将dataTable保存到csv文件
     90         /// </summary>
     91         /// <param name="dt"></param>
     92         /// <param name="csvPath"></param>
     93         /// <param name="errMsg"></param>
     94         /// <returns></returns>
     95         public static bool SaveDataTable(DataTable dt, string csvPath, out  string errMsg)
     96         {
     97             var result = SaveDt(dt, csvPath, out errMsg);
     98             GC.Collect();
     99             GC.WaitForPendingFinalizers();
    100             GC.Collect();
    101             GC.WaitForPendingFinalizers();
    102             return result;
    103         }
    104 
    105         private static bool SaveDt(DataTable dt, string csvPath, out string errMsg)
    106         {
    107             try
    108             {
    109                 //将数据读入到DataTable中
    110                 using (StreamWriter sr = new StreamWriter(csvPath, false, Encoding.Default))
    111                 {
    112                     var iRowCount = dt.Rows.Count;
    113                     var iColCount = dt.Columns.Count;
    114                     //生成列头
    115                     StringBuilder firstRow = new StringBuilder();
    116                     for (var i = 0; i < iColCount; i++)
    117                     {
    118                         firstRow.Append(dt.Columns[i].ColumnName + ",");
    119                     }
    120                     sr.WriteLine(firstRow.ToString().TrimEnd(','));
    121                     for (var iRow = 0; iRow < iRowCount; iRow++)
    122                     {
    123                         StringBuilder otherRow = new StringBuilder();
    124                         for (var iCol = 0; iCol < iColCount; iCol++)
    125                         {
    126                             otherRow.Append(dt.Rows[iRow][iCol] + ",");
    127                         }
    128                         sr.WriteLine(otherRow.ToString().TrimEnd(','));
    129                     }
    130                     errMsg = "";
    131                     return true;
    132                 }
    133             }
    134             catch (Exception ex)
    135             {
    136                 LogHelper.Log(ex);
    137                 errMsg = ex.Message;
    138                 return false;
    139             }
    140         }
    141     }

    2.datatable相关

     1  public class DataTableHelper
     2     {
     3 
     4         /// <summary>
     5         /// DataTable转化为List集合
     6         /// </summary>
     7         /// <typeparam name="T">实体对象</typeparam>
     8         /// <param name="dt">datatable表</param> 
     9         /// <returns>返回list集合</returns>
    10         public static List<T> TableToList<T>(DataTable dt )
    11         {
    12             List<T> list = new List<T>();
    13             Type type = typeof(T); 
    14             foreach (DataRow row in dt.Rows)
    15             {
    16                 PropertyInfo[] pArray = type.GetProperties(); //集合属性数组
    17                 T entity = Activator.CreateInstance<T>(); //新建对象实例
    18                 foreach (PropertyInfo p in pArray)
    19                 {
    20                     if (!dt.Columns.Contains(p.Name) || row[p.Name] == null || row[p.Name] == DBNull.Value)
    21                     {
    22                         continue;  //DataTable列中不存在集合属性或者字段内容为空则,跳出循环,进行下个循环
    23                     }
    24                     try
    25                     {
    26                         var obj = Convert.ChangeType(row[p.Name], p.PropertyType);//类型强转,将table字段类型转为集合字段类型
    27                         p.SetValue(entity, obj, null);
    28                     }
    29                     catch (Exception)
    30                     { 
    31 
    32                     } 
    33                 }
    34                 list.Add(entity);
    35             }
    36             return list;
    37         }
    38 
    39 
    40         /// <summary>
    41         /// List集合转DataTable
    42         /// </summary>
    43         /// <typeparam name="T">实体类型</typeparam>
    44         /// <param name="list">传入集合</param> 
    45         /// <returns>返回datatable结果</returns>
    46         public static DataTable ListToTable<T>(List<T> list )
    47         {
    48             Type tp = typeof(T);
    49             PropertyInfo[] proInfos = tp.GetProperties();
    50             DataTable dt = new DataTable();
    51             foreach (var item in proInfos)
    52             {
    53                 dt.Columns.Add(item.Name, typeof(string)); //添加列明及对应类型
    54             }
    55             foreach (var item in list)
    56             {
    57                 DataRow dr = dt.NewRow();
    58                 foreach (var proInfo in proInfos)
    59                 {
    60                     object obj = proInfo.GetValue(item,null);
    61                     if (obj == null)
    62                     {
    63                         continue;
    64                     } 
    65                     if (  proInfo.PropertyType == typeof(DateTime) && Convert.ToDateTime(obj) < Convert.ToDateTime("1753-01-01"))
    66                     {
    67                         continue;
    68                     } 
    69                     dr[proInfo.Name] = obj; 
    70                 }
    71                 dt.Rows.Add(dr);
    72             }
    73             return dt;
    74         }
    75     }

    3.excel相关

      1   public static class ExcelHelper
      2     {
      3         /// <summary>
      4         /// 根据excel路径获取datatable
      5         /// </summary>
      6         /// <param name="excelPath"></param>
      7         /// <param name="errMsg"></param>
      8         /// <returns></returns>
      9         public static DataTable GetDataTable(string excelPath, out string errMsg)
     10         {
     11             var result = GetDt(excelPath, out errMsg, true);
     12             GC.Collect();
     13             GC.WaitForPendingFinalizers();
     14             GC.Collect();
     15             GC.WaitForPendingFinalizers();
     16             return result;
     17         }
     18         private static DataTable GetDt(string excelFilePath, out string errMsg, bool hasTitle = false)
     19         {
     20             Microsoft.Office.Interop.Excel.Application app = null;
     21             Microsoft.Office.Interop.Excel._Workbook workbook = null;
     22             var dt = new DataTable();
     23             object oMissiong = System.Reflection.Missing.Value;
     24             try
     25             {
     26                 app = new Microsoft.Office.Interop.Excel.Application();
     27 
     28                 workbook = app.Workbooks.Open(excelFilePath, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong,
     29                     oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong);
     30                 var sheets = workbook.Worksheets;
     31 
     32                 //将数据读入到DataTable中
     33                 var worksheet = (Microsoft.Office.Interop.Excel.Worksheet)sheets.Item[1]; //读取第一张表   
     34                 if (worksheet == null)
     35                 {
     36                     errMsg = "打开excel失败,请确保excel安装环境正确";
     37                     return null;
     38                 }
     39 
     40                 var iRowCount = worksheet.UsedRange.Rows.Count;
     41                 var iColCount = worksheet.UsedRange.Columns.Count;
     42                 //生成列头
     43                 for (var i = 0; i < iColCount; i++)
     44                 {
     45                     var name = "column" + i;
     46                     if (hasTitle)
     47                     {
     48                         var txt = ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1]).Text.ToString();
     49                         if (!string.IsNullOrWhiteSpace(txt)) name = txt;
     50                     }
     51                     while (dt.Columns.Contains(name)) name = name + "_1"; //重复行名称会报错。
     52                     dt.Columns.Add(new DataColumn(name, typeof(string)));
     53                 }
     54                 //生成行数据
     55                 var rowIdx = hasTitle ? 2 : 1;
     56                 for (var iRow = rowIdx; iRow <= iRowCount; iRow++)
     57                 {
     58                     var dr = dt.NewRow();
     59                     for (var iCol = 1; iCol <= iColCount; iCol++)
     60                     {
     61                         var range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[iRow, iCol];
     62                         dr[iCol - 1] = (range.Value2 == null) ? "" : range.Text.ToString();
     63                     }
     64                     dt.Rows.Add(dr);
     65                 }
     66                 errMsg = "";
     67                 return dt;
     68             }
     69             catch (Exception ex)
     70             {
     71                 LogHelper.Log(ex);
     72                 errMsg = ex.Message;
     73                 return null;
     74             }
     75             finally
     76             {
     77                 if (workbook != null)
     78                 {
     79                     workbook.Close(false, oMissiong, oMissiong);
     80                     System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
     81                 }
     82                 if (app != null)
     83                 {
     84                     app.Workbooks.Close();
     85                     app.Quit();
     86                     System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
     87                 }
     88             }
     89         }
     90 
     91         /// <summary>
     92         /// 将excel保存到文件
     93         /// </summary>
     94         /// <param name="dt"></param>
     95         /// <param name="excelPath"></param>
     96         /// <param name="errMsg"></param>
     97         /// <returns></returns>
     98         public static bool SaveDataTable(DataTable dt, string excelPath, out  string errMsg)
     99         {
    100             var result = SaveDt(dt, excelPath, out errMsg);
    101             GC.Collect();
    102             GC.WaitForPendingFinalizers();
    103             GC.Collect();
    104             GC.WaitForPendingFinalizers();
    105             return result;
    106         }
    107 
    108         private static bool SaveDt(DataTable dt, string excelFilePath, out string errMsg)
    109         {
    110             Microsoft.Office.Interop.Excel.Application app = null;
    111             Microsoft.Office.Interop.Excel._Workbook workbook = null;
    112             object oMissiong = System.Reflection.Missing.Value;
    113             try
    114             {
    115                 app = new Microsoft.Office.Interop.Excel.Application
    116                 {
    117                     DisplayAlerts = false
    118                 };
    119                 workbook = app.Workbooks.Add(true);
    120 
    121                 //将数据读入到DataTable中
    122                 var worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.Item[1]; //读取第一张表   
    123                 if (worksheet == null)
    124                 {
    125                     errMsg = "打开excel失败,请确保excel安装环境正确";
    126                     return false;
    127                 }
    128                 var iRowCount = dt.Rows.Count;
    129                 var iColCount = dt.Columns.Count;
    130                 //生成列头
    131                 for (var i = 0; i < iColCount; i++)
    132                 {
    133                     worksheet.Cells[1, i + 1] = dt.Columns[i].ColumnName;
    134                 }
    135                 for (var iRow = 2; iRow <= iRowCount; iRow++)
    136                 {
    137                     for (var iCol = 1; iCol <= iColCount; iCol++)
    138                     {
    139                         worksheet.Cells[iRow, iCol] = dt.Rows[iRow - 2][iCol - 1].ToString();
    140                     }
    141                 }
    142                 errMsg = "";
    143                 return true;
    144             }
    145             catch (Exception ex)
    146             {
    147                 LogHelper.Log(ex);
    148                 errMsg = ex.Message;
    149                 return false;
    150             }
    151             finally
    152             {
    153                 if (workbook != null)
    154                 {
    155                     workbook.Close(true, excelFilePath, oMissiong);
    156                     System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
    157                 }
    158                 if (app != null)
    159                 {
    160                     app.Workbooks.Close();
    161                     app.Quit();
    162                     System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
    163                 }
    164             }
    165         }
    166     }

    感谢阅读

  • 相关阅读:
    Qt读取JSON和XML数据
    IOS设计模式学习(19)策略
    Android学习笔记(二)之异步加载图片
    ETL-Career RoadMap
    HDU 1501 & POJ 2192 Zipper(dp记忆化搜索)
    CodeForces 242E
    推荐:室内定位API
    基于单片机的电子密码锁的实现
    [nagios监控] NRPE: Unable to read output 的原因及排除
    (ubuntu)在andorid andk工程中使用ccache加速编译速度
  • 原文地址:https://www.cnblogs.com/congqiandehoulai/p/8352017.html
Copyright © 2020-2023  润新知