GetExcelNpoi.cs

using System;
using System.Collections.Generic;// List
using System.Data;// DataTable
using System.Data.OleDb;// OleDbConnection,OleDbDataAdapter
using System.IO;// FileStream
using System.Text.RegularExpressions;// Regex
using System.Web;// HttpResponse,HttpUtility
using System.Web.UI;// HtmlTextWriter
using System.Web.UI.WebControls;// GridView
using System.Drawing;// Color
using NPOI.HSSF.UserModel;// HSSFWorkbook,HSSFSheet,HSSFRow,HSSFCell
using NPOI.SS.UserModel;// IWorkbook,ISheet,IRow,ICell
using NPOI.SS.Util;// CellRangeAddress

/*/--------------------------------------------------------------------------------//
// GetExcelNpoi 的摘要说明
// Ver 2.3.1.0125 for NPOI 2.0

//--------------------------------------------------------------------------------/*/
public class GetExcelNpoi : System.Web.UI.Page
{
    // 构造函数
    public GetExcelNpoi() { }

    // GridView 导出 Excel
    // 注意: 使用此函数要定义事件 public override void VerifyRenderingInServerForm(Control control){}
    public void ExportExcel(HttpResponse response, GridView gridView, string fileName)
    {
        response.Clear();
        response.Buffer = false;
        response.Charset = "GB2312";
        response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName + ".xls");
        response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
        response.ContentType = "application/ms-excel";
        response.Write("<meta http-equiv=Content-Type content=\"text/html; charset=GB2312\">");
        EnableViewState = false;
        System.IO.StringWriter oStringWriter = new System.IO.StringWriter();
        HtmlTextWriter oHtmlTextWriter = new HtmlTextWriter(oStringWriter);
        gridView.RenderControl(oHtmlTextWriter);
        response.Write(oStringWriter.ToString());
        response.End();
    }

    // 列名转索引
    public static int ColumnNameToIndex(string columnName)
    {
        int index = 0;
        if (!Regex.IsMatch(columnName, @"^[A-Za-z]+$"))
        {
            return -1;
        }
        char[] chars = columnName.ToUpper().ToCharArray();
        for (int i = 0; i < chars.Length; i++)
        {
            index += ((int)chars[i] - (int)'A' + 1) * (int)Math.Pow(26, chars.Length - i - 1);
        }
        return index - 1;
    }

    // 列索引转名
    public static string ColumnIndexToName(int columnIndex)
    {
        if (columnIndex < 0) return "";
        List<string> chars = new List<string>();
        do
        {
            if (chars.Count > 0) columnIndex--;
            chars.Insert(0, ((char)(columnIndex % 26 + (int)'A')).ToString());
            columnIndex = (int)((columnIndex - columnIndex % 26) / 26);
        }
        while (columnIndex > 0);
        return String.Join(string.Empty, chars.ToArray());
    }

    // 颜色索引转颜色对象
    public Color ColorIndexToObject(short index)
    {
        Color result = Color.Empty;
        switch (index)
        {
            case 49:
                result = Color.Aqua;
                break;
            case 8:
                result = Color.Black;
                break;
            case 12:
                result = Color.Blue;
                break;
            case 60:
                result = Color.Brown;
                break;
            case 29:
                result = Color.Coral;
                break;
            case 24:
                result = Color.CornflowerBlue;
                break;
            case 18:
                result = Color.DarkBlue;
                break;
            case 58:
                result = Color.DarkGreen;
                break;
            case 16:
                result = Color.DarkRed;
                break;
            case 51:
                result = Color.Gold;
                break;
            case 17:
                result = Color.Green;
                break;
            case 62:
                result = Color.Indigo;
                break;
            case 46:
                result = Color.Lavender;
                break;
            case 26:
                result = Color.LemonChiffon;
                break;
            case 48:
                result = Color.LightBlue;
                break;
            case 42:
                result = Color.LightGreen;
                break;
            case 43:
                result = Color.LightYellow;
                break;
            case 50:
                result = Color.Lime;
                break;
            case 25:
                result = Color.Maroon;
                break;
            case 53:
                result = Color.Orange;
                break;
            case 28:
                result = Color.Orchid;
                break;
            case 14:
                result = Color.Pink;
                break;
            case 61:
                result = Color.Plum;
                break;
            case 10:
                result = Color.Red;
                break;
            case 30:
                result = Color.RoyalBlue;
                break;
            case 57:
                result = Color.SeaGreen;
                break;
            case 40:
                result = Color.SkyBlue;
                break;
            case 47:
                result = Color.Tan;
                break;
            case 21:
                result = Color.Teal;
                break;
            case 15:
                result = Color.Turquoise;
                break;
            case 20:
                result = Color.Violet;
                break;
            case 13:
                result = Color.Yellow;
                break;
            case 9:
            case 64:// 自动色
                result = Color.White;
                break;
        }
        return result;
    }

    // 从Excel导出到DataSet
    public DataSet GetDataSet(string filePath, string sheetName)
    {
        DataSet ds = new DataSet();
        string strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1';";
        try
        {
            OleDbConnection objConn = new OleDbConnection(strConnect);
            OleDbDataAdapter objDA = new OleDbDataAdapter("select * from [" + sheetName + "$]", strConnect);
            objConn.Open();
            objDA.Fill(ds, sheetName + "$");
            objConn.Close();
        }
        catch
        {
        }
        return ds;
    }

    // 从Excel导出到DataSet
    public DataSet GetDataSet(string filePath, int sheetIndex)
    {
        DataSet ds = new DataSet();
        string strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1';";
        try
        {
            FileStream fs = File.Open(filePath, FileMode.Open);
            HSSFWorkbook wb = new HSSFWorkbook(fs);
            fs.Close();
            string sheetName = wb.GetSheetName(sheetIndex);
            OleDbConnection objConn = new OleDbConnection(strConnect);
            OleDbDataAdapter objDA = new OleDbDataAdapter("select * from [" + sheetName + "$]", strConnect);
            objConn.Open();
            objDA.Fill(ds, sheetName + "$");
            objConn.Close();
        }
        catch
        {
        }
        return ds;
    }

    // 从Excel导出到DataTable重载
    public System.Data.DataTable GetDataTable(string filePath, string sheetName)
    {
        System.Data.DataTable dt = new System.Data.DataTable();
        string strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1';";
        try
        {
            OleDbConnection objConn = new OleDbConnection(strConnect);
            OleDbDataAdapter objDA = new OleDbDataAdapter("select * from [" + sheetName + "$]", strConnect);
            objConn.Open();
            objDA.Fill(dt);
            objConn.Close();
        }
        catch
        {
        }
        return dt;
    }

    // 从Excel导出到DataTable重载
    public System.Data.DataTable GetDataTable(string filePath, int sheetIndex)
    {
        System.Data.DataTable dt = new System.Data.DataTable();
        string strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1';";
        try
        {
            FileStream fs = File.Open(filePath, FileMode.Open);
            HSSFWorkbook wb = new HSSFWorkbook(fs);
            fs.Close();
            string sheetName = wb.GetSheetName(sheetIndex);
            OleDbConnection objConn = new OleDbConnection(strConnect);
            OleDbDataAdapter objDA = new OleDbDataAdapter("select * from [" + sheetName + "$]", strConnect);
            objConn.Open();
            objDA.Fill(dt);
            objConn.Close();
        }
        catch
        {
        }
        return dt;
    }

    // 创建工作簿
    public HSSFWorkbook Create()
    {
        HSSFWorkbook wb = new HSSFWorkbook();
        return wb;
    }

    // 打开工作簿
    public HSSFWorkbook Open(string filePath)
    {
        FileStream fs = File.Open(filePath, FileMode.Open);
        HSSFWorkbook wb = new HSSFWorkbook(fs);
        fs.Close();
        return wb;
    }

    // 保存工作簿
    public void Save(HSSFWorkbook workbook, string filePath)
    {
        FileStream fs = File.Open(filePath, FileMode.OpenOrCreate);
        workbook.Write(fs);
        fs.Close();
    }

    // 创建表单
    public ISheet CreateSheet(HSSFWorkbook workbook, string sheetName)
    {
        return workbook.CreateSheet(sheetName);
    }

    // 打开表单重载
    public ISheet OpenSheet(HSSFWorkbook workbook, string sheetName)
    {
        int index = workbook.GetSheetIndex(sheetName);
        return index >= 0 ? workbook.GetSheetAt(index) : null;
    }

    // 打开表单重载
    public ISheet OpenSheet(HSSFWorkbook workbook, int sheetIndex)
    {
        int index = sheetIndex;
        return index >= 0 ? workbook.GetSheetAt(index) : null;
    }

    // 获取表单对象重载
    public ISheet GetSheet(string filePath, string sheetName)
    {
        FileStream fs = File.Open(filePath, FileMode.Open);
        HSSFWorkbook wb = new HSSFWorkbook(fs);
        fs.Close();
        int index = wb.GetSheetIndex(sheetName);
        return wb.GetSheetAt(index);
    }

    // 获取表单对象重载
    public ISheet GetSheet(string filePath, int sheetIndex)
    {
        FileStream fs = File.Open(filePath, FileMode.Open);
        HSSFWorkbook wb = new HSSFWorkbook(fs);
        fs.Close();
        int index = sheetIndex;
        return wb.GetSheetAt(index);
    }

    // 获取指定索引表单名
    public string GetSheetName(HSSFWorkbook workbook, int sheetIndex)
    {
        return workbook.GetSheetName(sheetIndex);
    }

    // 获取指定表单名索引
    public int GetSheetIndex(HSSFWorkbook workbook, string sheetName)
    {
        return workbook.GetSheetIndex(sheetName);
    }

    // 统计表单数
    public int CountSheet(HSSFWorkbook workbook)
    {
        return workbook.NumberOfSheets;
    }

    // 统计行数
    public int CountRow(ISheet sheet)
    {
        int result = sheet.LastRowNum;
        return result + 1;
    }

    // 统计列数
    public int CountColumn(ISheet sheet)
    {
        int result = 0;
        int rowCount = sheet.LastRowNum;
        for (int i = 0; i <= rowCount; i++)
        {
            try
            {
                int colCount = sheet.GetRow(i).LastCellNum;
                result = colCount > result ? colCount : result;
            }
            catch
            {
            }
        }
        return result;
    }

    // 获取单元格数据类型
    public string GetCellDataType(ISheet sheet, int rowNum, int colNum)
    {
        string result = "";
        if ((rowNum < 1) || (colNum < 1)) return result;
        int rowIndex = rowNum - 1;
        int colIndex = colNum - 1;
        try
        {
            ICell cell = sheet.GetRow(rowIndex).GetCell(colIndex);
            result = cell.CellType.ToString();
        }
        catch
        {
        }
        return result;
    }

    // 读取单元格重载
    public string ReadCell(ISheet sheet, int rowNum, int colNum)
    {
        string result = "";
        if ((rowNum < 1) || (colNum < 1)) return result;
        int rowIndex = rowNum - 1;
        int colIndex = colNum - 1;
        try
        {
            ICell cell = sheet.GetRow(rowIndex).GetCell(colIndex);
            if (cell.IsMergedCell)
            {
                int regionsCount = sheet.NumMergedRegions;
                for (int i = 0; i < regionsCount; i++)
                {
                    CellRangeAddress range = sheet.GetMergedRegion(i);
                    sheet.IsMergedRegion(range);
                    if (range.FirstRow <= rowIndex && rowIndex <= range.LastRow && range.FirstColumn <= colIndex && colIndex <= range.LastColumn)
                    {
                        cell = sheet.GetRow(range.FirstRow).GetCell(range.FirstColumn);
                        break;
                    }
                }
            }
            result = cell.ToString();
        }
        catch
        {
        }
        return result;
    }

    // 读取单元格重载
    public string ReadCell(ISheet sheet, int rowNum, int colNum, string dataFormat)
    {
        string result = "";
        if ((rowNum < 1) || (colNum < 1)) return result;
        int rowIndex = rowNum - 1;
        int colIndex = colNum - 1;
        try
        {
            ICell cell = sheet.GetRow(rowIndex).GetCell(colIndex);
            if (cell.IsMergedCell)
            {
                int regionsCount = sheet.NumMergedRegions;
                for (int i = 0; i < regionsCount; i++)
                {
                    CellRangeAddress range = sheet.GetMergedRegion(i);
                    sheet.IsMergedRegion(range);
                    if (range.FirstRow <= rowIndex && rowIndex <= range.LastRow && range.FirstColumn <= colIndex && colIndex <= range.LastColumn)
                    {
                        cell = sheet.GetRow(range.FirstRow).GetCell(range.FirstColumn);
                        break;
                    }
                }
            }
            short data = cell.CellStyle.DataFormat;
            cell.CellStyle.DataFormat = sheet.Workbook.CreateDataFormat().GetFormat(dataFormat);
            result = cell.ToString();
            cell.CellStyle.DataFormat = data;
        }
        catch
        {
        }
        return result;
    }

    // 写入单元格重载
    public bool WriteCell(ISheet sheet, int rowNum, int colNum, object value)
    {
        bool result = false;
        if ((rowNum < 1) || (colNum < 1)) return result;
        int rowIndex = rowNum - 1;
        int colIndex = colNum - 1;
        int physicalRowNum = sheet.PhysicalNumberOfRows;
        if (rowNum > physicalRowNum)
        {
            for (int i = physicalRowNum; i <= rowIndex; i++)
            {
                sheet.CreateRow(i);
            }
        }
        int physicalColNum = sheet.GetRow(rowIndex).PhysicalNumberOfCells;
        if (colNum > physicalColNum)
        {
            for (int i = physicalColNum; i <= colIndex; i++)
            {
                sheet.GetRow(rowIndex).CreateCell(i);
            }
        }
        try
        {
            ICell cell = sheet.GetRow(rowIndex).GetCell(colIndex);
            if (cell.IsMergedCell)
            {
                int regionsCount = sheet.NumMergedRegions;
                for (int i = 0; i < regionsCount; i++)
                {
                    CellRangeAddress range = sheet.GetMergedRegion(i);
                    sheet.IsMergedRegion(range);
                    if (range.FirstRow <= rowIndex && rowIndex <= range.LastRow && range.FirstColumn <= colIndex && colIndex <= range.LastColumn)
                    {
                        cell = sheet.GetRow(range.FirstRow).GetCell(range.FirstColumn);
                        break;
                    }
                }
            }
            result = true;
            switch (value.GetType().ToString())
            {
                case "System.Boolean":
                    cell.SetCellValue((bool)value);
                    break;
                case "System.DateTime":
                    cell.SetCellValue((DateTime)value);
                    break;
                case "System.Double":
                    cell.SetCellValue((double)value);
                    break;
                case "System.String":
                    cell.SetCellValue((string)value);
                    break;
                case "System.Int16":
                    cell.SetCellValue((short)value);
                    break;
                case "System.Int32":
                    cell.SetCellValue((int)value);
                    break;
                case "NPOI.HSSF.UserModel.HSSFRichTextString":
                    cell.SetCellValue((IRichTextString)value);
                    break;
                default:
                    result = false;
                    break;
            }
        }
        catch
        {
        }
        return result;
    }

    // 写入单元格重载
    public bool WriteCell(ISheet sheet, int rowNum, int colNum, object value, string dataFormat)
    {
        bool result = false;
        if ((rowNum < 1) || (colNum < 1)) return result;
        int rowIndex = rowNum - 1;
        int colIndex = colNum - 1;
        int physicalRowNum = sheet.PhysicalNumberOfRows;
        if (rowNum > physicalRowNum)
        {
            for (int i = physicalRowNum; i <= rowIndex; i++)
            {
                sheet.CreateRow(i);
            }
        }
        int physicalColNum = sheet.GetRow(rowIndex).PhysicalNumberOfCells;
        if (colNum > physicalColNum)
        {
            for (int i = physicalColNum; i <= colIndex; i++)
            {
                sheet.GetRow(rowIndex).CreateCell(i);
            }
        }
        try
        {
            ICell cell = sheet.GetRow(rowIndex).GetCell(colIndex);
            if (cell.IsMergedCell)
            {
                int regionsCount = sheet.NumMergedRegions;
                for (int i = 0; i < regionsCount; i++)
                {
                    CellRangeAddress range = sheet.GetMergedRegion(i);
                    sheet.IsMergedRegion(range);
                    if (range.FirstRow <= rowIndex && rowIndex <= range.LastRow && range.FirstColumn <= colIndex && colIndex <= range.LastColumn)
                    {
                        cell = sheet.GetRow(range.FirstRow).GetCell(range.FirstColumn);
                        break;
                    }
                }
            }
            result = true;
            switch (value.GetType().ToString())
            {
                case "System.Boolean":
                    cell.SetCellValue((bool)value);
                    break;
                case "System.DateTime":
                    cell.SetCellValue((DateTime)value);
                    break;
                case "System.Double":
                    cell.SetCellValue((double)value);
                    break;
                case "System.String":
                    cell.SetCellValue((string)value);
                    break;
                case "System.Int16":
                    cell.SetCellValue((short)value);
                    break;
                case "System.Int32":
                    cell.SetCellValue((int)value);
                    break;
                case "NPOI.HSSF.UserModel.HSSFRichTextString":
                    cell.SetCellValue((IRichTextString)value);
                    break;
                default:
                    result = false;
                    break;
            }
            cell.CellStyle.DataFormat = sheet.Workbook.CreateDataFormat().GetFormat(dataFormat);
            cell.SetCellValue(cell.ToString());
        }
        catch
        {
        }
        return result;
    }

    // 读取公式
    public string ReadFormula(ISheet sheet, int rowNum, int colNum)
    {
        string result = "";
        if ((rowNum < 1) || (colNum < 1)) return result;
        int rowIndex = rowNum - 1;
        int colIndex = colNum - 1;
        int physicalRowNum = sheet.PhysicalNumberOfRows;
        if (rowNum > physicalRowNum)
        {
            for (int i = physicalRowNum; i <= rowIndex; i++)
            {
                sheet.CreateRow(i);
            }
        }
        int physicalColNum = sheet.GetRow(rowIndex).PhysicalNumberOfCells;
        if (colNum > physicalColNum)
        {
            for (int i = physicalColNum; i <= colIndex; i++)
            {
                sheet.GetRow(rowIndex).CreateCell(i);
            }
        }
        try
        {
            ICell cell = sheet.GetRow(rowIndex).GetCell(colIndex);
            if (cell.IsMergedCell)
            {
                int regionsCount = sheet.NumMergedRegions;
                for (int i = 0; i < regionsCount; i++)
                {
                    CellRangeAddress range = sheet.GetMergedRegion(i);
                    sheet.IsMergedRegion(range);
                    if (range.FirstRow <= rowIndex && rowIndex <= range.LastRow && range.FirstColumn <= colIndex && colIndex <= range.LastColumn)
                    {
                        cell = sheet.GetRow(range.FirstRow).GetCell(range.FirstColumn);
                        break;
                    }
                }
            }
            result = cell.NumericCellValue.ToString();
        }
        catch
        {
        }
        return result;
    }

    // 写入公式
    public bool WriteFormula(ISheet sheet, int rowNum, int colNum, string formulaText, ICellStyle cellStyle)
    {
        bool result = false;
        if ((rowNum < 1) || (colNum < 1)) return result;
        int rowIndex = rowNum - 1;
        int colIndex = colNum - 1;
        int physicalRowNum = sheet.PhysicalNumberOfRows;
        if (rowNum > physicalRowNum)
        {
            for (int i = physicalRowNum; i <= rowIndex; i++)
            {
                sheet.CreateRow(i);
            }
        }
        int physicalColNum = sheet.GetRow(rowIndex).PhysicalNumberOfCells;
        if (colNum > physicalColNum)
        {
            for (int i = physicalColNum; i <= colIndex; i++)
            {
                sheet.GetRow(rowIndex).CreateCell(i);
            }
        }
        try
        {
            ICell cell = sheet.GetRow(rowIndex).GetCell(colIndex);
            if (cell.IsMergedCell)
            {
                int regionsCount = sheet.NumMergedRegions;
                for (int i = 0; i < regionsCount; i++)
                {
                    CellRangeAddress range = sheet.GetMergedRegion(i);
                    sheet.IsMergedRegion(range);
                    if (range.FirstRow <= rowIndex && rowIndex <= range.LastRow && range.FirstColumn <= colIndex && colIndex <= range.LastColumn)
                    {
                        ((HSSFSheet)sheet).SetBorderTopOfRegion(range, cellStyle.BorderTop, cellStyle.TopBorderColor);
                        ((HSSFSheet)sheet).SetBorderBottomOfRegion(range, cellStyle.BorderBottom, cellStyle.BottomBorderColor);
                        ((HSSFSheet)sheet).SetBorderLeftOfRegion(range, cellStyle.BorderLeft, cellStyle.LeftBorderColor);
                        ((HSSFSheet)sheet).SetBorderRightOfRegion(range, cellStyle.BorderRight, cellStyle.RightBorderColor);
                        cell = sheet.GetRow(range.FirstRow).GetCell(range.FirstColumn);
                        break;
                    }
                }
            }
            cell.SetCellFormula(formulaText);
            sheet.ForceFormulaRecalculation = true;
            cell.CellStyle = cellStyle;
            result = true;
        }
        catch
        {
        }
        return result;
    }

    // 写入富文本
    // 在文本中上标符号为 ^ 下标符号为 _ 结束符号为 ! ,任何上下标必须以结束符作为结尾,如"x^3!+y_1!^2!=z_3!"
    public bool WriteRichText(ISheet sheet, int rowNum, int colNum, string richFormat)
    {
        bool result = false;
        if ((rowNum < 1) || (colNum < 1)) return result;
        int rowIndex = rowNum - 1;
        int colIndex = colNum - 1;
        int physicalRowNum = sheet.PhysicalNumberOfRows;
        if (rowNum > physicalRowNum)
        {
            for (int i = physicalRowNum; i <= rowIndex; i++)
            {
                sheet.CreateRow(i);
            }
        }
        int physicalColNum = sheet.GetRow(rowIndex).PhysicalNumberOfCells;
        if (colNum > physicalColNum)
        {
            for (int i = physicalColNum; i <= colIndex; i++)
            {
                sheet.GetRow(rowIndex).CreateCell(i);
            }
        }
        try
        {
            ICell cell = sheet.GetRow(rowIndex).GetCell(colIndex);
            if (cell.IsMergedCell)
            {
                int regionsCount = sheet.NumMergedRegions;
                for (int i = 0; i < regionsCount; i++)
                {
                    CellRangeAddress range = sheet.GetMergedRegion(i);
                    sheet.IsMergedRegion(range);
                    if (range.FirstRow <= rowIndex && rowIndex <= range.LastRow && range.FirstColumn <= colIndex && colIndex <= range.LastColumn)
                    {
                        cell = sheet.GetRow(range.FirstRow).GetCell(range.FirstColumn);
                        break;
                    }
                }
            }
            // 创建上标字体
            HSSFFont superFont = (HSSFFont)sheet.Workbook.CreateFont();
            superFont.TypeOffset = NPOI.SS.UserModel.FontSuperScript.Super;
            // 创建下标字体
            HSSFFont subFont = (HSSFFont)sheet.Workbook.CreateFont();
            subFont.TypeOffset = NPOI.SS.UserModel.FontSuperScript.Sub;
            // 处理文本格式
            string trimText = richFormat;
            trimText = trimText.Replace("^", "");// 上标符
            trimText = trimText.Replace("_", "");// 下标符
            trimText = trimText.Replace("!", "");// 结束符
            HSSFRichTextString richText = new HSSFRichTextString(trimText);
            int offset = 0;
            while (richFormat.IndexOf('!') != -1)
            {
                int superIndex = richFormat.IndexOf('^');
                int subIndex = richFormat.IndexOf('_');
                int endFlag = richFormat.IndexOf('!');
                if (superIndex != -1 && superIndex < endFlag)
                {// 处理上标
                    int start = superIndex + offset;
                    offset += endFlag - 1;
                    richText.ApplyFont(start, offset, superFont);
                }
                else if (subIndex != -1 && subIndex < endFlag)
                {// 处理下标
                    int start = subIndex + offset;
                    offset += endFlag - 1;
                    richText.ApplyFont(start, offset, subFont);
                }
                richFormat = richFormat.Substring(endFlag + 1);
            }
            cell.SetCellValue(richText);
            result = true;
        }
        catch
        {
        }
        return result;
    }

    // 判断合并单元格
    public bool IsMergeCell(ISheet sheet, int rowNum, int colNum)
    {
        bool result = false;
        if ((rowNum < 1) || (colNum < 1)) return result;
        try
        {
            int rowIndex = rowNum - 1;
            int colIndex = colNum - 1;
            result = sheet.GetRow(rowIndex).GetCell(colIndex).IsMergedCell;
        }
        catch
        {
        }
        return result;
    }

    // 获取单元格信息
    // 调用时要在输出变量前加 out
    public void GetCellInfo(ISheet sheet, int rowNum, int colNum, out int rowSpan, out int colSpan, out bool isMerged, out bool isHeader)
    {
        rowSpan = 0;
        colSpan = 0;
        isMerged = false;
        isHeader = false;
        if ((rowNum < 1) || (colNum < 1)) return;
        try
        {
            int rowIndex = rowNum - 1;
            int colIndex = colNum - 1;
            rowSpan = 1;
            colSpan = 1;
            isMerged = sheet.GetRow(rowIndex).GetCell(colIndex).IsMergedCell;
            if (isMerged == false)
            {
                isHeader = true;
            }
            else
            {
                for (int i = 0; i < sheet.NumMergedRegions; i++)
                {
                    CellRangeAddress range = sheet.GetMergedRegion(i);
                    if (range.FirstRow == rowIndex && range.FirstColumn == colIndex)
                    {
                        rowSpan = range.LastRow - range.FirstRow + 1;
                        colSpan = range.LastColumn - range.FirstColumn + 1;
                        isHeader = true;
                        break;
                    }
                }
            }
        }
        catch
        {
        }
    }

    // 设置合并单元格
    // rowSpan 行跨度,colSpan 列跨度,最小值为1
    public bool SetMergeCell(ISheet sheet, int rowNum, int colNum, int rowSpan, int colSpan)
    {
        bool result = false;
        if ((rowNum < 1) || (colNum < 1)) return result;
        int rowIndex = rowNum - 1;
        int colIndex = colNum - 1;
        int rowSpanIndex = (rowSpan < 1 ? 1 : rowSpan) - 1;
        int colSpanIndex = (colSpan < 1 ? 1 : colSpan) - 1;
        try
        {
            if (0 <= sheet.AddMergedRegion(new CellRangeAddress(rowIndex, rowIndex + rowSpanIndex, colIndex, colIndex + colSpanIndex)))
            {
                result = true;
            }
        }
        catch
        {
        }
        return result;
    }

    // 撤销合并单元格
    public bool UndoMergeCell(ISheet sheet, int rowNum, int colNum)
    {
        bool result = false;
        if ((rowNum < 1) || (colNum < 1)) return result;
        int rowIndex = rowNum - 1;
        int colIndex = colNum - 1;
        try
        {
            ICell cell = sheet.GetRow(rowIndex).GetCell(colIndex);
            if (cell.IsMergedCell)
            {
                int regionsCount = sheet.NumMergedRegions;
                for (int i = 0; i < regionsCount; i++)
                {
                    CellRangeAddress range = sheet.GetMergedRegion(i);
                    sheet.IsMergedRegion(range);
                    if (range.FirstRow <= rowIndex && rowIndex <= range.LastRow && range.FirstColumn <= colIndex && colIndex <= range.LastColumn)
                    {
                        ((HSSFSheet)sheet).SetBorderTopOfRegion(range, NPOI.SS.UserModel.BorderStyle.None, NPOI.HSSF.Util.HSSFColor.Automatic.Index);
                        ((HSSFSheet)sheet).SetBorderBottomOfRegion(range, NPOI.SS.UserModel.BorderStyle.None, NPOI.HSSF.Util.HSSFColor.Automatic.Index);
                        ((HSSFSheet)sheet).SetBorderLeftOfRegion(range, NPOI.SS.UserModel.BorderStyle.None, NPOI.HSSF.Util.HSSFColor.Automatic.Index);
                        ((HSSFSheet)sheet).SetBorderRightOfRegion(range, NPOI.SS.UserModel.BorderStyle.None, NPOI.HSSF.Util.HSSFColor.Automatic.Index);
                        sheet.RemoveMergedRegion(i);
                        cell.CellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.None;
                        cell.CellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.None;
                        cell.CellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.None;
                        cell.CellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.None;
                        cell.CellStyle.TopBorderColor = NPOI.HSSF.Util.HSSFColor.Automatic.Index;
                        cell.CellStyle.BottomBorderColor = NPOI.HSSF.Util.HSSFColor.Automatic.Index;
                        cell.CellStyle.LeftBorderColor = NPOI.HSSF.Util.HSSFColor.Automatic.Index;
                        cell.CellStyle.RightBorderColor = NPOI.HSSF.Util.HSSFColor.Automatic.Index;
                        cell.CellStyle.FillPattern = FillPattern.NoFill;
                        cell.CellStyle.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Automatic.Index;
                        cell.CellStyle.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.Automatic.Index;
                        result = true;
                        break;
                    }
                }
            }
        }
        catch
        {
        }
        return result;
    }

    // 设置行高
    public void SetRowHeight(ISheet sheet, int rowNum, int value)
    {
        if (rowNum < 1) return;
        int rowIndex = rowNum - 1;
        int physicalRowNum = sheet.PhysicalNumberOfRows;
        if (rowNum > physicalRowNum)
        {
            for (int i = physicalRowNum; i <= rowIndex; i++)
            {
                sheet.CreateRow(i);
            }
        }
        sheet.GetRow(rowIndex).Height = (short)(value * 20);
    }

    // 设置列宽
    // value = 0 时自动列宽
    public void SetColumnWidth(ISheet sheet, int colNum, int value)
    {
        if (colNum < 1) return;
        int colIndex = colNum - 1;
        if (1 > sheet.PhysicalNumberOfRows)
        {
            sheet.CreateRow(0);
        }
        int physicalColNum = sheet.GetRow(0).PhysicalNumberOfCells;
        if (colNum > physicalColNum)
        {
            for (int i = physicalColNum; i <= colIndex; i++)
            {
                sheet.GetRow(0).CreateCell(i);
            }
        }
        if (value == 0)
        {
            sheet.AutoSizeColumn(colNum);
        }
        else
        {
            sheet.SetColumnWidth(colIndex, (int)((value + 0.72) * 256));
        }
    }

    // 读取行高
    public int GetRowHeight(ISheet sheet, int rowNum)
    {
        int result = -1;
        if (rowNum < 1) return result;
        int rowIndex = rowNum - 1;
        result = sheet.GetRow(rowIndex).Height;
        return (int)result / 20;
    }

    // 读取列宽
    public int GetColumnWidth(ISheet sheet, int colNum)
    {
        int result = -1;
        if (colNum < 1) return result;
        int colIndex = colNum - 1;
        result = sheet.GetColumnWidth(colIndex);
        return (int)(result - 0.72) / 256;
    }

    // 获取单元格样式
    public ICellStyle GetCellStyle(ISheet sheet, int rowNum, int colNum)
    {
        ICellStyle result = null;
        if ((rowNum < 1) || (colNum < 1)) return result;
        int rowIndex = rowNum - 1;
        int colIndex = colNum - 1;
        int physicalRowNum = sheet.PhysicalNumberOfRows;
        if (rowNum > physicalRowNum)
        {
            for (int i = physicalRowNum; i <= rowIndex; i++)
            {
                sheet.CreateRow(i);
            }
        }
        int physicalColNum = sheet.GetRow(rowIndex).PhysicalNumberOfCells;
        if (colNum > physicalColNum)
        {
            for (int i = physicalColNum; i <= colIndex; i++)
            {
                sheet.GetRow(rowIndex).CreateCell(i);
            }
        }
        try
        {
            ICell cell = sheet.GetRow(rowIndex).GetCell(colIndex);
            result = cell.CellStyle;
        }
        catch
        {
        }
        return result;
    }

    // 设置单元格样式
    public ICellStyle SetCellStyle(ISheet sheet, int rowNum, int colNum, ICellStyle cellStyle)
    {
        ICellStyle result = null;
        if ((rowNum < 1) || (colNum < 1)) return result;
        int rowIndex = rowNum - 1;
        int colIndex = colNum - 1;
        int physicalRowNum = sheet.PhysicalNumberOfRows;
        if (rowNum > physicalRowNum)
        {
            for (int i = physicalRowNum; i <= rowIndex; i++)
            {
                sheet.CreateRow(i);
            }
        }
        int physicalColNum = sheet.GetRow(rowIndex).PhysicalNumberOfCells;
        if (colNum > physicalColNum)
        {
            for (int i = physicalColNum; i <= colIndex; i++)
            {
                sheet.GetRow(rowIndex).CreateCell(i);
            }
        }
        try
        {
            ICell cell = sheet.GetRow(rowIndex).GetCell(colIndex);
            if (cell.IsMergedCell)
            {
                int regionsCount = sheet.NumMergedRegions;
                for (int i = 0; i < regionsCount; i++)
                {
                    CellRangeAddress range = sheet.GetMergedRegion(i);
                    sheet.IsMergedRegion(range);
                    if (range.FirstRow <= rowIndex && rowIndex <= range.LastRow && range.FirstColumn <= colIndex && colIndex <= range.LastColumn)
                    {
                        ((HSSFSheet)sheet).SetBorderTopOfRegion(range, cellStyle.BorderTop, cellStyle.TopBorderColor);
                        ((HSSFSheet)sheet).SetBorderBottomOfRegion(range, cellStyle.BorderBottom, cellStyle.BottomBorderColor);
                        ((HSSFSheet)sheet).SetBorderLeftOfRegion(range, cellStyle.BorderLeft, cellStyle.LeftBorderColor);
                        ((HSSFSheet)sheet).SetBorderRightOfRegion(range, cellStyle.BorderRight, cellStyle.RightBorderColor);
                        cell = sheet.GetRow(range.FirstRow).GetCell(range.FirstColumn);
                        break;
                    }
                }
            }
            cell.CellStyle = cellStyle;
            result = cell.CellStyle;
        }
        catch
        {
        }
        return result;
    }

    // 新建样式重载
    public ICellStyle NewStyle(HSSFWorkbook workbook)
    {
        ICellStyle style = workbook.CreateCellStyle();
        return style;
    }

    // 新建样式重载
    // 日期: 			yyyy/MM/dd
    // 数字: 			0.00
    // 百分比: 			0.00%
    // 科学计数法( + ):	0.00E + 00
    // 科学计数法(-):	0.00E-00
    // 中文数字大写		[DbNum2][$-804]0
    public ICellStyle NewStyle(HSSFWorkbook workbook, string dataFormat)
    {
        ICellStyle style = workbook.CreateCellStyle();
        IDataFormat format = workbook.CreateDataFormat();
        style.DataFormat = format.GetFormat(dataFormat);
        return style;
    }

    // 新建字体
    // fontFamily = {"宋体"|"黑体"|"楷体"|"Tahoma"|"Times New Roman"|...}
    // fontColor = NPOI.HSSF.Util.HSSFColor.{Automatic|Black|Blue|DarkBlue|...}.Index
    // underlineType = FontUnderlineType.{None|Single|Double|SingleAccounting|DoubleAccounting}
    public IFont NewFont(HSSFWorkbook workbook, string fontFamily, short fontColor, int fontSize, bool isBold, bool isItalic, FontUnderlineType underlineType)
    {
        IFont font = workbook.CreateFont();
        font.FontName = fontFamily;// 字体名称
        font.Color = fontColor;// 字体颜色
        font.FontHeightInPoints = (short)fontSize;// 字体大小
        if (isBold) font.Boldweight = (short)FontBoldWeight.Bold;//加粗
        font.IsItalic = isItalic;// 斜体
        font.Underline = underlineType;// 下划线
        return font;
    }

    // 设置字体样式
    public ICellStyle SetFont(ICellStyle cellStyle, IFont cellFont)
    {
        cellStyle.SetFont(cellFont);
        return cellStyle;
    }

    // 设置数据格式
    public ICellStyle SetFormat(ICellStyle cellStyle, HSSFWorkbook workbook, string dataFormat)
    {
        IDataFormat format = workbook.CreateDataFormat();
        cellStyle.DataFormat = format.GetFormat(dataFormat);
        return cellStyle;
    }

    // 设置对齐样式
    // horizPos = 0常规,1靠左,2居中,3靠右,4填充,5两端,6跨列,7分散
    // vertiPos = 0靠上,1居中,2靠下,3两端,4分散
    public ICellStyle SetAlign(ICellStyle cellStyle, int horizPos, int vertiPos, bool isWrap)
    {
        horizPos = horizPos < 0 ? 0 : horizPos;
        vertiPos = vertiPos < 0 ? 0 : vertiPos;
        ((HSSFCellStyle)cellStyle).Alignment = (HorizontalAlignment)(horizPos % 8);// 水平对齐
        ((HSSFCellStyle)cellStyle).VerticalAlignment = (VerticalAlignment)(vertiPos % 5);// 垂直对齐
        ((HSSFCellStyle)cellStyle).WrapText = isWrap;
        return cellStyle;
    }

    // 设置边框颜色
    // topColor|bottomColor|leftColor|rightColor = NPOI.HSSF.Util.HSSFColor.{Automatic|White|Black|Blue|Green|...}.Index
    public ICellStyle SetBorderColor(ICellStyle cellStyle, short topColor, short bottomColor, short leftColor, short rightColor)
    {
        cellStyle.TopBorderColor = topColor;
        cellStyle.BottomBorderColor = bottomColor;
        cellStyle.LeftBorderColor = leftColor;
        cellStyle.RightBorderColor = rightColor;
        return cellStyle;
    }

    // 设置边框样式
    // topBorder|bottomBorder|leftBorder|rightBorder = BorderStyle.{None|Thin|Medium|Dashed|Dotted|Thick|Double|Hair|MediumDashed|DashDot|MediumDashDot|DashDotDot|MediumDashDotDot|SlantedDashDot}
    public ICellStyle SetBorderStyle(ICellStyle cellStyle, NPOI.SS.UserModel.BorderStyle topBorder, NPOI.SS.UserModel.BorderStyle bottomBorder, NPOI.SS.UserModel.BorderStyle leftBorder, NPOI.SS.UserModel.BorderStyle rightBorder)
    {
        cellStyle.BorderTop = topBorder;
        cellStyle.BorderBottom = bottomBorder;
        cellStyle.BorderLeft = leftBorder;
        cellStyle.BorderRight = rightBorder;
        return cellStyle;
    }

    // 设置填充样式
    // pattern = FillPattern.{NoFill|SolidForeground|FineDots|AltBars|SparseDots|ThickHorizontalBands|ThickVerticalBands|ThickBackwardDiagonals|ThickForwardDiagonals|BigSpots|Bricks|...}
    public ICellStyle SetFillStyle(ICellStyle cellStyle, FillPattern pattern, short foregroundColor, short backgroundColor)
    {
        cellStyle.FillPattern = pattern;// 图案样式
        cellStyle.FillForegroundColor = foregroundColor;// 图案颜色
        cellStyle.FillBackgroundColor = backgroundColor;// 背景颜色
        return cellStyle;
    }

    // 绘制表单
    public string DrawSheet(ISheet sheet)
    {
        int maxColNum = 0;
        string html;
        html = "<table border=\"1\" style=\"text-align:center;vertical-align:middle;border:2px solid darkgray;border-collapse:collapse;width:100%;\">";
        for (int rowIndex = 0; rowIndex <= sheet.LastRowNum; rowIndex++)
        {// 表单行
            if (sheet.GetRow(rowIndex) == null)
            {// 处理空行并跳过当前循环
                if (maxColNum == 0)
                {
                    html += "<tr><td><br/></td></tr>";
                }
                else
                {
                    html += "<tr><td colspan=" + maxColNum + "><br/></td></tr>";
                }
                continue;
            }
            else
            {// 保存最后非空行单元列数
                maxColNum = sheet.GetRow(rowIndex).LastCellNum;
            }
            // 绘制非空行数据
            html += "<tr height=" + sheet.GetRow(rowIndex).Height / 20 + ">";
            for (int colIndex = 0; colIndex < sheet.GetRow(rowIndex).LastCellNum; colIndex++)
            {// 表单列
                ICell cell = sheet.GetRow(rowIndex).GetCell(colIndex);
                if (cell == null)
                {// 处理空单元格并跳过当前循环
                    html += "<td />";
                    continue;
                }
                int rowSpan = 1;
                int colSpan = 1;
                bool isHeader = false;
                if (cell.IsMergedCell == false)
                {
                    isHeader = true;
                }
                else
                {
                    for (int i = 0; i < sheet.NumMergedRegions; i++)
                    {
                        CellRangeAddress range = sheet.GetMergedRegion(i);
                        if (range.FirstRow == rowIndex && range.FirstColumn == colIndex)
                        {
                            rowSpan = range.LastRow - range.FirstRow + 1;
                            colSpan = range.LastColumn - range.FirstColumn + 1;
                            isHeader = true;
                            break;
                        }
                    }
                }
                if (isHeader)
                {// 仅头表单绘制内容
                    string colorName = "White";
                    switch (cell.CellStyle.FillForegroundColor)
                    {// 转换颜色索引为颜色名称
                        case 49:
                            colorName = "Aqua";
                            break;
                        case 8:
                            colorName = "Black";
                            break;
                        case 12:
                            colorName = "Blue";
                            break;
                        case 60:
                            colorName = "Brown";
                            break;
                        case 29:
                            colorName = "Coral";
                            break;
                        case 24:
                            colorName = "CornflowerBlue";
                            break;
                        case 18:
                            colorName = "DarkBlue";
                            break;
                        case 58:
                            colorName = "DarkGreen";
                            break;
                        case 16:
                            colorName = "DarkRed";
                            break;
                        case 51:
                            colorName = "Gold";
                            break;
                        case 17:
                            colorName = "Green";
                            break;
                        case 62:
                            colorName = "Indigo";
                            break;
                        case 46:
                            colorName = "Lavender";
                            break;
                        case 26:
                            colorName = "LemonChiffon";
                            break;
                        case 48:
                            colorName = "LightBlue";
                            break;
                        case 42:
                            colorName = "LightGreen";
                            break;
                        case 43:
                            colorName = "LightYellow";
                            break;
                        case 50:
                            colorName = "Lime";
                            break;
                        case 25:
                            colorName = "Maroon";
                            break;
                        case 53:
                            colorName = "Orange";
                            break;
                        case 28:
                            colorName = "Orchid";
                            break;
                        case 14:
                            colorName = "Pink";
                            break;
                        case 61:
                            colorName = "Plum";
                            break;
                        case 10:
                            colorName = "Red";
                            break;
                        case 30:
                            colorName = "RoyalBlue";
                            break;
                        case 57:
                            colorName = "SeaGreen";
                            break;
                        case 40:
                            colorName = "SkyBlue";
                            break;
                        case 47:
                            colorName = "Tan";
                            break;
                        case 21:
                            colorName = "Teal";
                            break;
                        case 15:
                            colorName = "Turquoise";
                            break;
                        case 20:
                            colorName = "Violet";
                            break;
                        case 9:
                            colorName = "White";
                            break;
                        case 13:
                            colorName = "Yellow";
                            break;
                    }
                    // white-space:nowrap;	自适应宽度
                    // word-break:keep-all;	避免长单词截断
                    html += "<td rowspan=" + rowSpan + " colspan=" + colSpan + " width=" + (sheet.GetColumnWidth(colIndex) - 0.72) / 256 + " bgcolor=" + colorName + " style=\"white-space:nowrap;word-break:keep-all;\">";
                    switch (cell.CellType.ToString())
                    {// 写入单元格内容
                        case "Formula":
                            html += cell.NumericCellValue.ToString("#0.0000");
                            break;
                        case "Numeric":
                            html += cell.ToString();
                            break;
                        default:
                            html += cell.ToString();
                            break;
                    }
                    html += "</td>";
                }
            }
            html += "</tr>";
        }
        html += "</table>";
        return html;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值