NPOIHelper

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using NPOI.HPSF;
using NPOI.HSSF.UserModel;
using NPOI.HSSF.Util;
using NPOI.SS.UserModel;
using NPOI.SS.Util;

namespace TestApp
{
    public  class NPOIHelper 
    {

        private HSSFWorkbook hssfworkbook = new HSSFWorkbook();

        private string xlsPath="";

        public NPOIHelper(string path)
        {
            xlsPath = path;
            using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
                hssfworkbook = new HSSFWorkbook(file);
            }
        }

        #region 属性

        public string XlsPath
        {
            get { return xlsPath; }
            set { xlsPath = value; }
        }

        #endregion

        #region  方法
        /// <summary>
        /// 创建一个空的Excel文档,指定sheet名
        /// </summary>
        /// <param name="xlspath">excel保存路径,默认为xls后缀名</param>
        /// <param name="sheets">sheet名称</param>
        public void CreateEmptyExcelFile(string xlspath,params string[] sheets)
        {
            InitializeWorkbook();

            if (sheets.Count()>0)
            {
                for (int i = 0; i < sheets.Count(); i++)
                {
                    hssfworkbook.CreateSheet(sheets[i]);
                } 
            }
            else
            {
                hssfworkbook.CreateSheet("sheet1");
            }
           
            ((HSSFSheet)hssfworkbook.GetSheetAt(0)).AlternativeFormula = false;
            ((HSSFSheet)hssfworkbook.GetSheetAt(0)).AlternativeExpression = false;

            FileStream file = new FileStream(xlspath+".xls", FileMode.Create);
            hssfworkbook.Write(file);
            file.Close();
        }
        #endregion

        #region 私有方法

        /// <summary>
        /// 设置xls的信息
        /// </summary>
        private void InitializeWorkbook()
        {
            DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
            dsi.Company = "NPOI Team";
            hssfworkbook.DocumentSummaryInformation = dsi;

            SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
            si.Subject = "NPOI Example";
            hssfworkbook.SummaryInformation = si;
        }

        private void WriteToFile()
        {
            //Write the stream data of workbook to the root directory
            FileStream file = new FileStream(xlsPath, FileMode.Create);
            hssfworkbook.Write(file);
            file.Close();
        }

        #endregion

