C#数据导出帮助类

一、创建ExportFieldAttribute特性标识Dto中要导出的属性字段,并指定导出字段顺序

    /// <summary>
    /// 导出字段标识
    /// </summary>
    [AttributeUsage(AttributeTargets.Property)]
    public class ExportFieldAttribute : System.Attribute
    {
        /// <summary>
        /// 导出字段顺序
        /// </summary>
        public int Sort { get; set; }

        /// <summary>
        /// 导出字段名称
        /// </summary>
        public string Name { get; set; }

    }

     例如:

   

 

 

二、Excel文件生成帮助类,注意需引用NPOI

public class ExportExcelHelper
    {
        /// <summary>
        /// 返回生成Excel文件byte流
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static byte[] GenExcelFileStream<T>(List<T> dataList) where T : class
        {
            var workbook = GenExcelWorkbook(dataList);
            var filePath = AppDomain.CurrentDomain.BaseDirectory + Guid.NewGuid() + ".xlsx";
            FileStream stream = new FileStream(filePath, FileMode.CreateNew, FileAccess.ReadWrite);
            workbook.Write(stream);
            workbook.Close();
            stream.Close();

            FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
            var bytes=new byte[fileStream.Length];
            fileStream.Read(bytes, 0, bytes.Length);

            fileStream.Close();
            File.Delete(filePath);

            return bytes;

        }

        /// <summary>
        /// 返回生成Excel文件地址
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dataList"></param>
        /// <returns></returns>
        public static string GenExcelFile<T>(List<T> dataList) where T : class
        {
            var workbook = GenExcelWorkbook(dataList);
            var filePath = AppDomain.CurrentDomain.BaseDirectory + "FileUpload/" + DateTime.Now.ToString("yyyy-MM-dd") +
                           "/";
            if (!Directory.Exists(filePath))
            {
                Directory.CreateDirectory(filePath);
            }
            var guid = Guid.NewGuid();
            var fileName = filePath + guid + ".xlsx";
            FileStream stream = new FileStream(fileName, FileMode.CreateNew);
            workbook.Write(stream);
            workbook.Close();
            stream.Close();
            return fileName;
        }

        /// <summary>
        /// 生成Workbook
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dataList"></param>
        /// <returns></returns>
        private static HSSFWorkbook GenExcelWorkbook<T>(List<T> dataList)
        {
            var type = typeof(T);
            var props = type.GetProperties()
                .Where(t => t.GetCustomAttributes(typeof(ExportFieldAttribute)).Any())
                .ToArray();
            if (!props.Any())
            {
                throw new Exception("导出失败,导出模板中未标记要导出的数据列!");
            }
            var headerList = new List<ExportHeader>();
            foreach (var propertyInfo in props)
            {
                var exportAtt = (ExportFieldAttribute)propertyInfo.GetCustomAttributes(typeof(ExportFieldAttribute)).First();
                ExportHeader header = new ExportHeader()
                {
                    PropertyName = propertyInfo.Name,
                    HeaderName = exportAtt.Name,
                    Sort = exportAtt.Sort
                };
                headerList.Add(header);
            }

            headerList = headerList.OrderBy(t => t.Sort).ToList();

            HSSFWorkbook workbook = new HSSFWorkbook();
            var sheet = workbook.CreateSheet();

            //创建表头
            var rowIndex = 0;
            var sheetHeadRow = sheet.CreateRow(rowIndex);
            for (int i = 0; i < headerList.Count; i++)
            {
                var cell = sheetHeadRow.CreateCell(i);
                cell.SetCellValue(headerList[i].HeaderName);
            }
            rowIndex++;

            //写入数据
            foreach (var dataItem in dataList)
            {
                var dataProps = typeof(T).GetProperties();

                var sheetRow = sheet.CreateRow(rowIndex);
                for (int i = 0; i < headerList.Count; i++)
                {
                    var cell = sheetRow.CreateCell(i);
                    var value = dataProps.First(t => t.Name == headerList[i].PropertyName).GetValue(dataItem)?.ToString();
                    cell.SetCellValue(value);
                }

                rowIndex++;
            }
            return workbook;
        }

        private class ExportHeader
        {
            /// <summary>
            /// 导出字段属性名称
            /// </summary>
            public string PropertyName { get; set; }

            /// <summary>
            /// 导出字段标题名称
            /// </summary>
            public string HeaderName { get; set; }

            /// <summary>
            /// 导出字段显示顺序
            /// </summary>
            public int Sort { get; set; }
        }
    }

 

posted @ 2020-06-12 10:45  潇潇与偕  阅读(437)  评论(0编辑  收藏  举报