MVC NPOI Linq导出Excel通用类

之前写了一个模型导出Excel通用类,但是在实际应用中,可能不是直接导出模型,而是通过Linq查询后获取到最终结果再导出

通用类:

public enum DataTypeEnum
    {
        Int = 0,
        Float = 1,
        Double = 2,
        String = 3,
        DateTime = 4,
        Date = 5
    }
    public class ExportFieldInfo
    {
        /// <summary>
        /// 字段名,用于反射获取值
        /// </summary>
        public string FieldName { get; set; }
        /// <summary>
        /// 中文名,用于导出标题
        /// </summary>
        public string DisplayName { get; set; }
        /// <summary>
        /// 数据类型,用于强制转换,并进行格式化,其实利用反射也可以获取到数据类型,此处因为要处理Date和Date的显示格式
        /// </summary>
        public DataTypeEnum DataType { get; set; }
    }
    public class ExcelHelper
    {
        /// <summary>
        /// 导出到内存流
        /// </summary>
        /// <param name="data">需要导出的模型列表</param>
        /// <param name="fieldInfo">导出的字段列表信息</param>
        /// <param name="sheetRows">每个工作表的行数</param>
        /// <returns></returns>
        public static MemoryStream ToExcel(List<object> data, List<ExportFieldInfo> fieldInfo, int sheetRows = 65536)
        {
            //创建Excel文件的对象
            NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();
            //需要生成工作溥总簿
            int sheetCount = data.Count / sheetRows + 1;
            int rowCount = data.Count;
            for (int i = 0; i < sheetCount; i++)
            {
                //添加一个sheet
                NPOI.SS.UserModel.ISheet sheet = book.CreateSheet("Sheet" + Convert.ToString(i));
                //给sheet添加第一行的头部标题
                NPOI.SS.UserModel.IRow rowTitle = sheet.CreateRow(0);
                for (int k = 0; k < fieldInfo.Count; k++)
                {
                    rowTitle.CreateCell(k).SetCellValue(fieldInfo.ElementAt(k).DisplayName);
                }
                //处理Excel一张工作簿只能放65536行记录的问题
                //因为头部占一行,所以要减1
                for (int j = 0; j < sheetRows - 1; j++)
                {
                    //将数据逐步写入sheet各个行
                    NPOI.SS.UserModel.IRow rowtemp = sheet.CreateRow(j + 1);
                    int dataIndex = i * (sheetRows - 1) + j;
                    for (int k = 0; k < fieldInfo.Count; k++)
                    {
                        //获取类型
                        Type type = data[dataIndex].GetType();
                        //获取指定名称的属性
                        System.Reflection.PropertyInfo propertyInfo = type.GetProperty(fieldInfo.ElementAt(k).FieldName);
                        //获取属性值
                        var value = propertyInfo.GetValue(data[dataIndex], null);
                        switch (fieldInfo.ElementAt(k).DataType)
                        {
                            case DataTypeEnum.Int:
                                rowtemp.CreateCell(k).SetCellValue(Convert.ToInt32(value));
                                break;
                            case DataTypeEnum.Float:
                                rowtemp.CreateCell(k).SetCellValue(Convert.ToDouble(value));
                                break;
                            case DataTypeEnum.Double:
                                rowtemp.CreateCell(k).SetCellValue(Convert.ToDouble(value));
                                break;
                            case DataTypeEnum.String:
                                rowtemp.CreateCell(k).SetCellValue(Convert.ToString(value));
                                break;
                            case DataTypeEnum.DateTime:
                                rowtemp.CreateCell(k).SetCellValue(Convert.ToDateTime(value).ToString("yyyy-MM-dd HH:mm:ss.SSS"));
                                break;
                            case DataTypeEnum.Date:
                                rowtemp.CreateCell(k).SetCellValue(Convert.ToDateTime(value).ToString("yyyy-MM-dd"));
                                break;
                            default:
                                break;
                        }
                    }
                    //所有记录循环完成
                    if (i * (sheetRows - 1) + (j + 1) == rowCount)
                    {
                        // 写入到客户端
                        System.IO.MemoryStream ms = new System.IO.MemoryStream();
                        book.Write(ms);
                        ms.Seek(0, SeekOrigin.Begin);
                        return ms;
                    }
                }

            }
            return null;
        }
    }

