• NPOI帮助类


    /// <summary>
        /// NPOI导出帮助类
        /// </summary>
        public class NPOIHelper
        {
            /// <summary>
            /// DataTable导出到Excel的MemoryStream
            /// </summary>
            /// <param name="dt">源DataTable</param>
            /// <param name="dicTableHeader">表头文本</param>
            private static MemoryStream Export(DataTable dt, Dictionary<string, string> dicTableHeader)
            {
                HSSFWorkbook workbook = new HSSFWorkbook();
                ISheet sheet = workbook.CreateSheet("工作表1");
    
                IRow headerRow = sheet.CreateRow(0);
                int headerIndex = 0;
    
                ICellStyle headerCellStyle = Getcellstyle(workbook, stylexls.头);
                ICellStyle dateCellStyle = Getcellstyle(workbook, stylexls.时间);
    
                foreach (var item in dicTableHeader)
                {
                    ICell cell = headerRow.CreateCell(headerIndex);
                    cell.CellStyle = headerCellStyle;
                    cell.SetCellValue(item.Value);
                    headerIndex = headerIndex + 1;
                }
                sheet.CreateFreezePane(0, 1, 0, 1);
    
                int rowCount = dt.Rows.Count;
                for (int i = 0; i < rowCount; i++)
                {
                    IRow row = sheet.CreateRow(i + 1);
                    int rowIndex = 0;
                    foreach (var item in dicTableHeader)
                    {
                        ICell newCell = row.CreateCell(rowIndex);
                        rowIndex = rowIndex + 1;
                        DataColumn dc = dt.Columns[item.Key];
                        string drValue = dt.Rows[i][item.Key].ToString();
                        switch (dc.DataType.ToString())
                        {
                            case "System.String"://字符串类型
                                newCell.SetCellValue(drValue);
                                break;
                            case "System.DateTime"://日期类型
                                DateTime dateV;
                                DateTime.TryParse(drValue, out dateV);
                                newCell.SetCellValue(dateV);
    
                                newCell.CellStyle = dateCellStyle;//格式化显示
                                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;
                        }
                    }
                }
                ////自动列宽
                //for (int i = 0; i <= dicTableHeader.Count; i++)
                //    sheet.AutoSizeColumn(i, true);
    
                using (MemoryStream ms = new MemoryStream())
                {
                    workbook.Write(ms);
                    ms.Flush();
                    ms.Position = 0;
                    return ms;
                }
            }
    
            /// <summary>
            /// DataTable导出到Excel的MemoryStream
            /// </summary>
            /// <param name="dt">数据源DataTable</param>
            /// <param name="heardList">头部列表</param>
            /// <returns></returns>
            private static MemoryStream Export(DataTable dt, IList<SYS_DICT> heardList)
            {
                HSSFWorkbook workbook = new HSSFWorkbook();
                ISheet sheet = workbook.CreateSheet("工作表1");
    
                ICellStyle headerCellStyle = Getcellstyle(workbook, stylexls.头);
                ICellStyle dateCellStyle = Getcellstyle(workbook, stylexls.时间);
    
                IRow headerRow = sheet.CreateRow(0);
                int headerIndex = 0;
                foreach (var item in heardList)
                {
                    ICell cell = headerRow.CreateCell(headerIndex);
                    cell.CellStyle = headerCellStyle;
                    cell.SetCellValue(item.fname_ch);
                    headerIndex = headerIndex + 1;
                }
                sheet.CreateFreezePane(0, 1, 0, 1);
    
                int rowCount = dt.Rows.Count;
                for (int i = 0; i < rowCount; i++)
                {
                    IRow row = sheet.CreateRow(i + 1);
                    int rowIndex = 0;
                    foreach (var item in heardList)
                    {
                        ICell newCell = row.CreateCell(rowIndex);
                        rowIndex = rowIndex + 1;
                        DataColumn dc = dt.Columns[item.field_name];
                        string drValue = dt.Rows[i][item.field_name].ToString();
                        switch (dc.DataType.ToString())
                        {
                            case "System.String"://字符串类型
                                newCell.SetCellValue(drValue);
                                break;
                            case "System.DateTime"://日期类型
                                DateTime dateV;
                                DateTime.TryParse(drValue, out dateV);
                                newCell.SetCellValue(dateV);
    
                                newCell.CellStyle = dateCellStyle;//格式化显示
                                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;
                        }
                    }
                }
                ////自动列宽
                //for (int i = 0; i <= dicTableHeader.Count; i++)
                //    sheet.AutoSizeColumn(i, true);
    
                int heardListLen = heardList.Count;
                for (int i = 0; i < heardListLen; i++)
                {
                    int width = 0;
                    int.TryParse(heardList[i].ExcelColWidth.ToString(), out width);
                    width = (int)((width + 0.72) * 256);
                    sheet.SetColumnWidth(i, width);
                }
    
                using (MemoryStream ms = new MemoryStream())
                {
                    workbook.Write(ms);
                    ms.Flush();
                    ms.Position = 0;
                    return ms;
                }
            }
    
            /// <summary>
            /// 用于Web导出
            /// </summary>
            /// <param name="dt">数据源DataTable</param>
            /// <param name="strFileName">文件名</param>
            /// <param name="dicTableHeader">导出对照</param>
            public static void ExportByWeb(DataTable dt, string strFileName, Dictionary<string, string> dicTableHeader)
            {
                HttpContext curContext = HttpContext.Current;
    
                // 设置编码和附件格式
                curContext.Response.ContentType = "application/vnd.ms-excel";
                curContext.Response.ContentEncoding = Encoding.UTF8;
                curContext.Response.Charset = "";
                strFileName = strFileName + DateTime.Now.ToString("yyyyMMddHHmmss");
                string fileName = HttpUtility.UrlEncode(strFileName, Encoding.UTF8) + ".xls";
                curContext.Response.AppendHeader("Content-Disposition",
                    "attachment;filename=" + fileName);
    
                curContext.Response.BinaryWrite(Export(dt, dicTableHeader).GetBuffer());
                curContext.Response.End();
            }
    
            /// <summary>
            /// Web Excel导出 
            /// </summary>
            /// <param name="dt">数据源DataTable</param>
            /// <param name="strFileName">文件名</param>
            /// <param name="heardList">头部列表</param>
            public static void ExportByWeb(DataTable dt, string strFileName, IList<SYS_DICT> heardList)
            {
                HttpContext curContext = HttpContext.Current;
    
                // 设置编码和附件格式
                curContext.Response.ContentType = "application/vnd.ms-excel";
                curContext.Response.ContentEncoding = Encoding.UTF8;
                curContext.Response.Charset = "";
                strFileName = strFileName + DateTime.Now.ToString("yyyyMMddHHmmss");
                string fileName = HttpUtility.UrlEncode(strFileName, Encoding.UTF8) + ".xls";
                curContext.Response.AppendHeader("Content-Disposition",
                    "attachment;filename=" + fileName);
    
                curContext.Response.BinaryWrite(Export(dt, heardList).GetBuffer());
                curContext.Response.End();
            }
    
            #region 定义单元格常用到样式的枚举
            public enum stylexls
            {
                头,
                url,
                时间,
                数字,
                钱,
                百分比,
                中文大写,
                科学计数法,
                默认
            }
            #endregion
    
    
            #region 定义单元格常用到样式
            private static ICellStyle Getcellstyle(IWorkbook wb, stylexls str)
            {
                ICellStyle cellStyle = wb.CreateCellStyle();
    
                //定义几种字体  
                //也可以一种字体,写一些公共属性,然后在下面需要时加特殊的  
                IFont font12 = wb.CreateFont();
                font12.FontHeightInPoints = 10;
                font12.FontName = "微软雅黑";
    
                IFont headerFont = wb.CreateFont();
                headerFont.FontHeightInPoints = 10;
                headerFont.IsBold = true;
                headerFont.FontName = "微软雅黑";
    
                IFont font = wb.CreateFont();
                font.FontName = "微软雅黑";
                //font.Underline = 1;下划线  
    
    
                IFont fontcolorblue = wb.CreateFont();
                fontcolorblue.Color = HSSFColor.OliveGreen.Blue.Index;
                fontcolorblue.IsItalic = true;//下划线  
                fontcolorblue.FontName = "微软雅黑";
    
    
                //边框  
                cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Dotted;
                cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Hair;
                cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Hair;
                cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Dotted;
                //边框颜色  
                cellStyle.BottomBorderColor = HSSFColor.OliveGreen.Blue.Index;
                cellStyle.TopBorderColor = HSSFColor.OliveGreen.Blue.Index;
    
                //背景图形,我没有用到过。感觉很丑  
                //cellStyle.FillBackgroundColor = HSSFColor.OLIVE_GREEN.BLUE.index;  
                //cellStyle.FillForegroundColor = HSSFColor.OLIVE_GREEN.BLUE.index;  
                cellStyle.FillForegroundColor = HSSFColor.White.Index;
                // cellStyle.FillPattern = FillPatternType.NO_FILL;  
                cellStyle.FillBackgroundColor = HSSFColor.Blue.Index;
    
                //水平对齐  
                cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;
    
                //垂直对齐  
                cellStyle.VerticalAlignment = VerticalAlignment.Center;
    
                //自动换行  
                cellStyle.WrapText = true;
    
                //缩进;当设置为1时,前面留的空白太大了。希旺官网改进。或者是我设置的不对  
                cellStyle.Indention = 0;
    
                //上面基本都是设共公的设置  
                //下面列出了常用的字段类型  
                switch (str)
                {
                    case stylexls.头:
                        cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
                        // cellStyle.FillPattern = FillPatternType.LEAST_DOTS;  
                        cellStyle.SetFont(headerFont);
                        break;
                    case stylexls.时间:
                        IDataFormat datastyle = wb.CreateDataFormat();
    
                        cellStyle.DataFormat = datastyle.GetFormat("yyyy-MM-dd HH:mm:ss");
                        cellStyle.SetFont(font);
                        break;
                    case stylexls.数字:
                        cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00");
                        cellStyle.SetFont(font);
                        break;
                    case stylexls.钱:
                        IDataFormat format = wb.CreateDataFormat();
                        cellStyle.DataFormat = format.GetFormat("¥#,##0");
                        cellStyle.SetFont(font);
                        break;
                    case stylexls.url:
                        fontcolorblue.Underline = FontUnderlineType.Single;
                        cellStyle.SetFont(fontcolorblue);
                        break;
                    case stylexls.百分比:
                        cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00%");
                        cellStyle.SetFont(font);
                        break;
                    case stylexls.中文大写:
                        IDataFormat format1 = wb.CreateDataFormat();
                        cellStyle.DataFormat = format1.GetFormat("[DbNum2][$-804]0");
                        cellStyle.SetFont(font);
                        break;
                    case stylexls.科学计数法:
                        cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00E+00");
                        cellStyle.SetFont(font);
                        break;
                    case stylexls.默认:
                        cellStyle.SetFont(font);
                        break;
                }
                return cellStyle;
    
    
            }
    
            #endregion
        }
  • 相关阅读:
    Python匹马行天下之_循环
    Hello world!
    Python匹马天下行之python基本语法
    Python匹马行天下之python之父
    Python匹马行天下之面向对象
    Python匹马行天下之运算符
    Python匹马行天下之初识python!
    跨域问题学习记录 CORS解决的2种方法
    Linux系统运维成长记
    关于倒计时new Date().getTime()出现NaN
  • 原文地址:https://www.cnblogs.com/tangchun/p/6950916.html
Copyright © 2020-2023  润新知