zoukankan      html  css  js  c++  java
  • 导出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;
                }
            }
    
        }
  • 相关阅读:
    c++中的 三/五原则
    3. 无重复字符的最长子串
    c++中的单例模式
    bfs 以及 dfs 常用解题思路
    经济学的三个问题
    gtihub 上一些值得学习的项目
    994. 腐烂的橘子
    96. 不同的二叉搜索树
    some idea
    Libco协程库
  • 原文地址:https://www.cnblogs.com/nayilvyangguang/p/12739365.html
Copyright © 2011-2022 走看看