        /// <summary>
        /// 写入数据,无格式
        /// </summary>
        /// <param name="Sheetindex">sheet索引</param>
        /// <param name="value"></param>
        public void SetCellValuesInXls(int Sheetindex, int RowIndex, int CellIndex, string value)
        {
            InitializeWorkbook();

            ISheet sheet1 = hssfworkbook.GetSheetAt(Sheetindex);

            sheet1.CreateRow(RowIndex).CreateCell(CellIndex).SetCellValue(value);
           
            WriteToFile();
        }
        /// <summary>
        /// 写入日期格式
        /// </summary>
        /// <param name="Sheetindex"></param>
        /// <param name="RowIndex"></param>
        /// <param name="CellIndex"></param>
        /// <param name="value"></param>
        public void SetDateCellInXls(int Sheetindex, int RowIndex, int CellIndex, string date) 
        {
            InitializeWorkbook();

            ISheet sheet = hssfworkbook.GetSheetAt(Sheetindex);
            // Create a row and put some cells in it. Rows are 0 based.
            IRow row = sheet.CreateRow(RowIndex);

            // Create a cell and put a date value in it.  The first cell is not styled as a date.
            ICell cell = row.CreateCell(CellIndex);
            cell.SetCellValue(date);
        
            ICellStyle cellStyle = hssfworkbook.CreateCellStyle();

            cellStyle.DataFormat = hssfworkbook.CreateDataFormat().GetFormat("yyyy年m月d日");
            cell.CellStyle = cellStyle;

            //ICell cell2 = row.CreateCell(1);
            //cell2.SetCellValue(new DateTime(2008, 5, 5));
            //ICellStyle cellStyle2 = hssfworkbook.CreateCellStyle();
            //IDataFormat format = hssfworkbook.CreateDataFormat();
            //cellStyle2.DataFormat = format.GetFormat("yyyy年m月d日");
            //cell2.CellStyle = cellStyle2;

            //ICell cell3 = row.CreateCell(2);
            //cell3.CellFormula = "DateValue("2005-11-11 11:11:11")";
            //ICellStyle cellStyle3 = hssfworkbook.CreateCellStyle();
            //cellStyle3.DataFormat = HSSFDataFormat.GetBuiltinFormat("m/d/yy h:mm");
            //cell3.CellStyle = cellStyle3;

            WriteToFile();
        }
        /// <summary>
        /// 增加备注
        /// </summary>
        /// <param name="Sheetindex"></param>
        /// <param name="RowIndex"></param>
        /// <param name="CellIndex"></param>
        /// <param name="value"></param>
        /// <param name="commentStr">备注信息</param>
        public void SetCellCommentInXls(int Sheetindex, int RowIndex, int CellIndex, string value, string commentStr)
        {
            InitializeWorkbook();

            ISheet sheet = hssfworkbook.GetSheetAt(Sheetindex);
         
            IDrawing patr = (HSSFPatriarch)sheet.CreateDrawingPatriarch();

            ICell cell1 = sheet.CreateRow(RowIndex).CreateCell(CellIndex);
            cell1.SetCellValue(new HSSFRichTextString(value));

            //anchor defines size and position of the comment in worksheet
            IComment comment1 = patr.CreateCellComment(new HSSFClientAnchor(0, 0, 0, 0, 4, 2, 6, 5));

            // set text in the comment
            comment1.String = (new HSSFRichTextString(commentStr));

            // The first way to assign comment to a cell is via HSSFCell.SetCellComment method
            cell1.CellComment = (comment1);
            #region old
            ////Create another cell in row 6
            //ICell cell2 = sheet.CreateRow(6).CreateCell(1);
            //cell2.SetCellValue(value);
            //HSSFComment comment2 = (HSSFComment)patr.CreateCellComment(new HSSFClientAnchor(0, 0, 0, 0, 4, 8, 6, 11));
            ////modify background color of the comment
            //comment2.SetFillColor(204, 236, 255);
            //HSSFRichTextString str = new HSSFRichTextString("Normal body temperature");
            ////apply custom font to the text in the comment
            //IFont font = hssfworkbook.CreateFont();
            //font.FontName = ("Arial");
            //font.FontHeightInPoints = 10;
            //font.Boldweight = (short)FontBoldWeight.BOLD;
            //font.Color = HSSFColor.RED.index;
            //str.ApplyFont(font);
            //comment2.String = str;
            //comment2.Visible = true; //by default comments are hidden. This one is always visible.
            //comment2.Author = "Bill Gates";
            ///**
            // * The second way to assign comment to a cell is to implicitly specify its row and column.
            // * Note, it is possible to set row and column of a non-existing cell.
            // * It works, the commnet is visible.
            // */
            //comment2.Row = 6;
            //comment2.Column = 1;
            #endregion
            WriteToFile();
        }
        /// <summary>
        /// 给表格画边框
        /// </summary>
        /// <param name="Sheetindex"></param>
        /// <param name="RowIndex"></param>
        /// <param name="CellIndex"></param>
        public void SetBorderStyleInXls(int Sheetindex, int RowIndex, int CellIndex)
        {
            InitializeWorkbook(); 

            ISheet sheet = hssfworkbook.GetSheetAt(Sheetindex);

            // Create a row and put some cells in it. Rows are 0 based.
            IRow row = sheet.GetRow(RowIndex);

            // Create a cell and put a value in it.
            ICell cell =  row.GetCell(CellIndex);

            // Style the cell with borders all around.
            ICellStyle style = hssfworkbook.CreateCellStyle();
            style.BorderBottom = BorderStyle.THIN;
            style.BottomBorderColor = HSSFColor.BLACK.index;
            style.BorderLeft = BorderStyle.DASH_DOT_DOT;
            style.LeftBorderColor = HSSFColor.GREEN.index;
            style.BorderRight = BorderStyle.HAIR;
            style.RightBorderColor = HSSFColor.BLUE.index;
            style.BorderTop = BorderStyle.MEDIUM_DASHED;
            style.TopBorderColor = HSSFColor.ORANGE.index;
            cell.CellStyle = style;

            WriteToFile();
        }
        /// <summary>
        /// 给单元格加公式
        /// </summary>
        /// <param name="Sheetindex"></param>
        /// <param name="RowIdex"></param>
        /// <param name="CellIndex"></param>
        /// <param name="formula">公式</param>
        public void SetFormulaOfCellInXls(int Sheetindex, int RowIdex, int CellIndex, string formula)
        {  
            InitializeWorkbook();

            ISheet sheet1 = hssfworkbook.GetSheetAt(Sheetindex);

            ICellStyle blackBorder = hssfworkbook.CreateCellStyle();
            blackBorder.BorderBottom = BorderStyle.THIN;
            blackBorder.BorderLeft = BorderStyle.THIN;
            blackBorder.BorderRight = BorderStyle.THIN;
            blackBorder.BorderTop = BorderStyle.THIN;
            blackBorder.BottomBorderColor = HSSFColor.BLACK.index;
            blackBorder.LeftBorderColor = HSSFColor.BLACK.index;
            blackBorder.RightBorderColor = HSSFColor.BLACK.index;
            blackBorder.TopBorderColor = HSSFColor.BLACK.index;

            IRow row = sheet1.GetRow(RowIdex);
            ICell cell = row.CreateCell(CellIndex);
            cell.CellFormula = formula;

            WriteToFile();
        }
        /// <summary> 
        /// 设置打印区域 
        /// </summary>
        /// <param name="Sheetindex"></param>
        /// <param name="Area">"A5:G20"</param>
        public void SetPrintAreaInXls(int Sheetindex, string Area)
        {
            InitializeWorkbook();

            hssfworkbook.SetPrintArea(Sheetindex,Area );

            WriteToFile();
        }
        /// <summary>
        /// 设置打印格式,默认为A4纸
        /// </summary>
        /// <param name="Sheetindex"></param>
        /// <param name="Area"></param>
        public void SetPrintFormatInXls(int Sheetindex)
        {
            InitializeWorkbook();

            ISheet sheet1 = hssfworkbook.CreateSheet("Sheet1");
            sheet1.SetMargin(MarginType.RightMargin, (double)0.5);
            sheet1.SetMargin(MarginType.TopMargin, (double)0.6);
            sheet1.SetMargin(MarginType.LeftMargin, (double)0.4);
            sheet1.SetMargin(MarginType.BottomMargin, (double)0.3);

            sheet1.PrintSetup.Copies = 3;
            sheet1.PrintSetup.NoColor = true;
            sheet1.PrintSetup.Landscape = true;
            sheet1.PrintSetup.PaperSize = (short)PaperSize.A4;

            sheet1.FitToPage = true;
            sheet1.PrintSetup.FitHeight = 2;
            sheet1.PrintSetup.FitWidth = 3;
            sheet1.IsPrintGridlines = true;

            WriteToFile();
        }
        /// <summary>
        /// 设置表格的宽和高
        /// </summary>
        /// <param name="Sheetindex"></param>
        /// <param name="RowIdex"></param>
        /// <param name="width"></param>
        /// <param name="height"></param>
        public void SetWidthAndHeightInXls(int Sheetindex, int RowIdex,int CellIndex,int width,short height)
        {
            InitializeWorkbook();

            ISheet sheet1 = hssfworkbook.GetSheetAt(Sheetindex);
            //set the width of columns
            sheet1.SetColumnWidth(CellIndex, width);

            //set the width of height
            sheet1.GetRow(RowIdex).Height = height;
          
            sheet1.DefaultRowHeightInPoints = 50;

            WriteToFile();
        }
        /// <summary>
        /// 设置单元格对齐方式
        /// </summary>
        /// <param name="Sheetindex"></param>
        /// <param name="RowIdex"></param>
        /// <param name="CellIndex"></param>
        /// <param name="Horizont">水平对齐方式:left,center,right,justify</param>
        /// <param name="Vertical">垂直对齐方式:top,center,buttom,justify</param>
        public void SetAlignmentInXls(int Sheetindex, int RowIdex, int CellIndex, string Horizont, string Vertical)
        {
            InitializeWorkbook();

            ISheet sheet1 = hssfworkbook.GetSheetAt(Sheetindex);

            IRow row = sheet1.GetRow(RowIdex);
            ICellStyle style = hssfworkbook.CreateCellStyle();
            if (Horizont == "left")
            {
                style.Alignment = HorizontalAlignment.LEFT;
            }
            else if (Horizont == "center")
            {
                style.Alignment = HorizontalAlignment.CENTER;
            }
            else if (Horizont == "right")
            {
                style.Alignment = HorizontalAlignment.RIGHT;
            }
            else if (Horizont == "justify")
            {
                style.Alignment = HorizontalAlignment.JUSTIFY;
            }
          
            if (Vertical == "top")
            {
                style.VerticalAlignment = VerticalAlignment.TOP;
            }
            else if (Vertical == "center")
            {
                style.VerticalAlignment = VerticalAlignment.CENTER;
            }
            else if (Vertical == "buttom")
            {
                style.VerticalAlignment = VerticalAlignment.BOTTOM;
            }
            else if (Vertical=="justify")
            {
                style.VerticalAlignment = VerticalAlignment.JUSTIFY;
            }
            style.Indention = 3;

            row.GetCell(CellIndex).CellStyle = style;

            WriteToFile();
        }
        /// <summary>
        /// 放大缩小工作簿 根据  sub/den 进行缩放
        /// </summary>
        /// <param name="Sheetindex">要放大的sheet</param>
        /// <param name="sub">比列的分子</param>
        /// <param name="den">比列的分母</param>
        public void ZoomSheet(int Sheetindex,int sub,int den)
        {
            InitializeWorkbook();

            ISheet sheet1 = hssfworkbook.GetSheetAt(Sheetindex);
            sheet1.SetZoom(sub, den);   // 75 percent magnification

            WriteToFile();
        }
        /// <summary>
        /// 在单元格内使用多行存储数据
        /// </summary>
        /// <param name="Sheetindex"></param>
        /// <param name="RowIdex"></param>
        /// <param name="CellIndex"></param>
        /// <param name="rows">使用的行数</param>
        /// <param name="value">在换行的后面加上   
</param>
        public void UseNewlinesInCellsInXls(int Sheetindex, int RowIdex, int CellIndex,int rows,string value)
        {
            InitializeWorkbook(); 

            ISheet sheet1 = hssfworkbook.GetSheetAt(Sheetindex);

            //use newlines in cell
            IRow row1 = sheet1.GetRow(RowIdex);
            ICell cell1 = row1.GetCell(CellIndex);

            //to enable newlines you need set a cell styles with wrap=true
            ICellStyle cs = hssfworkbook.CreateCellStyle();
            cs.WrapText = true;
            cell1.CellStyle = cs;

            row1.HeightInPoints = rows * sheet1.DefaultRowHeightInPoints;
            cell1.SetCellValue(value);
            WriteToFile();
        }
        /// <summary>
        /// 单元格使用基础公式
        /// </summary>
        /// <param name="Sheetindex"></param>
        /// <param name="RowIdex"></param>
        /// <param name="CellIndex"></param>
        /// <param name="Formula"></param>
        public void UseBasicFormulaInXls(int Sheetindex, int RowIdex, int CellIndex, string Formula)
        {
            InitializeWorkbook();
            ISheet s1 = hssfworkbook.GetSheetAt(Sheetindex);
            //set A4=A2+A3,set D2=SUM(A2:C2);A5=cos(5)+sin(10)
            s1.GetRow(RowIdex).GetCell(CellIndex).CellFormula = Formula;
            WriteToFile();
        }


