zoukankan      html  css  js  c++  java
  • 封装对NPOIExcel的操作,方便的设置导出Excel的样式

    下载:

    http://pan.baidu.com/s/1boTpT5l

    使用方法:

    导入:
    使用 ReadToDataTable方法
    导出:
           NPOIExcel.ExcelManager manger1 = new ExcelManager(this.textBox2.Text, ExcelManager.DealType.exportExcel); manger1.SetDataSource(dt, 1); //设置标题行 manger1.SetRangeStyle("A1", "D1") .SetCellMerge() .SetFontColor(NPOIStyle.NPOIColor.Blue) .SetBackgroundColor(NPOIStyle.NPOIColor.Yellow) .SetFontBold() .SetFontItalic() .SetFontSize(18) .SetCellText("2016 这里是标题") .SetEnd(); // 设置数据 manger1.SetRangeStyle("a2", "d5") .SetFontName("微软雅黑") .SetFontSize(12) .SetHorizontalAlignment(NPOIStyle.Alignment.Left) .SetBorderAll() .SetEnd(); //设置尾行 manger1.SetRangeStyle("e8", "f9") .SetCellMerge() .SetFontColor(NPOIStyle.NPOIColor.Red) .SetFontItalic() .SetFontSize(14) .SetCellText("2016 签名") .SetBorderBottom() .SetBorderRight() .SetEnd(); //导出文件 manger1.ExportExcelFile();

    源码:

    
    
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using NPOI.SS.UserModel;
    using System.IO;
    using NPOI.XSSF.UserModel;
    using NPOI.SS.Util;
    using NPOI.HSSF.Util;
    
    namespace NPOIExcel
    {
        public class Point
        {
            public int X { get; set; }
            public int Y { get; set; }
        }
        public class Range
        {
            public int FIRSTROW { get; set; }
            public int LASTROW { get; set; }
            public int FIRSTCOL { get; set; }
            public int LASTCOL { get; set; }
        }
    
        public class ExcelManager
        {
            #region 属性
    
            private string inPutPath { get; set; }
            private string outPutPath { get; set; }
            private IWorkbook workbook { get; set; }
            private ISheet sheet { get; set; }
    
    
    
            #endregion
    
            #region 初始化
            //public ExcelManager() { }
            /// <summary>
            /// 创建一个用于导入,导出  数据的管理类
            /// </summary>
            /// <param name="Path">文件路径</param>
            /// <param name="type">设置路径为导入或导出</param>
            public ExcelManager(string Path, DealType type)
            {
                //设置导入文件的路径,workBook
                if (type == DealType.importExcel)
                {
                    inPutPath = Path;
                    using (FileStream file = new FileStream(inPutPath, FileMode.Open, FileAccess.Read))
                    {
                        workbook = WorkbookFactory.Create(file);
                    }
                }
                if (type == DealType.exportExcel)
                {
                    outPutPath = Path;
                    workbook = new XSSFWorkbook();
                    sheet = workbook.CreateSheet("sheet1");
                }
    
            }
    
            /// <summary>
            /// 对Excel的操作类型
            /// </summary>
            public enum DealType
            {
                importExcel,
                exportExcel
            }
            #endregion
    
            #region "基础样式设置---2016-05-17 fengylc add "
            /// <summary>
            /// 设置范围内的样式
            /// </summary>
            /// <param name="startPoint">开始的单元格:例-A1</param>
            /// <param name="endPoint">结束的单元格:例-B1</param>
            /// <returns>样式</returns>
            public NPOIStyle SetRangeStyle(string startPoint, string endPoint)
            {
                return new NPOIStyle(workbook, sheet, startPoint, endPoint);
            }
    
            #endregion
    
            #region 导入
            /// <summary>
            /// 读取Excel到DataTable,默认第一行为列名
            /// </summary>
            /// <param name="headRowCount">表头的行数,从表头下一行开始是数据</param>
            /// <returns>DataTable</returns>
            public DataTable ReadExcelToDataTable(int headRowCount = 1)
            {
    
                using (FileStream file = new FileStream(inPutPath, FileMode.Open, FileAccess.Read))
                {
                    workbook = WorkbookFactory.Create(file);
                }
    
                sheet = workbook.GetSheetAt(0);
                DataTable dtl = new DataTable(sheet.SheetName.Trim());
    
                IRow headRow = sheet.GetRow(0);
    
                int columnCount = headRow.Cells.Count;
    
                for (int index = 0; index <= columnCount - 1; index++)
                {
                    if (headRow.Cells[index].Equals(null))
                        dtl.Columns.Add(string.Empty, typeof (string));
                    else
                    {
                        if(CellType.Numeric==headRow.Cells[index].CellType)
                            dtl.Columns.Add(headRow.Cells[index].NumericCellValue.ToString().Trim(), typeof(string));
                        else
                        dtl.Columns.Add(headRow.Cells[index].StringCellValue.Trim(), typeof(string));
                    }
                       
                }
    
                for (int x = headRowCount; x <= sheet.LastRowNum; x++)
                {
                    IRow contentRow = sheet.GetRow(x);
                    if (contentRow.Equals(null))
                        continue;
                    else
                    {
                        DataRow dr = dtl.NewRow();
                        bool isEmpty = true;
    
                        for (int y = 0; y <= columnCount - 1; y++)
                        {
                            if (contentRow.GetCell(y).Equals(null))
                            {
                                dr[y] = string.Empty;
                            }
                            else
                            {
                                ICell contentCell = contentRow.GetCell(y);
                                switch (contentCell.CellType)
                                {
                                    case CellType.Blank:
                                        dr[y] = string.Empty;
                                        break;
                                    case CellType.Boolean:
                                        break;
                                    case CellType.Error:
                                        break;
                                    case CellType.Formula:
                                        dr[y] = contentCell.StringCellValue.Trim();
                                        break;
                                    case CellType.Numeric:
                                        {
                                            if (DateUtil.IsCellDateFormatted(contentCell))
                                                dr[y] = contentCell.DateCellValue.ToString("yyyy-MM-dd HH:mm:ss");
                                            else
                                                dr[y] = contentCell.NumericCellValue.ToString().Trim();
                                        }
                                        break;
                                    case CellType.String:
                                        dr[y] = contentCell.StringCellValue.Trim();
                                        break;
                                    case CellType.Unknown:
                                        break;
    
                                }
                                isEmpty = string.IsNullOrEmpty(dr[y].ToString().Trim()) && isEmpty;
                            }
                        }
    
                        //非全空添加行
                        if (!isEmpty) dtl.Rows.Add(dr);
                    }
                }
                return dtl;
            }
            #endregion
    
            #region 导出
            /// <summary>
            /// 设置数据源
            /// </summary>
            /// <param name="dt">数据</param>
            /// <param name="headEmptyLineCount">最上方留出的空行</param>
            public void SetDataSource(DataTable dt, int headEmptyLineCount = 0)
            {
    
    
                try
                {
                    int TotalNum = dt.Rows.Count + headEmptyLineCount + 1;// (加上 空行 )
    
                    //添加数据
                    addData(TotalNum, headEmptyLineCount + 1, sheet, dt);
                    //标题设置
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        sheet.GetRow(headEmptyLineCount).GetCell(i).SetCellValue(dt.Columns[i].ColumnName);
                    }
    
                }
                catch (Exception ex)
                {
                    throw ex;
                }
    
            }
            /// <summary>
            /// 导出文件
            /// </summary>
            /// <param name="fileName">文件名,不指定为随机生成</param>
            public void ExportExcelFile(string fileName = "")
            {
                Random ran = new Random();
                if (string.IsNullOrEmpty(fileName))
                {
                    fileName = "\" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ran.Next(1000, 9999).ToString() + ".xlsx";
                }
                else
                {
                    fileName = "\" + fileName + ".xlsx";
                }
    
                string CreatePath = outPutPath + fileName;
                FileStream NewFile = new FileStream(CreatePath, FileMode.Create);
                workbook.Write(NewFile);
            }
            private static void addData(int TotalNum, int headCount, ISheet sheet, DataTable dt)
            {
                //添加数据
                for (int i = 0; i < TotalNum; i++)
                {
                    IRow row = sheet.CreateRow(i);
    
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        row.CreateCell(j);
                        if (i >= headCount)
                        {
                            try
                            {
                                double cellData = double.Parse(dt.Rows[i - headCount][j].ToString());
                                row.CreateCell(j).SetCellValue(cellData);
                            }
                            catch
                            {
                                string cellData = dt.Rows[i - headCount][j].ToString();
                                if (cellData.Trim().Length > 1 && cellData.Substring(0, 1) == "'")
                                { cellData = cellData.Substring(1, cellData.Length - 1); }
                                row.CreateCell(j).SetCellValue(cellData);
                            }
                        }
                    }
                }
            }
            #endregion
        }
        /// <summary>
        /// 设置样式
        /// </summary>
        public class NPOIStyle
        {
            public Range range { get; set; }
            public ISheet sheet { get; set; }
            public ICellStyle cellStyle { get; set; }
            public IFont cellFontStyle { get; set; }
    
            public NPOIStyle(IWorkbook workbook, ISheet sheet, string startPoint, string endPoint)
            {
                cellStyle = workbook.CreateCellStyle();
                cellFontStyle = workbook.CreateFont();
                this.sheet = sheet;
                range = GetRange(startPoint, endPoint);
    
            }
    
            public enum Alignment
            {
                Center, Fill, Left, Right, Bottom, Top
            }
            public enum NPOIColor : short
            {
                Black = 8, Brown = 60, OliveGreen = 59, DarkGreen = 58, DarkTeal = 56,
                DarkBlue = 18, Indigo = 62, Grey80Percent = 63, DarkRed = 16, Orange = 53,
                DarkYellow = 19, Green = 17, Teal = 21, Blue = 12, BlueGrey = 54,
                Grey50Percent = 23, Red = 10, LightOrange = 52, Lime = 50, SeaGreen = 57,
                Aqua = 49, LightBlue = 48, Violet = 20, Grey40Percent = 55, Pink = 14,
                Gold = 51, Yellow = 13, BrightGreen = 11, Turquoise = 15, SkyBlue = 40,
                Plum = 61, Grey25Percent = 22, Rose = 45, Tan = 47, LightYellow = 43,
                LightGreen = 42, LightTurquoise = 41, PaleBlue = 44, Lavender = 46,
                White = 9, CornflowerBlue = 24, LemonChiffon = 26, Maroon = 25,
                Orchid = 28, Coral = 29, RoyalBlue = 30, LightCornflowerBlue = 31, Automatic = 64
            }
            /// <summary>
            /// 把Excel列名字母转换为 数字坐标
            /// </summary>
            /// <param name="character">Excel列名</param>
            /// <returns>转换后的数字</returns>
            public static int Asc(string character)
            {
                character = character.ToUpper();
                char[] arry = character.ToCharArray();
                int total = 0;
                for (int i = 0; i < character.Length; i++)
                {
                    total += (Convert.ToInt32(arry[i]) - 65) + 26 * i;
                }
                return total;
            }
            /// <summary>
            /// 把‘A1’类型转换成Point类型
            /// </summary>
            /// <param name="point">字符点</param>
            /// <returns>Point</returns>
            public static Point GetPoint(string point)
            {
                Point newPoint = new Point();
                char[] arry = point.ToCharArray();
    
                int index = 0;
                for (int i = 0; i < point.Length; i++)
                {
                    if (Char.IsNumber(arry[i]))
                    {
                        index = i;
                        break;
                    }
                }
                newPoint.Y = Asc(point.Substring(0, index));
                newPoint.X = int.Parse(point.Substring(index, point.Length - index)) - 1;
                return newPoint;
            }
            /// <summary>
            /// 根据两个点确定一个范围
            /// </summary>
            /// <param name="startPosition">Excel上的开始点</param>
            /// <param name="endPosition">Excel上的结束点</param>
            /// <returns>范围</returns>
            public Range GetRange(string startPosition, string endPosition)
            {
                Range range = new Range();
                Point start = GetPoint(startPosition);
                Point end = GetPoint(endPosition);
    
                range.FIRSTROW = start.X;
                range.LASTROW = end.X;
                range.FIRSTCOL = start.Y;
                range.LASTCOL = end.Y;
    
                for (int row = range.FIRSTROW; row <= range.LASTROW; row++)
                {
                    if (sheet.GetRow(row) == null) sheet.CreateRow(row);
    
                    for (int col = range.FIRSTCOL; col <= range.LASTCOL; col++)
                    {
                        if (sheet.GetRow(row).GetCell(col) == null) sheet.GetRow(row).CreateCell(col);
                    }
                }
    
                return range;
            }
            /// <summary>
            /// 设置样式的必要设置:设置样式的范围
            /// </summary>
            /// <param name="startPoint">范围起始点</param>
            /// <param name="endPoint">范围结束点</param>
            /// <returns>设置样式的范围</returns>
            public NPOIStyle SetRange(string startPoint, string endPoint)
            {
                this.range = GetRange(startPoint, endPoint);
                return this;
            }
            /// <summary>
            /// 合并单元格  
            /// </summary>
            /// <param name="startPosition">合并开始的单元格</param>
            /// <param name="endPosition">合并结束的单元格</param>
            /// <returns></returns>
            public NPOIStyle SetCellMerge()
            {
                //把excel单元格带字母坐标 转换为 数字坐标
                CellRangeAddress cellRangeAddress = new CellRangeAddress(range.FIRSTROW, range.LASTROW, range.FIRSTCOL, range.LASTCOL);
                this.sheet.AddMergedRegion(cellRangeAddress);
                return this;
            }
            /// <summary>
            /// 设置字体大小
            /// </summary>
            /// <param name="size">字体大小:9,10,11...</param>
            /// <returns>Manager</returns>
            public NPOIStyle SetFontSize(short size)
            {
                cellFontStyle.FontHeightInPoints = size;
                return this;
            }
            /// <summary>
            /// 设置sheet页面上列的宽
            /// </summary>
            /// <param name="size"></param>
            /// <returns></returns>
            public NPOIStyle SetSheetColumnWidthSize(short size)
            {
                sheet.DefaultColumnWidth = size;
                return this;
            }
            /// <summary>
            /// 设置字体样式
            /// </summary>
            /// <param name="FontName">字体:宋体,黑体...</param>
            /// <returns>Manager</returns>
            public NPOIStyle SetFontName(string FontName)
            {
                cellFontStyle.FontName = FontName;
                return this;
            }
            /// <summary>
            /// 设置字体加粗
            /// </summary>
            /// <returns>Manager</returns>
            public NPOIStyle SetFontBold()
            {
                cellFontStyle.Boldweight = (short)FontBoldWeight.Bold;
                return this;
            }
            /// <summary>
            /// 设置字体下划线
            /// </summary>
            /// <returns>Manager</returns>
            public NPOIStyle SetFontUnderline()
            {
                cellFontStyle.Underline = FontUnderlineType.Single;
                return this;
            }
            /// <summary>
            /// 设置字体下倾斜
            /// </summary>
            /// <returns>Manager</returns>
            public NPOIStyle SetFontItalic()
            {
                cellFontStyle.IsItalic = true;
                return this;
            }
            /// <summary>
            /// 设置字体水平对齐
            /// </summary>
            /// <returns>Manager</returns>
            public NPOIStyle SetHorizontalAlignment(Alignment alignment)
            {
                switch (alignment)
                {
                    case Alignment.Center:
                        cellStyle.Alignment = HorizontalAlignment.Center;
                        break;
                    case Alignment.Fill:
                        cellStyle.Alignment = HorizontalAlignment.Fill;
                        break;
                    case Alignment.Left:
                        cellStyle.Alignment = HorizontalAlignment.Left;
                        break;
                    case Alignment.Right:
                        cellStyle.Alignment = HorizontalAlignment.Right;
                        break;
                    default:
                        break;
                }
                return this;
            }
            /// <summary>
            /// 设置字体垂直对齐
            /// </summary>
            /// <returns>Manager</returns>
            public NPOIStyle SetVerticalAlignment(Alignment alignment)
            {
                switch (alignment)
                {
                    case Alignment.Center:
                        cellStyle.VerticalAlignment = VerticalAlignment.Center;
                        break;
                    case Alignment.Fill:
                        cellStyle.VerticalAlignment = VerticalAlignment.Justify;
                        break;
                    case Alignment.Top:
                        cellStyle.VerticalAlignment = VerticalAlignment.Top;
                        break;
                    case Alignment.Bottom:
                        cellStyle.VerticalAlignment = VerticalAlignment.Bottom;
                        break;
                    default:
                        break;
                }
                return this;
            }
            /// <summary>
            /// 设置字体颜色
            /// </summary>
            /// <param name="FontName">字体:宋体,黑体...</param>
            /// <returns>Manager</returns>
            public NPOIStyle SetFontColor(NPOIColor color)
            {
                cellFontStyle.Color = (short)color;
                return this;
            }
            /// <summary>
            /// 设置单元格背景色
            /// </summary>
            /// <param name="color"></param>
            /// <returns></returns>
            public NPOIStyle SetBackgroundColor(NPOIColor color)
            {
                cellStyle.FillPattern = FillPattern.SolidForeground;
                cellStyle.FillForegroundColor = (short)color;
                return this;
            }
            /// <summary>
            /// 设置单元格的文字
            /// </summary>
            /// <param name="position"></param>
            /// <param name="text"></param>
            public NPOIStyle SetCellText(string text)
            {
                sheet.GetRow(range.FIRSTROW).GetCell(range.FIRSTCOL).SetCellValue(text);
                return this;
            }
            /// <summary>
            /// 设置边框(Range内每个单元格的四边)
            /// </summary>
            /// <returns></returns>
            public NPOIStyle SetBorderAll()
            {
                cellStyle.BorderBottom = BorderStyle.Thin;
                cellStyle.BorderLeft = BorderStyle.Thin;
                cellStyle.BorderRight = BorderStyle.Thin;
                cellStyle.BorderTop = BorderStyle.Thin;
                return this;
            }
            public NPOIStyle SetBorderBottom()
            {
                cellStyle.BorderBottom = BorderStyle.Thin;
                return this;
            }
            public NPOIStyle SetBorderLeft()
            {
                cellStyle.BorderLeft = BorderStyle.Thin;
                return this;
            }
            public NPOIStyle SetBorderRight()
            {
                cellStyle.BorderRight = BorderStyle.Thin;
                return this;
            }
            public NPOIStyle SetBorderTop()
            {
                cellStyle.BorderTop = BorderStyle.Thin;
                return this;
            }
    
            /// <summary>
            /// 样式设置结束,调用此方法生效
            /// </summary>
            public void SetEnd()
            {
                for (int i = range.FIRSTROW; i <= range.LASTROW; i++)
                {
                    for (int j = range.FIRSTCOL; j <= range.LASTCOL; j++)
                    {
                        cellStyle.SetFont(cellFontStyle);
                        sheet.GetRow(i).GetCell(j).CellStyle = cellStyle;
                    }
                }
            }
        }
    }
    
    
    
     
  • 相关阅读:
    IIS: 必须输入密码手动设置密码同步后
    IIS操作控制类
    SQL对IP地址进行拆分
    HTTP_REFERER的工作方式[转贴]
    如何知道同服务器上都有哪些网站?
    简单判断临时表是否存在
    .NET 3.5 SP 1发布了
    Log Parser很好很强大的IIS日志分析工具
    遍历Request.ServerVariables
    06复杂查询(多数据库表)
  • 原文地址:https://www.cnblogs.com/longling2344/p/5506036.html
Copyright © 2011-2022 走看看