最近作一個C#項目要導入CSV文件中的數據到Oracle中,使用Aspose.Cells讀取中文字段標題卻亂碼,表的最後多出幾行null記錄,並且不是免費的,後來找到了NPOI,顧名思義,就是POI的.NET版本,POI是一套用Java寫成的庫,可以幫助開發者在沒有安裝微軟Office的狀況下讀寫Office 97-2003的文件,支持的文件格式包括xls, doc,
ppt等。並且是免費的,學了半天,得出一個結論,殺雞用牛刀。最後決定自已寫一個讀取及寫入CSV文件的代碼,效果很是好。現分享受應趣的朋友門。ide
using System; using System.Data; using System.IO; namespace DBUtility { public static class CsvHelper { /// <summary> /// 寫入CSV文件 /// </summary> /// <param name="dt">DataTable</param> /// <param name="fileName">文件全名</param> /// <returns>是否寫入成功</returns> public static Boolean SaveCSV(DataTable dt, string fullFileName) { Boolean 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; } /// <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; } } }