        /// <summary>
        /// 冻结行,FreezeRow为要冻结的行
        /// </summary>
        /// <param name="Sheetindex"></param>
        public void SplitAndFreezePanes(int Sheetindex, int FreezeRow)
        {
            InitializeWorkbook();

            ISheet sheet1 = hssfworkbook.GetSheetAt(Sheetindex);

            // Freeze just one row
            sheet1.CreateFreezePane(0, FreezeRow);
          
            WriteToFile();
        }


        /// <summary>
        /// 缩放指定单元格字体
        /// </summary>
        /// <param name="Sheetindex"></param>
        /// <param name="RowIdex"></param>
        /// <param name="CellIndex"></param>
        public void ShrinkToFitColumnInXls(int Sheetindex, int RowIdex, int CellIndex)
        {
            InitializeWorkbook();

            ISheet sheet = hssfworkbook.GetSheetAt(Sheetindex);
            IRow row = sheet.GetRow(RowIdex);
            //create cell value
            ICell cell1 = row.GetCell(CellIndex);

            ICellStyle cellstyle1 = hssfworkbook.CreateCellStyle();
            cellstyle1.ShrinkToFit = true;
            WriteToFile();
        }


        /// <summary>
        /// 将字体旋转指定角度
        /// </summary>
        /// <param name="Sheetindex"></param>
        /// <param name="RowIdex"></param>
        /// <param name="CellIndex"></param>
        /// <param name="Angle"></param>
        public void RotateTextInXls(int Sheetindex, int RowIdex, int CellIndex,short Angle)
        {
            InitializeWorkbook();

            ISheet sheet1 = hssfworkbook.GetSheetAt(Sheetindex);

            IRow row = sheet1.GetRow(RowIdex);
            //set the style
            ICellStyle style = hssfworkbook.CreateCellStyle();
            style.Rotation = Angle;
            row.GetCell(CellIndex).CellStyle = style;

            WriteToFile();
        }

