直接上代碼
首先定義一個接口

1 public interface ITransferData 2 { 3 Stream GetStream(DataTable table); 4 DataTable GetData(Stream stream); 5 }
如果需要直接操作文件的話,就自己在封裝一次
然后定義csv類的具體實現

public class CsvTransferData : ITransferData { private Encoding _encode; public CsvTransferData() { this ._encode = Encoding.GetEncoding( " utf-8 " ); } public Stream GetStream(DataTable table) { StringBuilder sb = new StringBuilder(); if (table != null && table.Columns.Count > 0 && table.Rows.Count > 0 ) { foreach (DataRow item in table.Rows) { for ( int i = 0 ; i < table.Columns.Count; i++ ) { if (i > 0 ) { sb.Append( " , " ); } if (item[i] != null ) { sb.Append( " \" " ).Append(item[i].ToString().Replace( " \" " , " \"\" " )).Append( " \" " ); } } sb.Append( " \n " ); } } MemoryStream stream = new MemoryStream(_encode.GetBytes(sb.ToString())); return stream; } public DataTable GetData(Stream stream) { using (stream) { using (StreamReader input = new StreamReader(stream, _encode)) { using (CsvReader csv = new CsvReader(input, false )) { DataTable dt = new DataTable(); int columnCount = csv.FieldCount; for ( int i = 0 ; i < columnCount; i++ ) { dt.Columns.Add( " col " + i.ToString()); } while (csv.ReadNextRecord()) { DataRow dr = dt.NewRow(); for ( int i = 0 ; i < columnCount; i++ ) { if (! string .IsNullOrWhiteSpace(csv[i])) { dr[i] = csv[i]; } } dt.Rows.Add(dr); } return dt; } } } } }
這個需要引入命名空間LumenWorks.Framework.IO.Csv;
可以Nuget里面下
接著定義excel的實現類的基類

public abstract class ExcelTransferData : ITransferData { protected IWorkbook _workBook; public virtual Stream GetStream(DataTable table) { var sheet = _workBook.CreateSheet(); if (table != null ) { var rowCount = table.Rows.Count; for ( int i = 0 ; i < table.Rows.Count; i++ ) { var row = sheet.CreateRow(i); for ( int j = 0 ; j < table.Columns.Count; j++ ) { var cell = row.CreateCell(j); if (table.Rows[i][j] != null ) { cell.SetCellValue(table.Rows[i][j].ToString()); } } } } MemoryStream ms = new MemoryStream(); _workBook.Write(ms); return ms; } public virtual DataTable GetData(Stream stream) { using (stream) { var sheet = _workBook.GetSheetAt( 0 ); if (sheet != null ) { var headerRow = sheet.GetRow( 0 ); DataTable dt = new DataTable(); int columnCount = headerRow.Cells.Count; for ( int i = 0 ; i < columnCount; i++ ) { dt.Columns.Add( " col_ " + i.ToString()); } var row = sheet.GetRowEnumerator(); while (row.MoveNext()) { var dtRow = dt.NewRow(); var excelRow = row.Current as IRow; for ( int i = 0 ; i < columnCount; i++ ) { var cell = excelRow.GetCell(i); if (cell != null ) { dtRow[i] = GetValue(cell); } } dt.Rows.Add(dtRow); } return dt; } } return null ; } private object GetValue(ICell cell) { object value = null ; switch (cell.CellType) { case CellType.BLANK: break ; case CellType.BOOLEAN: value = cell.BooleanCellValue ? " 1 " : " 0 " ; break ; case CellType.ERROR: value = cell.ErrorCellValue; break ; case CellType.FORMULA: value = " = " + cell.CellFormula; break ; case CellType.NUMERIC: value = cell.NumericCellValue.ToString(); break ; case CellType.STRING: value = cell.StringCellValue; break ; case CellType.Unknown: break ; } return value; } }
這個需要下載NPOI 2.01版本?
下載地址 http://npoi.codeplex.com/releases/view/92382
接著實現2003版本

public class XlsTransferData : ExcelTransferData { public override Stream GetStream(DataTable table) { base ._workBook = new HSSFWorkbook(); return base .GetStream(table); } public override DataTable GetData(Stream stream) { base ._workBook = new HSSFWorkbook(stream); return base .GetData(stream); } }
接著實現2007版本

public class XlsxTransferData : ExcelTransferData { public override Stream GetStream(DataTable table) { base ._workBook = new XSSFWorkbook(); return base .GetStream(table); } public override DataTable GetData(Stream stream) { base ._workBook = new XSSFWorkbook(stream); return base .GetData(stream); } }
然后定義一個枚舉實現一個簡單的工廠

public enum DataFileType { CSV, XLS, XLSX } public class TransferDataFactory { public static ITransferData GetUtil( string fileName) { var array = fileName.Split( ' . ' ); var dataType = (DataFileType)Enum.Parse( typeof (DataFileType), array[array.Length - 1 ], true ); return GetUtil(dataType); } public static ITransferData GetUtil(DataFileType dataType) { switch (dataType) { case DataFileType.CSV: return new CsvTransferData(); case DataFileType.XLS: return new XlsTransferData(); case DataFileType.XLSX: return new XlsxTransferData(); default : return new CsvTransferData(); } } }
客戶端調用代碼

class Program { static void Main( string [] args) { var fileName = @" C:/Users/ranrx/Desktop/data.xlsx " ; FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read); var util = TransferDataFactory.GetUtil(fileName); var data = util.GetData(stream); var mStream = util.GetStream(data); } }
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
