C# csv 操作类
using System.Data; using System.IO; using System.Text; namespace YanZhiwei.DotNet2.Utilities.Common { /// <summary> /// CSV文件转换类 /// </summary> public static class CSVHelper { #region 导出到csv文件 /// <summary> /// 导出到csv文件 /// eg: /// CSVHelper.ToCSV(_personInfoView, @"C:\Users\YanZh_000\Downloads\person.csv", "用户信息表", "名称,年龄"); /// </summary> /// <param name="table">DataTable</param> /// <param name="filePath">导出路径</param> /// <param name="tableheader">标题</param> /// <param name="columname">列名称,以','英文逗号分隔</param> /// <returns>是否导出成功</returns> public static bool ToCSV(this DataTable table, string filePath, string tableheader, string columname) { try { if (File.Exists(filePath)) File.Delete(filePath); using (FileStream _stream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite)) { StreamWriter _writer = new StreamWriter(_stream, Encoding.UTF8); _writer.WriteLine(tableheader); _writer.WriteLine(columname); for (int i = 0; i < table.Rows.Count; i++) { for (int j = 0; j < table.Columns.Count; j++) { _writer.Write(table.Rows[i][j].ToString()); _writer.Write(","); } _writer.WriteLine(); } _writer.Close(); return true; } } catch { return false; } } #endregion #region 将CSV文件导入到DataTable /// <summary> /// 将CSV文件导入到DataTable /// </summary> /// <param name="table">DataTable</param> /// <param name="filePath">csv文件物理路径</param> /// <param name="startRowIndex">数据导入起始行号</param> /// <returns>DataTable</returns> public static DataTable ImportToTable(this DataTable table, string filePath, int startRowIndex) { using (StreamReader reader = new StreamReader(filePath, Encoding.UTF8, false)) { int j = 0; while (reader.Peek() > -1) { j = j + 1; string _line = reader.ReadLine(); if (j >= startRowIndex + 1) { string[] _dataArray = _line.Split(','); DataRow _dataRow = table.NewRow(); for (int k = 0; k < table.Columns.Count; k++) { _dataRow[k] = _dataArray[k]; } table.Rows.Add(_dataRow); } } return table; } } #endregion } }
using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using System.Data; using YanZhiwei.DotNet2.UtilitiesTests; namespace YanZhiwei.DotNet2.Utilities.Common.Tests { [TestClass()] public class CSVHelperTests { private DataTable TestTable; [TestMethod()] public void ToCSVTest() { for (Int16 i = 18; i < 28; i++) { DataRow _person = TestTable.NewRow(); _person["Name"] = "YanZhiwei" + i; _person["Age"] = i; TestTable.Rows.Add(_person); } bool _expected = true; bool _actual = CSVHelper.ToCSV(TestTable, @"C:\Users\YanZh_000\Downloads\person.csv", "用户信息表", "名称,年龄"); Assert.AreEqual(_expected, _actual); } [TestInitialize] public void InitTestTable() { TestTable = new DataTable(); TestTable.Columns.Add(new DataColumn("Name", typeof(string))); TestTable.Columns.Add(new DataColumn("Age", typeof(int))); } [TestMethod()] public void ImportToTableTest() { DataTable _personInfoView = TestTable.Clone(); DataTable _expected = TestTable.Clone(); for (Int16 i = 18; i < 28; i++) { DataRow _person = _expected.NewRow(); _person["Name"] = "YanZhiwei" + i; _person["Age"] = i; _expected.Rows.Add(_person); } DataTable _actual = CSVHelper.ImportToTable(_personInfoView, @"C:\Users\YanZh_000\Downloads\person.csv", 2); Assert.IsTrue(ResultSetComparer.AreIdenticalResultSets(_expected, _actual)); } [TestCleanup] public void ResetTable() { TestTable = null; } } }
using System.Data; using System.IO; namespace DotNet.Utilities { /// <summary> /// CSV文件转换类 /// </summary> public static class CsvHelper { /// <summary> /// 导出报表为Csv /// </summary> /// <param name="dt">DataTable</param> /// <param name="strFilePath">物理路径</param> /// <param name="tableheader">表头</param> /// <param name="columname">字段标题,逗号分隔</param> public static bool dt2csv(DataTable dt, string strFilePath, string tableheader, string columname) { try { string strBufferLine = ""; StreamWriter strmWriterObj = new StreamWriter(strFilePath, false, System.Text.Encoding.UTF8); strmWriterObj.WriteLine(tableheader); strmWriterObj.WriteLine(columname); for (int i = 0; i < dt.Rows.Count; i++) { strBufferLine = ""; for (int j = 0; j < dt.Columns.Count; j++) { if (j > 0) strBufferLine += ","; strBufferLine += dt.Rows[j].ToString(); } strmWriterObj.WriteLine(strBufferLine); } strmWriterObj.Close(); return true; } catch { return false; } } /// <summary> /// 将Csv读入DataTable /// </summary> /// <param name="filePath">csv文件路径</param> /// <param name="n">表示第n行是字段title,第n+1行是记录开始</param> public static DataTable csv2dt(string filePath, int n, DataTable dt) { StreamReader reader = new StreamReader(filePath, System.Text.Encoding.UTF8, false); int i = 0, m = 0; reader.Peek(); while (reader.Peek() > 0) { m = m + 1; string str = reader.ReadLine(); if (m >= n + 1) { string[] split = str.Split(','); System.Data.DataRow dr = dt.NewRow(); for (i = 0; i < split.Length; i++) { dr = split; } dt.Rows.Add(dr); } } return dt; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Text; using System.Security.Cryptography; using System.IO; using System.Data; using DEV_JIZHANG.Models; namespace DEV_JIZHANG.Common { public class CSVHelp { public char[] chSplit = new char[] { '|' }; #region public function public DataTable ImportCSVToDataTable( string RecoveryPath, ref string err) { int intColCount = 0; bool blnFlag = true; DataTable mydt = new DataTable("myTableName"); DataColumn mydc; DataRow mydr; //string strpath = "test.wxt"; string strline; string[] aryline; try { System.IO.StreamReader mysr = new System.IO.StreamReader(RecoveryPath); while ((strline = mysr.ReadLine()) != null) { aryline = strline.Split(chSplit); if (blnFlag) { blnFlag = false; intColCount = aryline.Length; for (int i = 0; i < aryline.Length; i++) { mydc = new DataColumn(aryline[i]); mydc.ColumnName = i.ToString(); mydt.Columns.Add(mydc); } } mydr = mydt.NewRow(); for (int i = 0; i < intColCount; i++) { mydr[i] = aryline[i]; } mydt.Rows.Add(mydr); } return mydt; } catch (Exception ex) { err = ex.ToString(); return null; } //dgData.DataSource =mydt; //dgData.DataBind(); } public void DataTableToCSVFile( System.Data.DataTable dt, string BackupPath, string strSplitChar, ref string err) { string row; try { //string header; string tmp; //StreamReader sr = new StreamReader(xbkPath); //header = sr.ReadLine(); //sr.Close(); FileStream fs = File.Create(BackupPath); StreamWriter sw = new StreamWriter(fs); //sw.WriteLine(header); foreach (DataRow dr in dt.Rows) { row = ""; for (int i = 0; i < dt.Columns.Count; i++) { if (i != dt.Columns.Count - 1) { tmp = dr[i].ToString().Trim().Replace(strSplitChar, ""); row = row + tmp + strSplitChar; } else { tmp = dr[i].ToString().Trim().Replace(strSplitChar, ""); row = row + tmp; } } sw.WriteLine(row); } sw.Flush(); sw.Close(); } catch (Exception ex) { err = ex.ToString(); } } //默认密钥向量 public byte[] Keys = { 0xEF, 0xAB, 0x56, 0x73, 0x90, 0x32, 0xCD, 0x12 }; /// <summary> /// DES加密字符串 /// </summary> /// <param name="encryptString">待加密的字符串</param> /// <param name="encryptKey">加密密钥,要求为8位</param> /// <returns>加密成功返回加密后的字符串,失败返回源串</returns> public string EncryptDES(string encryptString, string encryptKey) { try { byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8)); byte[] rgbIV = Keys; byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString); DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider(); MemoryStream mStream = new MemoryStream(); CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write); cStream.Write(inputByteArray, 0, inputByteArray.Length); cStream.FlushFinalBlock(); return Convert.ToBase64String(mStream.ToArray()); } catch { return encryptString; } } #endregion } }
https://github.com/JoshClose/CsvHelper