        public void RepeatingRowsAndColumns(int Sheetindex, int RowIdex, int CellIndex)
        {
            InitializeWorkbook();

            ISheet sheet1 = hssfworkbook.GetSheetAt(Sheetindex);

            IFont boldFont = hssfworkbook.CreateFont();
            boldFont.FontHeightInPoints = 22;
            boldFont.Boldweight = (short)FontBoldWeight.BOLD;

            ICellStyle boldStyle = hssfworkbook.CreateCellStyle();
            boldStyle.SetFont(boldFont);

            IRow row = sheet1.GetRow(RowIdex);
            ICell cell = row.GetCell(CellIndex);
            cell.CellStyle = (boldStyle);

            // Set the columns to repeat from column 0 to 2 on the first sheet
            hssfworkbook.SetRepeatingRowsAndColumns(Sheetindex, 0, 2, -1, -1);

            WriteToFile();
        }



        /// <summary>
        /// 向单元格中写入数字格式
        /// </summary>
        /// <param name="Sheetindex"></param>
        /// <param name="RowIdex"></param>
        /// <param name="CellIndex"></param>
        /// <param name="type">double,RMB,scentific,percent,phone,ChineseCapital,ChineseDate</param>
        public void NumberFormatInXls(int Sheetindex, int RowIdex, int CellIndex,string type)
        {
            InitializeWorkbook();

            ISheet sheet = hssfworkbook.GetSheetAt(Sheetindex);
            //increase the width of Column A
            sheet.SetColumnWidth(0, 5000);
            //create the format instance
            IDataFormat format = hssfworkbook.CreateDataFormat();

            // Create a row and put some cells in it. Rows are 0 based.
            ICell cell = sheet.GetRow(RowIdex).GetCell(CellIndex);
            ICellStyle cellStyle = hssfworkbook.CreateCellStyle();

            if (type=="double")
            {
                cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00");
            }
            else if (type == "RMB")
            {
                cellStyle.DataFormat = format.GetFormat("¥#,##0"); 
            }
            else if (type == "scentific")
            {
                cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00E+00");
            }
            else if (type == "percent")
            {
                cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00%");
            }
            else if (type == "phone")//phone number format - "021-65881234"
             {
                 cellStyle.DataFormat = format.GetFormat("000-00000000");
             }
            else if (type == "ChineseCapital") //Chinese capitalized character number - 壹贰叁 元
            {
                cellStyle.DataFormat = format.GetFormat("[DbNum2][$-804]0 元");
            }
            else if (type == "ChineseDate")
            {
                cellStyle.DataFormat = format.GetFormat("yyyy年m月d日");
            }
            cell.CellStyle = cellStyle;
        
            WriteToFile();
        }


