导出excel

  public class ExcelExportUtils
    {
        /// <summary>
        /// 页面导出Excel
        /// </summary>
        /// <typeparam name="T">实体类型</typeparam>
        /// <param name="fileName">导出的文件名</param>
        /// <param name="list">数据</param>
        /// <param name="expItems">导出的列</param>
        /// <param name="fileNameAddDate">文件名自动添加导出日期</param>
        public static void ExportExcel<T>(string fileName, IList<T> list, ICollection<ExcelItem> expItems, bool fileNameAddDate = true)
        {
            if (list != null && list.Count > 0)
            {
                var dt = DataSetModel.FillDataTable<T>(list);
                ExportExcel(fileName, dt, expItems, fileNameAddDate);
            }
        }

        /// <summary>
        /// 页面导出Excel
        /// </summary>
        /// <param name="fileName">导出的文件名</param>
        /// <param name="dt">dt</param>
        /// <param name="expItems">expItems</param>
        /// <param name="fileNameAddDate">文件名是否追加日期</param>
        /// <example>
        /// var dt = DataSetModel.FillDataTable(list);
        /// string fileName = "";
        /// var expItems = new List《ExportItem》();       /// expItems.Add(new ExportItem("创建时间", "CreateTime"));
        /// base.ExportExcel(fileName, dt, expItems);
        /// </example>
        public static void ExportExcel1(string fileName, DataTable dt, ICollection<ExcelItem> expItems, bool fileNameAddDate = true)
        {
            HttpContext context = System.Web.HttpContext.Current;
            bool isFireFox = context.Request.ServerVariables["http_user_agent"].ToLower().IndexOf("firefox") > -1 ? true : false;


            if (dt.Rows.Count > 0)
            {
                //导出数据
                JArray jArray = new JArray();
                JObject jItem = null;
                string column = null;
                foreach (DataRow row in dt.Rows)
                {
                    jItem = new JObject();
                    foreach (var li in expItems)
                    {
                        column = li.DataName;
                        jItem[column] = li.DataToString(row[column]);
                    }
                    jArray.Add(jItem);
                }
                var dtData = (DataTable)JsonConvert.DeserializeObject(jArray.ToString(), (typeof(DataTable)));
                if (dtData.Rows.Count > 0)
                {
                    if (fileNameAddDate == true)
                    {
                        fileName += DateTime.Now.ToString("yyyyMMddHHmmss");
                    }
                    // 设置编码和附件格式
                    context.Response.ContentType = "application/vnd.ms-excel";
                    context.Response.ContentEncoding = Encoding.UTF8;
                    context.Response.Charset = "";
                    if (isFireFox)
                    {
                        context.Response.AppendHeader("Content-Disposition",
                            "attachment;filename=" + """ + fileName + ".xls" + """);
                    }
                    else
                    {
                        context.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName, Encoding.UTF8) + ".xls");
                    }
                    context.Response.BinaryWrite(Export(dtData, expItems, "1").GetBuffer());
                    context.ApplicationInstance.CompleteRequest();
                    dtData.Dispose();
                }
            }
        }

        /// <summary>
        /// 页面导出Excel
        /// </summary>
        /// <param name="fileName">导出的文件名</param>
        /// <param name="dt">dt</param>
        /// <param name="expItems">expItems</param>
        /// <param name="fileNameAddDate">文件名是否追加日期</param>
        /// <example>
        /// var dt = DataSetModel.FillDataTable(list);
        /// string fileName = "";
        /// var expItems = new List《ExportItem》();   /// expItems.Add(new ExportItem("创建时间", "CreateTime"));
        /// base.ExportExcel(fileName, dt, expItems);
        /// </example>
        public static void ExportExcel(string fileName, DataTable dt, ICollection<ExcelItem> expItems, bool fileNameAddDate = true)
        {
            HttpContext context = System.Web.HttpContext.Current;
            bool isFireFox = context.Request.ServerVariables["http_user_agent"].ToLower().IndexOf("firefox") > -1 ? true : false;
            
            if (dt.Rows.Count > 0)
            {
                //移除不需要导出的列
                var delCol = new List<string>();
                foreach (DataColumn col in dt.Columns)
                {
                    var flag = expItems.Any(m => m.DataName.ToLower() == col.ColumnName.ToLower());
                    if (!flag) delCol.Add(col.ColumnName);
                }
                delCol.ForEach(m=>dt.Columns.Remove(m));


                if (fileNameAddDate == true)
                {
                    fileName += DateTime.Now.ToString("yyyyMMddHHmmss");
                }
                // 设置编码和附件格式
                context.Response.ContentType = "application/vnd.ms-excel";
                context.Response.ContentEncoding = Encoding.UTF8;
                context.Response.Charset = "";
                if (isFireFox)
                {
                    context.Response.AppendHeader("Content-Disposition",
                        "attachment;filename=" + """ + fileName + ".xls" + """);
                }
                else
                {
                    context.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName, Encoding.UTF8) + ".xls");
                }
                context.Response.BinaryWrite(Export(dt, expItems, "1").GetBuffer());
                context.ApplicationInstance.CompleteRequest();
                dt.Clear();
            }
        }

        /// <summary>
        /// DataTable导出到Excel的MemoryStream
        /// </summary>
        /// <param name="dtSource">源DataTable</param>
        /// <param name="expItems">表头文本</param>
        /// <param name="sheetName">工作薄名称</param>
        ///  <returns>返回</returns>
        private static MemoryStream Export(DataTable dtSource, ICollection<ExcelItem> expItems, string sheetName)
        {
            //设置导出列名
            StringBuilder headers = new StringBuilder();
            foreach (var col in expItems)
            {
                headers.Append(col.Title);
                headers.Append(",");
            }
            headers.Remove(headers.Length - 1, 1);
            

                #region 设置excel属性
                HSSFWorkbook workbook = new HSSFWorkbook();
            //设置工作薄名称
            ISheet sheet = workbook.CreateSheet(sheetName);
            sheet.TabColorIndex = HSSFColor.Red.Index;

            //右击文件 属性信息
            DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
            dsi.Company = "责任公司";
            dsi.Category = "业务导出";//类别
            workbook.DocumentSummaryInformation = dsi;
            SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
            si.Author = "支持部"; //填加xls文件作者信息
            si.ApplicationName = "平台"; //填加xls文件创建程序信息
            si.LastAuthor = "支持部"; //填加xls文件最后保存者信息
            si.Comments = ""; //填加xls文件作者信息
            si.Title = headers.ToString(); //填加xls文件标题信息
            si.Subject = "导出";//填加文件主题信息
            si.CreateDateTime = DateTime.Now;
            workbook.SummaryInformation = si;

            #endregion

            //时间格式化格式
            HSSFCellStyle dateStyle = workbook.CreateCellStyle() as HSSFCellStyle;
            HSSFDataFormat format = workbook.CreateDataFormat() as HSSFDataFormat;
            dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd HH:mm:ss");
            //取得列宽
            int[] arrColWidth = new int[expItems.Count];
            for (int i = 0; i < dtSource.Rows.Count; i++)
            {
                int j = 0;
                foreach (var item in expItems)
                {
                    int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][item.DataName].ToString()).Length;
                    if (intTemp > arrColWidth[j])
                        arrColWidth[j] = intTemp;
                    if (arrColWidth[j] < 7) arrColWidth[j] = 7;
                    j++;
                }
            }



            int rowIndex = 0;
            foreach (DataRow row in dtSource.Rows)
            {
                #region 新建表,填充表头,填充列头,样式
                if (rowIndex == 65535 || rowIndex == 0)
                {
                    if (rowIndex != 0)
                    {
                        sheet = workbook.CreateSheet() as HSSFSheet;
                    }
                    //列头及样式
                    //修改把列头提到第一行
                    //HSSFRow headerRow = sheet.CreateRow(1) as HSSFRow;
                    HSSFRow headerRow = sheet.CreateRow(0) as HSSFRow;
                    HSSFCellStyle headStyle = workbook.CreateCellStyle() as HSSFCellStyle;
                    headStyle.Alignment = HorizontalAlignment.Center;
                    HSSFFont font = workbook.CreateFont() as HSSFFont;
                    font.FontHeightInPoints = 10;
                    font.Boldweight = 700;
                    headStyle.IsLocked = true;
                    headStyle.SetFont(font);
                    //设置每列的文字
                    int i = 0;
                    foreach (var item in expItems)
                    {
                        //headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);                           
                        headerRow.CreateCell(i).SetCellValue(item.Title);
                        headerRow.GetCell(i).CellStyle = headStyle;
                        //设置列宽
                        sheet.SetColumnWidth(i, (arrColWidth[i] + 1) * 256);
                    
                        i++;
                    }
                    //让列头不动
                    //sheet.CreateFreezePane(0, 2, 0, dtSource.Columns.Count - 1);
                    sheet.CreateFreezePane(0, 1, 0, 1);
     
                    //把内容提到第二行
                    // rowIndex = 2;
                    rowIndex = 1;
                }

                #endregion


                //填充内容
                HSSFRow dataRow = sheet.CreateRow(rowIndex) as HSSFRow;
                var j = 0;
                foreach (var item in expItems)
                {
                    HSSFCell newCell = dataRow.CreateCell(j) as HSSFCell;
                    string drValue;
                    Type type;
                    if (item.HasConverter)
                    {
                        drValue = item.Converter(row[item.DataName]);
                        type = typeof(string);
                    }
                    else
                    {
                        drValue = row[item.DataName].ToString();
                        type = dtSource.Columns[item.DataName].DataType;
                    }
                    switch (type.ToString())
                    {
                        case "System.String"://字符串类型
                            newCell.SetCellValue(drValue);
                            break;
                        case "System.DateTime"://日期类型
                            DateTime dateV;
                            if(DateTime.TryParse(drValue, out dateV))
                                newCell.SetCellValue(dateV);

                            newCell.CellStyle = dateStyle;//格式化显示
                            break;
                        case "System.Boolean"://布尔型
                            bool boolV = false;
                            bool.TryParse(drValue, out boolV);
                            newCell.SetCellValue(boolV);
                            break;
                        case "System.Int16"://整型
                        case "System.Int32":
                        case "System.Int64":
                        case "System.Byte":
                            int intV = 0;
                            int.TryParse(drValue, out intV);
                            newCell.SetCellValue(intV);
                            break;
                        case "System.Decimal"://浮点型
                        case "System.Double":
                            double doubV = 0;
                            double.TryParse(drValue, out doubV);
                            newCell.SetCellValue(doubV);
                            break;
                        case "System.DBNull"://空值处理
                            newCell.SetCellValue("");
                            break;
                        default:
                            newCell.SetCellValue("");
                            break;
                    }
                    j++;
                }
                rowIndex++;
            }

            using (MemoryStream ms = new MemoryStream())
            {
                workbook.Write(ms);
                ms.Flush();
                ms.Position = 0;
                return ms;
            }
        }

    }
原文地址:https://www.cnblogs.com/nayilvyangguang/p/12739365.html