用NPOI实现导入导出csv、xls、xlsx数据功能
直接上代码
首先定义一个接口
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); } }