        /// <summary>
        /// 将一个单元格赋予两个表格的乘积
        /// </summary>
        /// <param name="Sheetindex"></param>
        /// <param name="RowIdex">要赋值的单元格行索引</param>
        /// <param name="CellIndex">要赋值的单元格列索引</param>
        /// <param name="targateRow1">第一个单元格的行</param>
        /// <param name="targateCell1">第一个单元格的列</param>
        /// <param name="targateRow2">第二个单元格的行</param>
        /// <param name="targateCell2">第二个单元格的列</param>
        public void MultplicationTableInXls(int Sheetindex, int RowIdex, int CellIndex,int targateRow1,int targateCell1,
            int targateRow2,int targateCell2)
        {
            InitializeWorkbook();

            ISheet sheet1 = hssfworkbook.GetSheetAt(Sheetindex);

            IRow row = sheet1.GetRow(RowIdex);

            string formula = GetCellPosition(targateRow1, targateCell1) + "*" + GetCellPosition(targateRow2, targateCell2);

            row.CreateCell(CellIndex).CellFormula = formula;

            WriteToFile();
        }
        public string GetCellPosition(int row, int col)
        {
            col = Convert.ToInt32('A') + col;
            row = row + 1;
            return ((char)col) + row.ToString();
        }
        /// <summary>
        /// 合并单元格
        /// </summary>
        /// <param name="Sheetindex"></param>
        /// <param name="firstRowIdex">起始单元格</param>
        /// <param name="firstCellIndex"></param>
        /// <param name="lastRowIdex">结束单元格</param>
        /// <param name="lastCellIndex"></param>
        public void MergeCellsInXls(int Sheetindex, int firstRowIdex, int firstCellIndex, int lastRowIdex, int lastCellIndex)
        {
            InitializeWorkbook();

            ISheet sheet = hssfworkbook.GetSheetAt(Sheetindex);

            sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, 5));

            CellRangeAddress region = new CellRangeAddress(firstRowIdex, lastRowIdex, firstCellIndex, lastCellIndex);

            sheet.AddMergedRegion(region);
          
            WriteToFile();
        }

        #region 未处理
        public void LoanCalculator(int Sheetindex, int RowIdex, int CellIndex)
        {
            InitializeWorkbook();
            Dictionary<String, ICellStyle> styles = CreateStyles(hssfworkbook);
            ISheet sheet = hssfworkbook.GetSheetAt(Sheetindex);
            sheet.IsPrintGridlines = (false);//取消打印格的显示
            sheet.DisplayGridlines = (false);

            IPrintSetup printSetup = sheet.PrintSetup;
            printSetup.Landscape = (true);
            sheet.FitToPage = (true);
            sheet.HorizontallyCenter = (true);

            sheet.SetColumnWidth(0, 3 * 256);
            sheet.SetColumnWidth(1, 3 * 256);
            sheet.SetColumnWidth(2, 11 * 256);
            sheet.SetColumnWidth(3, 14 * 256);
            sheet.SetColumnWidth(4, 14 * 256);
            sheet.SetColumnWidth(5, 14 * 256);
            sheet.SetColumnWidth(6, 14 * 256);

            CreateNames(hssfworkbook);

            IRow titleRow = sheet.CreateRow(0);
            titleRow.HeightInPoints = (35);
            for (int i = 1; i <= 7; i++)
            {
                titleRow.CreateCell(i).CellStyle = styles["title"];
            }
            ICell titleCell = titleRow.GetCell(2);
            titleCell.SetCellValue("Simple Loan Calculator");
            sheet.AddMergedRegion(CellRangeAddress.ValueOf("$C$1:$H$1"));

            IRow row = sheet.CreateRow(2);
            ICell cell = row.CreateCell(4);
            cell.SetCellValue("Enter values");
            cell.CellStyle = styles["item_right"];

            row = sheet.CreateRow(3);
            cell = row.CreateCell(2);
            cell.SetCellValue("Loan amount");
            cell.CellStyle = styles["item_left"];
            cell = row.CreateCell(4);
            cell.CellStyle = styles["input_$"];
            cell.SetAsActiveCell();

            row = sheet.CreateRow(4);
            cell = row.CreateCell(2);
            cell.SetCellValue("Annual interest rate");
            cell.CellStyle = styles["item_left"];
            cell = row.CreateCell(4);
            cell.CellStyle = styles["input_%"];

            row = sheet.CreateRow(5);
            cell = row.CreateCell(2);
            cell.SetCellValue("Loan period in years");
            cell.CellStyle = styles["item_left"];
            cell = row.CreateCell(4);
            cell.CellStyle = styles["input_i"];

            row = sheet.CreateRow(6);
            cell = row.CreateCell(2);
            cell.SetCellValue("Start date of loan");
            cell.CellStyle = styles["item_left"];
            cell = row.CreateCell(4);
            cell.CellStyle = styles["input_d"];

            row = sheet.CreateRow(8);
            cell = row.CreateCell(2);
            cell.SetCellValue("Monthly payment");
            cell.CellStyle = styles["item_left"];
            cell = row.CreateCell(4);
            cell.CellFormula = ("IF(Values_Entered,Monthly_Payment,"")");
            cell.CellStyle = styles["formula_$"];

            row = sheet.CreateRow(9);
            cell = row.CreateCell(2);
            cell.SetCellValue("Number of payments");
            cell.CellStyle = styles["item_left"];
            cell = row.CreateCell(4);
            cell.CellFormula = ("IF(Values_Entered,Loan_Years*12,"")");
            cell.CellStyle = styles["formula_i"];

            row = sheet.CreateRow(10);
            cell = row.CreateCell(2);
            cell.SetCellValue("Total interest");
            cell.CellStyle = styles["item_left"];
            cell = row.CreateCell(4);
            cell.CellFormula = ("IF(Values_Entered,Total_Cost-Loan_Amount,"")");
            cell.CellStyle = styles["formula_$"];

            row = sheet.CreateRow(11);
            cell = row.CreateCell(2);
            cell.SetCellValue("Total cost of loan");
            cell.CellStyle = styles["item_left"];
            cell = row.CreateCell(4);
            cell.CellFormula = ("IF(Values_Entered,Monthly_Payment*Number_of_Payments,"")");
            cell.CellStyle = styles["formula_$"];


            WriteToFile();
        }

        /**
         * cell styles used for formatting calendar sheets
        */
        private static Dictionary<String, ICellStyle> CreateStyles(IWorkbook wb)
        {
            Dictionary<String, ICellStyle> styles = new Dictionary<String, ICellStyle>();

            ICellStyle style = null;
            IFont titleFont = wb.CreateFont();
            titleFont.FontHeightInPoints = (short)14;
            titleFont.FontName = "Trebuchet MS";
            style = wb.CreateCellStyle();
            style.SetFont(titleFont);
            style.BorderBottom = BorderStyle.DOTTED;
            style.BottomBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            styles.Add("title", style);

            IFont itemFont = wb.CreateFont();
            itemFont.FontHeightInPoints = (short)9;
            itemFont.FontName = "Trebuchet MS";
            style = wb.CreateCellStyle();
            style.Alignment = (HorizontalAlignment.LEFT);
            style.SetFont(itemFont);
            styles.Add("item_left", style);

            style = wb.CreateCellStyle();
            style.Alignment = HorizontalAlignment.RIGHT;
            style.SetFont(itemFont);
            styles.Add("item_right", style);

            style = wb.CreateCellStyle();
            style.Alignment = HorizontalAlignment.RIGHT;
            style.SetFont(itemFont);
            style.BorderRight = BorderStyle.DOTTED;
            style.RightBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            style.BorderBottom = BorderStyle.DOTTED;
            style.BottomBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            style.BorderLeft = BorderStyle.DOTTED;
            style.LeftBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            style.BorderTop = BorderStyle.DOTTED;
            style.TopBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            style.DataFormat = (wb.CreateDataFormat().GetFormat("_($* #,##0.00_);_($* (#,##0.00);_($* "-"??_);_(@_)"));
            styles.Add("input_$", style);

            style = wb.CreateCellStyle();
            style.Alignment = HorizontalAlignment.RIGHT;
            style.SetFont(itemFont);
            style.BorderRight = BorderStyle.DOTTED;
            style.RightBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            style.BorderBottom = BorderStyle.DOTTED;
            style.BottomBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            style.BorderLeft = BorderStyle.DOTTED;
            style.LeftBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            style.BorderTop = BorderStyle.DOTTED;
            style.TopBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            style.DataFormat = (wb.CreateDataFormat().GetFormat("0.000%"));
            styles.Add("input_%", style);

            style = wb.CreateCellStyle();
            style.Alignment = HorizontalAlignment.RIGHT;
            style.SetFont(itemFont);
            style.BorderRight = BorderStyle.DOTTED;
            style.RightBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            style.BorderBottom = BorderStyle.DOTTED;
            style.BottomBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            style.BorderLeft = BorderStyle.DOTTED;
            style.LeftBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            style.BorderTop = BorderStyle.DOTTED;
            style.TopBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            style.DataFormat = wb.CreateDataFormat().GetFormat("0");
            styles.Add("input_i", style);

            style = wb.CreateCellStyle();
            style.Alignment = (HorizontalAlignment.CENTER);
            style.SetFont(itemFont);
            style.DataFormat = wb.CreateDataFormat().GetFormat("m/d/yy");
            styles.Add("input_d", style);

            style = wb.CreateCellStyle();
            style.Alignment = HorizontalAlignment.RIGHT;
            style.SetFont(itemFont);
            style.BorderRight = BorderStyle.DOTTED;
            style.RightBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            style.BorderBottom = BorderStyle.DOTTED;
            style.BottomBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            style.BorderLeft = BorderStyle.DOTTED;
            style.LeftBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            style.BorderTop = BorderStyle.DOTTED;
            style.TopBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            style.DataFormat = wb.CreateDataFormat().GetFormat("$##,##0.00");
            style.BorderBottom = BorderStyle.DOTTED;
            style.BottomBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            style.FillForegroundColor = IndexedColors.GREY_25_PERCENT.Index;
            style.FillPattern = FillPatternType.SOLID_FOREGROUND;
            styles.Add("formula_$", style);

            style = wb.CreateCellStyle();
            style.Alignment = HorizontalAlignment.RIGHT;
            style.SetFont(itemFont);
            style.BorderRight = BorderStyle.DOTTED;
            style.RightBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            style.BorderBottom = BorderStyle.DOTTED;
            style.BottomBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            style.BorderLeft = BorderStyle.DOTTED;
            style.LeftBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            style.BorderTop = BorderStyle.DOTTED;
            style.TopBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            style.DataFormat = wb.CreateDataFormat().GetFormat("0");
            style.BorderBottom = BorderStyle.DOTTED;
            style.BottomBorderColor = IndexedColors.GREY_40_PERCENT.Index;
            style.FillForegroundColor = IndexedColors.GREY_25_PERCENT.Index;
            style.FillPattern = (FillPatternType.SOLID_FOREGROUND);
            styles.Add("formula_i", style);

            return styles;
        }


        //define named ranges for the inputs and formulas
        public static void CreateNames(IWorkbook wb)
        {
            IName name;

            name = wb.CreateName();
            name.NameName = ("Interest_Rate");
            name.RefersToFormula = ("'Loan Calculator'!$E$5");

            name = wb.CreateName();
            name.NameName = ("Loan_Amount");
            name.RefersToFormula = ("'Loan Calculator'!$E$4");

            name = wb.CreateName();
            name.NameName = ("Loan_Start");
            name.RefersToFormula = ("'Loan Calculator'!$E$7");

            name = wb.CreateName();
            name.NameName = ("Loan_Years");
            name.RefersToFormula = ("'Loan Calculator'!$E$6");

            name = wb.CreateName();
            name.NameName = ("Number_of_Payments");
            name.RefersToFormula = ("'Loan Calculator'!$E$10");

            name = wb.CreateName();
            name.NameName = ("Monthly_Payment");
            name.RefersToFormula = ("-PMT(Interest_Rate/12,Number_of_Payments,Loan_Amount)");

            name = wb.CreateName();
            name.NameName = ("Total_Cost");
            name.RefersToFormula = ("'Loan Calculator'!$E$12");

            name = wb.CreateName();
            name.NameName = ("Total_Interest");
            name.RefersToFormula = ("'Loan Calculator'!$E$11");

            name = wb.CreateName();
            name.NameName = ("Values_Entered");
            name.RefersToFormula = ("IF(ISBLANK(Loan_Start),0,IF(Loan_Amount*Interest_Rate*Loan_Years>0,1,0))");
        }

        #endregion


       /// <summary>
        /// excel中插入图片,支持jpeg
       /// </summary>
       /// <param name="Sheetindex"></param>
       /// <param name="RowIdex"></param>
       /// <param name="CellIndex"></param>
       /// <param name="picpath">图片地址</param>
       /// <param name="dx1">图片坐标</param>
       /// <param name="dy1"></param>
       /// <param name="dx2"></param>
       /// <param name="dy2"></param>
       /// <param name="col1">表格</param>
       /// <param name="row1"></param>
       /// <param name="col2"></param>
       /// <param name="row2"></param>
        public void InsertPicturesInXls(int Sheetindex, int RowIdex, int CellIndex, string picpath
            ,int dx1,int dy1,int dx2,int dy2,int col1,int row1,int col2,int row2)
        {
            InitializeWorkbook();

            ISheet sheet1 = hssfworkbook.GetSheetAt(Sheetindex); 

            HSSFPatriarch patriarch = (HSSFPatriarch)sheet1.CreateDrawingPatriarch(); 
            //create the anchor
            HSSFClientAnchor anchor;
            anchor = new HSSFClientAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2);
            anchor.AnchorType = 2;
            //load the picture and get the picture index in the workbook
            HSSFPicture picture = (HSSFPicture)patriarch.CreatePicture(anchor, LoadImage(picpath, hssfworkbook));
            //Reset the image to the original size.
            //picture.Resize();   //Note: Resize will reset client anchor you set.
            picture.LineStyle = LineStyle.DashDotGel;

            WriteToFile();
        }

        private  int LoadImage(string path, HSSFWorkbook wb)
        {
            FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read);
            byte[] buffer = new byte[file.Length];
            file.Read(buffer, 0, (int)file.Length);
            return wb.AddPicture(buffer, PictureType.JPEG);

        }
        /// <summary>
        /// 隐藏Excel行和列
        /// </summary>
        /// <param name="Sheetindex"></param>
        /// <param name="RowIdex"></param>
        /// <param name="CellIndex"></param>
        /// <param name="isHiddenCol"></param>
        public void HideColumnAndRowInXls (int Sheetindex, int RowIdex, int CellIndex,bool isHiddenCol)
        {
            InitializeWorkbook();

            ISheet s = hssfworkbook.GetSheetAt(Sheetindex);
            IRow r1 = s.GetRow(RowIdex);
          

            //hide IRow 2
            r1.ZeroHeight = true;

            //hide column C
            s.SetColumnHidden(CellIndex, isHiddenCol);

            WriteToFile();
        }
        /// <summary>
        /// 填充背景颜色
        /// </summary>
        /// <param name="Sheetindex"></param>
        /// <param name="RowIdex"></param>
        /// <param name="CellIndex"></param>
        /// <param name="fpt">填充类型</param>
        /// <param name="Forecolor">前景色:NPOI.HSSF.Util.HSSFColor.BLUE.index</param>
        /// <param name="backcolor">背景颜色:NPOI.HSSF.Util.HSSFColor.BLUE.index</param>
        public void FillBackgroundInXls(int Sheetindex, int RowIdex, int CellIndex,FillPatternType fpt,short Forecolor,short backcolor)
        {
            InitializeWorkbook();

            ISheet sheet1 = hssfworkbook.GetSheetAt(Sheetindex);
            //fill background
            ICellStyle style1 = hssfworkbook.CreateCellStyle();
            style1.FillForegroundColor = Forecolor;
            style1.FillPattern = fpt;
            style1.FillBackgroundColor = backcolor;
            sheet1.GetRow(RowIdex).GetCell(CellIndex).CellStyle= style1; 
            WriteToFile();
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="Sheetindex"></param>
        /// <param name="RowIdex"></param>
        /// <param name="CellIndex"></param>
        /// <param name="fontName">字体名</param>
        /// <param name="color">颜色</param>
        /// <param name="istalic">斜体</param>
        /// <param name="IsStrikeout">删除线</param>
        /// <param name="size">字体大小</param>
        public void ApplyFontInXls(int Sheetindex,int RowIdex, int CellIndex, string fontName, short color, bool istalic, bool IsStrikeout,short size)
        { 
            InitializeWorkbook();

            ISheet sheet1 = hssfworkbook.GetSheetAt(Sheetindex);

            //font style1: underlined, italic, red color, fontsize=20
            IFont font1 = hssfworkbook.CreateFont();
            font1.FontName = "宋体";
            font1.Color = HSSFColor.RED.index;
            font1.IsItalic = istalic;
            font1.IsStrikeout = IsStrikeout;
            //font1.Underline = (byte)FontUnderlineType.DOUBLE;
            font1.FontHeightInPoints = size;
            //bind font with style 1

            ICell cell1 = sheet1.GetRow(RowIdex).GetCell(CellIndex);
            ICellStyle style1 = hssfworkbook.CreateCellStyle();
            style1.SetFont(font1);
            cell1.CellStyle = style1;
            WriteToFile();
        }

        /// <summary>
        /// 设置sheet的颜色
        /// </summary>
        /// <param name="Sheetindex"></param>
        /// <param name="RowIdex"></param>
        /// <param name="CellIndex"></param>
        public void ChangeSheetTabColorInXls(int Sheetindex)
        {
            InitializeWorkbook();

            ISheet sheet = hssfworkbook.GetSheetAt(Sheetindex);
            sheet.TabColorIndex = HSSFColor.AQUA.index;

            WriteToFile();
        }


        public  string GetCellValue(int sheetIndex,int rowIndex,int cellIndex)
        {
            InitializeWorkbook();

            ISheet sheet1 = hssfworkbook.GetSheetAt(sheetIndex);

            ICell cell=  sheet1.GetRow(rowIndex).GetCell(cellIndex);

            return  cell.StringCellValue;

        }



        #region 导入导出
        /* 
         * DataTable table = new DataTable();     
         * MemoryStream ms = DataTableRenderToExcel.RenderDataTableToExcel(table) as MemoryStream;
         * Response.AddHeader("Content-Disposition", string.Format("attachment; filename=Download.xls"));
         * Response.BinaryWrite(ms.ToArray());
         * ms.Close();
         * ms.Dispose();
       
         * if (this.fuUpload.HasFile)
         * {
         *       DataTable table = DataTableRenderToExcel.RenderDataTableFromExcel(this.fuUpload.FileContent, 1, 0);
         *       this.gvExcel.DataSource = table;
         *       this.gvExcel.DataBind();
         *  }
         */
        /// <summary>
        /// Datatable导出Excel
        /// </summary>
        /// <param name="SourceTable"></param>
        /// <returns></returns>
        private static Stream RenderDataTableToExcel(DataTable SourceTable)
        {
            HSSFWorkbook workbook = new HSSFWorkbook();
            MemoryStream ms = new MemoryStream();
            ISheet sheet = workbook.CreateSheet();
            IRow headerRow = sheet.CreateRow(0);

            // handling header.
            foreach (DataColumn column in SourceTable.Columns)
                headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);

            // handling value.
            int rowIndex = 1;

            foreach (DataRow row in SourceTable.Rows)
            {
                IRow dataRow = sheet.CreateRow(rowIndex);
                foreach (DataColumn column in SourceTable.Columns)
                {
                    dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
                }

                rowIndex++;
            }

            workbook.Write(ms);
            ms.Flush();
            ms.Position = 0;

            sheet = null;
            headerRow = null;
            workbook = null;

            return ms;
        }
        /// <summary>
        /// Datatable导出Excel
        /// </summary>
        /// <param name="SourceTable"></param>
        /// <param name="FileName"></param>
        public static void RenderDataTableToExcel(DataTable SourceTable, string FileName)
        {
            MemoryStream ms = RenderDataTableToExcel(SourceTable) as MemoryStream;
            FileStream fs = new FileStream(FileName, FileMode.Create, FileAccess.Write);
            byte[] data = ms.ToArray();

            fs.Write(data, 0, data.Length);
            fs.Flush();
            fs.Close();

            data = null;
            ms = null;
            fs = null;
        }
        /// <summary>
        /// 导出excel为Datatable
        /// </summary>
        /// <param name="ExcelFileStream"></param>
        /// <param name="SheetName"></param>
        /// <param name="HeaderRowIndex"></param>
        /// <returns></returns>
        public static DataTable RenderDataTableFromExcel(Stream ExcelFileStream, string SheetName, int HeaderRowIndex)
        {
            HSSFWorkbook workbook = new HSSFWorkbook(ExcelFileStream);
            ISheet sheet = workbook.GetSheet(SheetName);

            DataTable table = new DataTable();

            IRow headerRow = sheet.GetRow(HeaderRowIndex);
            int cellCount = headerRow.LastCellNum;

            for (int i = headerRow.FirstCellNum; i < cellCount; i++)
            {
                DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
                table.Columns.Add(column);
            }

            int rowCount = sheet.LastRowNum;

            for (int i = (sheet.FirstRowNum + 1); i < sheet.LastRowNum; i++)
            {
                IRow row = sheet.GetRow(i);
                DataRow dataRow = table.NewRow();

                for (int j = row.FirstCellNum; j < cellCount; j++)
                    dataRow[j] = row.GetCell(j).ToString();
            }

            ExcelFileStream.Close();
            workbook = null;
            sheet = null;
            return table;
        }
        /// <summary>
        /// 将Excel转换为Datatable
        /// </summary>
        /// <param name="ExcelFileStream"></param>
        /// <param name="SheetIndex"></param>
        /// <param name="HeaderRowIndex"></param>
        /// <returns></returns>
        public static DataTable RenderDataTableFromExcel(Stream ExcelFileStream, int SheetIndex, int HeaderRowIndex)
        {
            HSSFWorkbook workbook = new HSSFWorkbook(ExcelFileStream);
            ISheet sheet = workbook.GetSheetAt(SheetIndex);

            DataTable table = new DataTable();

            IRow headerRow = sheet.GetRow(HeaderRowIndex);
            int cellCount = headerRow.LastCellNum;

            for (int i = headerRow.FirstCellNum; i < cellCount; i++)
            {
                DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
                table.Columns.Add(column);
            }

            int rowCount = sheet.LastRowNum;

            for (int i = (sheet.FirstRowNum + 1); i < sheet.LastRowNum; i++)
            {
                IRow row = sheet.GetRow(i);
                DataRow dataRow = table.NewRow();

                for (int j = row.FirstCellNum; j < cellCount; j++)
                {
                    if (row.GetCell(j) != null)
                        dataRow[j] = row.GetCell(j).ToString();
                }

                table.Rows.Add(dataRow);
            }

            ExcelFileStream.Close();
            workbook = null;
            sheet = null;
            return table;
        }

        #endregion


    }
}
NPOIHelpercel格式及设置 通过NPoI组件操作Excel格式及设置

http://npoi.codeplex.com/

原文地址:https://www.cnblogs.com/weixing/p/5556062.html