zoukankan      html  css  js  c++  java
  • 用NPOI实现导入导出csv、xls、xlsx数据功能

    直接上代码

    首先定义一个接口

    1 public interface ITransferData
    2     {
    3         Stream GetStream(DataTable table);
    4         DataTable GetData(Stream stream);
    5     }
    View Code

    如果需要直接操作文件的话,就自己在封装一次

    然后定义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("
    ");
                    }
                }
                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;
                        }
    
                    }
                }
            }
        }
    View Code

    这个需要引入命名空间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;
            }
    
        }
    View Code

    这个需要下载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);
            }
        }
    View Code

    接着实现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);
            }
        }
    View Code

    然后定义一个枚举实现一个简单的工厂

    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();
                }
            }
    
        }
    View Code

    客户端调用代码

    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);         
    
            }
        }
    View Code
  • 相关阅读:
    Servlet18—— 路径编写总结
    Servlet17—— Cookie
    Servlet16—— 资源跳转
    Servlet15—— 线程安全问题
    Servlet14—— 程序中乱码解决方案
    Servlet13—— ServletRequest
    Servlet12—— GenericServlet
    CF1467B Hills And Valleys
    CF1470B Strange Definition
    【BZOJ1082】【SCOI2005】栅栏
  • 原文地址:https://www.cnblogs.com/qisheng/p/3441902.html
Copyright © 2011-2022 走看看