调用:

/// <summary>
        /// 导出Excel
        /// </summary>
        /// <param name="request">请求参数集合</param>
        /// <returns></returns>
        public FileResult ToExcel(ActiveRecordRequest request)
        {
            //获取记录信息
            Response<object> listInfo = this.CrmService.GetActiveRecordList(request);
            //初始化需要导出字段
            List<ExportFieldInfo> fieldInfo = new List<ExportFieldInfo>();
            fieldInfo.Add(new ExportFieldInfo()
            {
                FieldName = "ActiveDate",
                DisplayName = "活动日期",
                DataType = DataTypeEnum.Date
            });
            fieldInfo.Add(new ExportFieldInfo()
            {
                FieldName = "ActiveSubject",
                DisplayName = "活动主题",
                DataType = DataTypeEnum.String
            });
            fieldInfo.Add(new ExportFieldInfo()
            {
                FieldName = "Remark",
                DisplayName = "备注",
                DataType = DataTypeEnum.String
            });
            return File(ExcelHelper.ToExcel(listInfo.Data, fieldInfo), "application/vnd.ms-excel", "活动信息表.xls");
        }

js调用:

//导出到Excel
    ToExcel: function () {
        location.href = "/" + PageParam.Area + "/" + PageParam.AjaxController + "/ToExcel?IsPaging=false";
    }
时间: 2024-12-14 02:25:19

MVC NPOI Linq导出Excel通用类的相关文章

MVC AJAX导出Excel通用类

通用类: public enum DataTypeEnum { Int = 0, Float = 1, Double = 2, String = 3, DateTime = 4, Date = 5 } public class ExportFieldInfo { /// <summary> /// 字段名,用于反射获取值 /// </summary> public string FieldName { get; set; } /// <summary> /// 中文名,

poi导出excel通用类

一.关键的通用类public class PoiExportUtils {    private static HSSFWorkbook workBook; public PoiExportUtils(){        workBook = new HSSFWorkbook();    }        /**     * 创建sheet     * @param sheetName     * @param workBook     * @return     */    public st

NPOI导入导出Excel

.net mvc利用NPOI导入导出excel 1.导出Excel :首先引用NPOI包,从这里下载>download(Action一定要用FileResult) /// <summary> /// 批量导出需要导出的列表 /// </summary> /// <returns></returns> public FileResult ExportStu2() { //获取list数据 var checkList = (from oc in db.Or

javaEE开发之导出excel工具类

web开发中,一个系统的普通需求也包含导出excel,一般採用POI做统计报表导出excel. 导出excel工具类: import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.List; import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFCell; import o

Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类

Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类 ============================== ?Copyright 蕃薯耀 2017年9月13日 http://www.cnblogs.com/fanshuyao/ 直接上代码: import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.ref

导出Excel帮助类

using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.OleDb; using System.Web; using System.Web.UI; namespace AIMSCommon { /// <summary> /// 导出Excel帮助类 /// </summary> public class ExcelHelper {

NPOI DataGridView导出EXCEL

NPOI 官方网站 http://npoi.codeplex.com/ 加载NPOI.DLL ,引用这两个命名空间 using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; #region NPOI DataGridView 导出 EXCEL /// <summary> /// NPOI DataGridView 导出 EXCEL /// </summary> /// <param name="fileName"

web开发之导出excel工具类

web开发中,一个系统的普通需求也包括导出excel,一般采用POI做统计报表导出excel. 导出excel工具类: import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.List; import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFCell; import o

Excel通用类工具(二)

前言 上一篇中写到了用反射来处理类中的不用的属性,但是Excel的列名还得手动输入,这样还是比较麻烦的,今天这篇就利用自定义注解来解决手动传入列名的问题:其实很简单的,只需要在上一篇的基础上加一个类就可以了: 本篇所涉及的项目是在上一篇 Excel通用类工具(一) 的项目代码上进行的二次添加: 正文 新添加一个类 新添加一个注解类 ExcelName ,完整代码如下: import java.lang.annotation.ElementType; import java.lang.annota