.Net NPOI 上傳excel文件、提交後臺獲取excel裏的數據

一、導入NPOI.dllsql

二、添加類NPOIExcel.cside

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.OleDb;
using System.IO;
using System.Drawing;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.HSSF.Util;
using NPOI.SS.Util;

public class NPOIExcel
{
    internal IWorkbook Book { get; set; }

    private int sheetID = 0;
    /// <summary>
    /// 當前活動的SheetID,全部的操做將指向這個Sheet
    /// </summary>
    public int ActiveSheetID
    {
        get
        {
            return sheetID;
        }
        set
        {
            sheetID = value;
        }
    }

    /// <summary>
    /// 當前活動的SheetName,全部的操做將指向這個Sheet
    /// </summary>
    public string ActiveSheetName
    {
        get
        {
            return Book.GetSheetAt(sheetID).SheetName;
        }
        set
        {
            sheetID = Book.GetSheetIndex(value);
        }
    }
    /// <summary>
    /// 當前活動的Sheet,全部的操做將指向這個Sheet
    /// </summary>
    public ISheet ActiveSheet
    {
        get
        {
            return Book.GetSheetAt(sheetID);
        }
    }

    /// <summary>
    /// 第一行非空行的行號
    /// </summary>
    public int FirstRowNum
    {
        get
        {
            return Book.GetSheetAt(sheetID).FirstRowNum;
        }
    }

    /// <summary>
    /// 最後一行非空行的行號
    /// </summary>
    public int LastRostNum
    {
        get
        {
            return Book.GetSheetAt(sheetID).LastRowNum;
        }
    }

    /// <summary>
    /// 無模板的Excel生成或操做
    /// </summary>
    public NPOIExcel()
    {
        Book = new HSSFWorkbook();
        Book.CreateSheet();
    }

    public NPOIExcel(Stream fileStream, string fileName)
    {
        if (fileName.Substring(fileName.LastIndexOf(".")) == ".xls")
        {
            Book = new HSSFWorkbook(fileStream);
        }
        else
        {
            Book = new XSSFWorkbook(fileStream);
        }
    }
    /// <summary>
    /// 帶模板或數據的Excel生成或操做
    /// </summary>
    /// <param name="fileName"></param>
    public NPOIExcel(string fileName)
    {
        Book = CreateBook(fileName);
    }

    /// <summary>
    /// 建立Excel Book
    /// </summary>
    /// <param name="fileName">模板文件名</param>
    /// <returns></returns>
    private IWorkbook CreateBook(string fileName)
    {
        FileInfo file = new FileInfo(fileName);
        if (!file.Exists)
        {
            File.Create(fileName).Close();
        }
        FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
        IWorkbook book;
        if (file.Extension == ".xls")
        {
            book = new HSSFWorkbook(fs);
        }
        else
        {
            book = new XSSFWorkbook(fs);
        }
        fs.Close();
        if (book.NumberOfSheets == 0)
        {
            book.CreateSheet();
        }
        return book;
    }

    /// <summary>
    /// 新建Sheet
    /// </summary>
    /// <returns>新建Sheet</returns>
    public ISheet CreateSheet()
    {
        return Book.CreateSheet();
    }

    /// <summary>
    /// 新建Sheet
    /// </summary>
    /// <param name="sheetName">新建Sheet的名稱</param>
    /// <returns>新建Sheet</returns>
    public ISheet CreateSheet(string sheetName)
    {
        return Book.CreateSheet(sheetName);
    }

    /// <summary>
    /// 設置行高
    /// 注:只對當前ActiveSheet有效
    /// </summary>
    /// <param name="rowIndex">行號</param>
    /// <param name="height">高度</param>
    public void SetRowHeight(int rowIndex, float height)
    {
        IRow row = Book.GetSheetAt(sheetID).GetRow(rowIndex);
        if (row == null)
        {
            row = Book.GetSheetAt(sheetID).CreateRow(rowIndex);
        }
        row.Height = (short)(height * 20);
    }

    /// <summary>
    /// 設置列寬
    /// 注:只對當前ActiveSheet有效
    /// </summary>
    /// <param name="columnIndex">列號</param>
    /// <param name="width">寬度</param>
    public void SetColumnWidth(int columnIndex, short width)
    {
        Book.GetSheetAt(sheetID).SetColumnWidth(columnIndex, width * 256);
    }

    /// <summary>
    /// 獲取或設置默認行高
    /// 注:只對當前ActiveSheet有效
    /// </summary>
    public short DefaultRowHeight
    {
        get
        {
            return (short)(Book.GetSheetAt(sheetID).DefaultRowHeight / 20);
        }
        set
        {
            Book.GetSheetAt(sheetID).DefaultRowHeight = value * 20;
        }
    }

    /// <summary>
    /// 獲取或設置默認列寬
    /// 注:只對當前ActiveSheet有效
    /// </summary>
    public int DefaultColWidth
    {
        get
        {
            return Book.GetSheetAt(sheetID).DefaultColumnWidth;
        }
        set
        {
            Book.GetSheetAt(sheetID).DefaultColumnWidth = value;
        }
    }

    /// <summary>
    /// 某一列的列寬自動調整大小
    /// 注:只對當前ActiveSheet有效
    /// </summary>
    /// <param name="colIndex">列號</param>
    public void AutoColWidth(int colIndex)
    {
        Book.GetSheetAt(sheetID).AutoSizeColumn(colIndex, true);
    }

    /// <summary>
    /// 隱藏一行
    /// 注:只對當前ActiveSheet有效
    /// </summary>
    /// <param name="rowIndex">行號</param>
    public void HiddenRow(int rowIndex)
    {
        IRow row = Book.GetSheetAt(sheetID).GetRow(rowIndex);
        if (row == null)
        {
            row = Book.GetSheetAt(sheetID).CreateRow(rowIndex);
        }
        row.ZeroHeight = true;
    }

    /// <summary>
    /// 刪除一行
    /// 注:只對當前ActiveSheet有效
    /// </summary>
    /// <param name="rowIndex">行號</param>
    public void RemoveRow(int rowIndex)
    {
        IRow row = Book.GetSheetAt(sheetID).GetRow(rowIndex);
        if (row != null)
        {
            ActiveSheet.RemoveRow(row);
        }
    }

    /// <summary>
    /// 讀取單元格的值
    /// 注:只對當前ActiveSheet有效
    /// </summary>
    /// <param name="rowIndex">行號</param>
    /// <param name="columnIndex">列號</param>
    /// <returns>單元格的值</returns>
    public object ReadValue(int rowIndex, int columnIndex, bool? isDateTime = null)
    {
        try
        {
            ICell cell = Book.GetSheetAt(sheetID).GetRow(rowIndex).GetCell(columnIndex);
            short df = cell.CellStyle.DataFormat;

            //return cell.ToString();
            switch (cell.CellType)
            {
                case CellType.BLANK:
                    return null;
                case CellType.BOOLEAN:
                    return cell.BooleanCellValue;
                case CellType.ERROR:
                    throw new Exception("Cell Value Error");
                case CellType.FORMULA:
                    {
                        switch (cell.CachedFormulaResultType)
                        {
                            case CellType.BLANK:
                                return "";
                            case CellType.BOOLEAN:
                                return cell.BooleanCellValue;
                            case CellType.ERROR:
                                throw new Exception("Cell Value Error");
                            case CellType.FORMULA:
                                throw new Exception("The formula of this cell is too complex!");
                            case CellType.NUMERIC:
                                if (isDateTime == null)
                                {
                                    if (DateUtil.IsCellDateFormatted(cell))
                                    {
                                        return cell.DateCellValue;
                                    }
                                    else
                                    {
                                        return cell.NumericCellValue;
                                    }
                                }
                                else if (isDateTime == true)
                                {
                                    return cell.DateCellValue;
                                }
                                else
                                {
                                    return cell.NumericCellValue;
                                }
                            case CellType.STRING:
                                return cell.StringCellValue;
                            case CellType.Unknown:
                                return cell.ToString();
                            default:
                                return cell.ToString();
                        }
                    }
                case CellType.NUMERIC:
                    {
                        if (isDateTime == null)
                        {
                            if (DateUtil.IsCellDateFormatted(cell))
                            {
                                return cell.DateCellValue;
                            }
                            else
                            {
                                return cell.NumericCellValue;
                            }
                        }
                        else if (isDateTime == true)
                        {
                            return cell.DateCellValue;
                        }
                        else
                        {
                            return cell.NumericCellValue;
                        }
                    }
                case CellType.STRING:
                    return cell.StringCellValue;
                case CellType.Unknown:
                    return cell.ToString();
                default:
                    return cell.ToString();
            }
        }
        catch (System.NullReferenceException)
        {
            return null;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    /// <summary>
    /// 設置單元格的值
    /// 注:只對當前ActiveSheet有效
    /// </summary>
    /// <param name="rowIndex">行號</param>
    /// <param name="columnIndex">列號</param>
    /// <param name="value">單元格的值</param>
    public void SetValue(int rowIndex, int columnIndex, object value)
    {
        SetValue(rowIndex, columnIndex, value, false);
    }

    /// <summary>
    /// 設置單元格的值
    /// 注:只對當前ActiveSheet有效
    /// </summary>
    /// <param name="rowIndex">行號</param>
    /// <param name="columnIndex">列號</param>
    /// <param name="value">單元格的值</param>
    /// <param name="isFormula">是不是公式</param>
    public void SetValue(int rowIndex, int columnIndex, object value, bool isFormula)
    {
        IRow row = Book.GetSheetAt(sheetID).GetRow(rowIndex);
        if (row == null)
        {
            row = Book.GetSheetAt(sheetID).CreateRow(rowIndex);
        }
        ICell cell = row.GetCell(columnIndex);
        if (cell == null)
        {
            cell = row.CreateCell(columnIndex);
        }
        if (value == null)
        {
            cell.SetCellValue("");
        }
        if (isFormula)
        {
            cell.SetCellFormula(value.ToString());
        }
        else
        {
            if (value is short)
            {
                cell.SetCellValue((short)value);
            }
            else if (value is int)
            {
                cell.SetCellValue((int)value);
            }
            else if (value is long)
            {
                cell.SetCellValue((long)value);
            }
            else if (value is float)
            {
                cell.SetCellValue((float)value);
            }
            else if (value is double)
            {
                cell.SetCellValue((double)value);
            }
            else if (value is bool)
            {
                cell.SetCellValue((bool)value);
            }
            else if (value is DateTime)
            {
                cell.SetCellValue((DateTime)value);
            }
            else if (value == null)
            {
            }
            else
            {
                cell.SetCellValue(value.ToString());
            }
        }

    }

    /// <summary>
    /// 設置一個區域內的單元格的值範圍
    /// 注:只對當前ActiveSheet有效
    /// </summary>
    /// <param name="startRowIndex">開始行</param>
    /// <param name="EndRowIndex">結束行</param>
    /// <param name="startColInex">開始列</param>
    /// <param name="endColIndex">結束列</param>
    /// <param name="type">驗證類型</param>
    /// <param name="operatorType">驗證方式</param>
    /// <param name="minValue">最小值</param>
    /// <param name="maxValue">最大值</param>
    public void SetValueRange(int startRowIndex, int EndRowIndex, int startColInex, int endColIndex, NPOIDataType type, OperatorTypes operatorType, string minValue, string maxValue)
    {
        SetValueRange(startRowIndex, EndRowIndex, startColInex, endColIndex, type, operatorType, minValue, maxValue, "", "");
    }

    /// <summary>
    /// 設置一個區域內的單元格的值範圍
    /// 注:只對當前ActiveSheet有效
    /// </summary>
    /// <param name="startRowIndex">開始行</param>
    /// <param name="EndRowIndex">結束行</param>
    /// <param name="startColInex">開始列</param>
    /// <param name="endColIndex">結束列</param>
    /// <param name="type">驗證類型</param>
    /// <param name="operatorType">驗證方式</param>
    /// <param name="minValue">最小值</param>
    /// <param name="maxValue">最大值</param>
    /// <param name="formate">數據格式</param>
    public void SetValueRange(int startRowIndex, int EndRowIndex, int startColInex, int endColIndex, NPOIDataType type, OperatorTypes operatorType, string minValue, string maxValue, string formate)
    {
        SetValueRange(startRowIndex, EndRowIndex, startColInex, endColIndex, type, operatorType, minValue, maxValue, formate, "");
    }

    /// <summary>
    /// 設置一個區域內的單元格的值範圍
    /// 注:只對當前ActiveSheet有效
    /// </summary>
    /// <param name="startRowIndex">開始行</param>
    /// <param name="EndRowIndex">結束行</param>
    /// <param name="startColInex">開始列</param>
    /// <param name="endColIndex">結束列</param>
    /// <param name="type">驗證類型</param>
    /// <param name="operatorType">驗證方式</param>
    /// <param name="minValue">最小值</param>
    /// <param name="maxValue">最大值</param>
    /// <param name="formate">數據格式</param>
    /// <param name="AlertMassage">報錯信息</param>
    public void SetValueRange(int startRowIndex, int EndRowIndex, int startColInex, int endColIndex, NPOIDataType type, OperatorTypes operatorType, string minValue, string maxValue, string formate, string AlertMassage)
    {
        CellRangeAddressList regions = new CellRangeAddressList(startRowIndex, EndRowIndex, startColInex, endColIndex);
        DVConstraint constraint = DVConstraint.CreateNumericConstraint(ValidationType.ANY, 0, null, null);
        switch (type)
        {
            case NPOIDataType.Integer:
                constraint = DVConstraint.CreateNumericConstraint(ValidationType.INTEGER, (int)operatorType, minValue, maxValue);
                break;
            case NPOIDataType.Float:
                constraint = DVConstraint.CreateNumericConstraint(ValidationType.DECIMAL, (int)operatorType, minValue, maxValue);
                break;
            case NPOIDataType.Date:
                if (formate == "")
                {
                    formate = "yyyy/MM/dd";
                }
                constraint = DVConstraint.CreateDateConstraint((int)operatorType, minValue, maxValue, formate);
                break;
            case NPOIDataType.Time:
                constraint = DVConstraint.CreateTimeConstraint((int)operatorType, minValue, maxValue);
                break;
            case NPOIDataType.TextLength:
                constraint = DVConstraint.CreateNumericConstraint(ValidationType.TEXT_LENGTH, (int)operatorType, minValue, maxValue);
                break;
            default:
                break;
        }

        HSSFDataValidation dataValidate1 = new HSSFDataValidation(regions, constraint);
        if (!string.IsNullOrEmpty(AlertMassage))
        {
            dataValidate1.CreateErrorBox("Error", AlertMassage);
        }
        ActiveSheet.AddValidationData(dataValidate1);

    }

    /// <summary>
    /// 設置一個區域內的單元格的值範圍
    /// 注:只對當前ActiveSheet有效
    /// </summary>
    /// <param name="startRowIndex">開始行</param>
    /// <param name="EndRowIndex">結束行</param>
    /// <param name="startColInex">開始列</param>
    /// <param name="endColIndex">結束列</param>
    /// <param name="dataRange">值系列</param>
    public void SetValueRange(int startRowIndex, int EndRowIndex, int startColInex, int endColIndex, string[] dataRange)
    {

        SetValueRange(startRowIndex, EndRowIndex, startColInex, endColIndex, dataRange, "");
    }

    /// <summary>
    /// 設置一個區域內的單元格的值範圍
    /// 注:只對當前ActiveSheet有效
    /// </summary>
    /// <param name="startRowIndex">開始行</param>
    /// <param name="EndRowIndex">結束行</param>
    /// <param name="startColInex">開始列</param>
    /// <param name="endColIndex">結束列</param>
    /// <param name="dataRange">值系列</param>
    /// <param name="alertMassage">報錯信息</param>
    public void SetValueRange(int startRowIndex, int endRowIndex, int startColInex, int endColIndex, string[] dataRange, string alertMassage)
    {
        ISheetConditionalFormatting hscf = ActiveSheet.SheetConditionalFormatting;
        CellRangeAddress[] regions = {
                new CellRangeAddress(startRowIndex, endRowIndex,startColInex,endColIndex)
            };

        CellRangeAddressList rangeList = new CellRangeAddressList();
        rangeList.AddCellRangeAddress(new CellRangeAddress(startRowIndex, endRowIndex, startColInex, endColIndex));
        DVConstraint dvconstraint = DVConstraint.CreateExplicitListConstraint(dataRange);
        HSSFDataValidation dataValidation = new HSSFDataValidation(rangeList, dvconstraint);

        if (!string.IsNullOrEmpty(alertMassage))
        {
            dataValidation.CreateErrorBox("Error", alertMassage);
        }

        ActiveSheet.AddValidationData(dataValidation);
    }

    /// <summary>
    /// 設置一個區域內的單元格的值範圍
    /// 注:只對當前ActiveSheet有效
    /// </summary>
    /// <param name="startRowIndex">開始行</param>
    /// <param name="EndRowIndex">結束行</param>
    /// <param name="startColInex">開始列</param>
    /// <param name="endColIndex">結束列</param>
    /// <param name="formula">計算公式</param>
    /// <param name="alertMassage">報錯信息</param>
    public void SetValueRange(int startRowIndex, int endRowIndex, int startColInex, int endColIndex, string formula, string alertMassage)
    {
        ISheetConditionalFormatting hscf = ActiveSheet.SheetConditionalFormatting;
        CellRangeAddress[] regions = {
                new CellRangeAddress(startRowIndex, endRowIndex,startColInex,endColIndex)
            };

        CellRangeAddressList rangeList = new CellRangeAddressList();
        rangeList.AddCellRangeAddress(new CellRangeAddress(startRowIndex, endRowIndex, startColInex, endColIndex));
        DVConstraint dvconstraint = DVConstraint.CreateFormulaListConstraint(formula);
        HSSFDataValidation dataValidation = new HSSFDataValidation(rangeList, dvconstraint);

        if (!string.IsNullOrEmpty(alertMassage))
        {
            dataValidation.CreateErrorBox("Error", alertMassage);
        }

        ActiveSheet.AddValidationData(dataValidation);
    }

    /// <summary>
    /// 設置一個區域內的單元格的值範圍
    /// 注:只對當前ActiveSheet有效
    /// </summary>
    /// <param name="startRowIndex">開始行</param>
    /// <param name="EndRowIndex">結束行</param>
    /// <param name="startColInex">開始列</param>
    /// <param name="endColIndex">結束列</param>
    /// <param name="formula">計算公式</param>
    public void SetValueRange(int startRowIndex, int endRowIndex, int startColInex, int endColIndex, string formula)
    {
        SetValueRange(startRowIndex, endColIndex, startRowIndex, endColIndex, formula, "");
    }

    /// <summary>
    /// 生成單元格樣式
    /// </summary>
    /// <returns>與當前Excel相關的單元格樣式</returns>
    public ICellStyle CreateCellStyle()
    {
        return Book.CreateCellStyle();
    }

    /// <summary>
    /// 生成字體
    /// </summary>
    /// <returns>與當前Excel相關的字體</returns>
    public IFont CreateFont()
    {
        return Book.CreateFont();
    }

    /// <summary>
    /// 設置單元格樣式
    /// 注:只對當前ActiveSheet有效
    /// </summary>
    /// <param name="rowIndex">行號</param>
    /// <param name="columnIndex">列號</param>
    /// <param name="style">樣式</param>
    public void SetStyle(int rowIndex, int columnIndex, ICellStyle style)
    {
        IRow row = Book.GetSheetAt(sheetID).GetRow(rowIndex);
        if (row == null)
        {
            row = Book.GetSheetAt(sheetID).CreateRow(rowIndex);
        }
        ICell cell = row.GetCell(columnIndex);
        if (cell == null)
        {
            cell = row.CreateCell(columnIndex);
        }
        cell.CellStyle = style;
    }

    /// <summary>
    /// 合併單元格
    /// 注:只對當前ActiveSheet有效
    /// </summary>
    /// <param name="startRowIndex">開始行號</param>
    /// <param name="startColumnIndex">開始列號</param>
    /// <param name="endRowIndex">結束行號</param>
    /// <param name="endColumnIndex">結束列號</param>
    public void MergeCells(int startRowIndex, int startColumnIndex, int endRowIndex, int endColumnIndex)
    {
        int index = Book.GetSheetAt(sheetID).AddMergedRegion(new CellRangeAddress(startRowIndex, endRowIndex, startColumnIndex, endColumnIndex));
    }

    /// <summary>
    /// 拆分單元格
    /// 注1:只對當前ActiveSheet有效
    /// 注2:只有合併的單元格才能拆分
    /// </summary>
    /// <param name="startRowIndex">開始行號</param>
    /// <param name="startColumnIndex">開始列號</param>
    public void UnMergeCells(int startRowIndex, int startColumnIndex)
    {
        int merges = Book.GetSheetAt(sheetID).NumMergedRegions;
        CellRangeAddress merge;
        for (int i = 0; i < merges; i++)
        {
            merge = Book.GetSheetAt(sheetID).GetMergedRegion(i);
            if (merge.FirstRow == startRowIndex && merge.FirstColumn == startColumnIndex)
            {
                Book.GetSheetAt(sheetID).RemoveMergedRegion(i);
                break;
            }
        }
    }

    /// <summary>
    /// 保存到文件
    /// 注:有模板的,文件擴展名與模板同樣;沒有模板的,文件擴展名爲「.xls」;
    /// </summary>
    /// <param name="fileName">保存文件名</param>
    public void Save(string fileName)
    {
        FileStream file = new FileStream(fileName, FileMode.Create);
        Book.Write(file);
        file.Close();
    }

    /// <summary>
    /// 保存到流
    /// 注:保存或下載時,有模板的,文件擴展名與模板同樣;沒有模板的,文件擴展名爲「.xls」;
    /// </summary>
    /// <returns>內存流</returns>
    public MemoryStream Save()
    {
        MemoryStream ms = new MemoryStream();
        Book.Write(ms);
        return ms;
    }

    /// <summary>
    /// 把Excel讀成DataSet
    /// 注:必須是正規表格式
    /// </summary>
    /// <returns>讀出的Excel</returns>
    public DataSet ReadAsDataSet()
    {
        DataSet rtn = new DataSet();
        for (int i = 0; i < SheetCount; i++)
        {
            ISheet sheet = Book.GetSheetAt(i);
            rtn.Tables.Add(GetDataTableBySheet(sheet));
        }
        return rtn;
    }

    private DataTable GetDataTableBySheet(ISheet sheet)
    {
        DataTable dt = new DataTable(sheet.SheetName);
        int maxCols = 0;
        object value;
        while ((value = ReadValue(sheet, 0, maxCols)) != null)
        {
            dt.Columns.Add(value.ToString());
            maxCols++;
        }

        int row = 1;

        bool emptyRow = false;
        int emptyRowCount = 0;
        while (emptyRowCount < 10)
        {
            emptyRow = true;
            DataRow dr = dt.NewRow();
            for (int i = 0; i < maxCols; i++)
            {
                value = ReadValue(sheet, row, i);
                if (value != null)
                {
                    dr[i] = value;
                    emptyRow = false;
                }
            }
            if (!emptyRow)
            {
                dt.Rows.Add(dr);
                emptyRowCount = 0;
            }
            else
            {
                emptyRowCount++;
            }
            row++;
        }

        return dt;
    }

    /// <summary>
    /// 根據SheetName導出數據爲DataTable
    /// </summary>
    /// <param name="sheetName">Sheet名稱</param>
    /// <returns></returns>
    public DataTable GetDataTableBySheet(string sheetName)
    {

        ISheet sheet = Book.GetSheet(sheetName);
        if (sheet != null)
        {
            return GetDataTableBySheet(sheet);
        }
        return null;

    }

    /// <summary>
    /// 根據SheetName導出數據爲DataTable
    /// </summary>
    /// <param name="sheetIndex">Sheet編號</param>
    /// <returns></returns>
    public DataTable GetDataTableBySheet(int sheetIndex)
    {

        ISheet sheet = Book.GetSheetAt(sheetIndex);
        if (sheet != null)
        {
            return GetDataTableBySheet(sheet);
        }
        return null;

    }

    /// <summary>
    /// 寫入表格
    /// </summary>
    /// <param name="Data">表格數據</param>
    /// <param name="col">寫入的起始列</param>
    /// <param name="row">寫入的起始行</param>
    /// <param name="titleColor">標題顏色</param>
    /// <param name="fullBorder">是否須要四周邊框</param>
    public void WriteDataTable(DataTable Data, int col = 1, int row = 1, short? titleColor = null, bool fullBorder = true)
    {
        if (Data == null)
        {
            return;
        }

        var titleStyle = CreateCellStyle();
        var rowStyle = CreateCellStyle();
        if (titleColor != null)
            titleStyle.FillForegroundColor = titleColor.Value;

        titleStyle.FillPattern = FillPatternType.SOLID_FOREGROUND;
        if (fullBorder)
        {
            titleStyle.BorderBottom = BorderStyle.THIN;
            titleStyle.BorderLeft = BorderStyle.THIN;
            titleStyle.BorderRight = BorderStyle.THIN;
            titleStyle.BorderTop = BorderStyle.THIN;
            titleStyle.BottomBorderColor = NPOIColor.BLACK;
            titleStyle.LeftBorderColor = NPOIColor.BLACK;
            titleStyle.RightBorderColor = NPOIColor.BLACK;
            titleStyle.TopBorderColor = NPOIColor.BLACK;
            rowStyle.BorderBottom = BorderStyle.THIN;
            rowStyle.BorderLeft = BorderStyle.THIN;
            rowStyle.BorderRight = BorderStyle.THIN;
            rowStyle.BorderTop = BorderStyle.THIN;
            rowStyle.BottomBorderColor = NPOIColor.BLACK;
            rowStyle.LeftBorderColor = NPOIColor.BLACK;
            rowStyle.RightBorderColor = NPOIColor.BLACK;
            rowStyle.TopBorderColor = NPOIColor.BLACK;
        }

        int iCol = 0, iRow = 1;

        foreach (DataColumn dc in Data.Columns)
        {
            SetValue(row, col + iCol, dc.ColumnName);
            SetStyle(row, col + iCol, titleStyle);
            iCol++;
        }

        rowStyle.FillForegroundColor = NPOIColor.WHITE;

        foreach (DataRow dr in Data.Rows)
        {
            iCol = 0;
            foreach (DataColumn dc in Data.Columns)
            {
                SetValue(row + iRow, col + iCol, dr[dc]);
                SetStyle(row + iRow, col + iCol, rowStyle);
                iCol++;
            }
            iRow++;
        }

        for (int i = 0; i < iCol; i++)
        {
            this.AutoColWidth(i);
        }
    }

    /// <summary>
    /// 讀取單元格的值
    /// 注:只對當前ActiveSheet有效
    /// </summary>
    /// <param name="rowIndex">行號</param>
    /// <param name="columnIndex">列號</param>
    /// <returns>單元格的值</returns>
    public object ReadValue(ISheet sheet, int rowIndex, int columnIndex, bool? isDateTime = null)
    {
        try
        {
            ICell cell = sheet.GetRow(rowIndex).GetCell(columnIndex);
            short df = cell.CellStyle.DataFormat;

            //return cell.ToString();
            switch (cell.CellType)
            {
                case CellType.BLANK:
                    return null;
                case CellType.BOOLEAN:
                    return cell.BooleanCellValue;
                case CellType.ERROR:
                    throw new Exception("Cell Value Error");
                case CellType.FORMULA:
                    {
                        switch (cell.CachedFormulaResultType)
                        {
                            case CellType.BLANK:
                                return "";
                            case CellType.BOOLEAN:
                                return cell.BooleanCellValue;
                            case CellType.ERROR:
                                throw new Exception("Cell Value Error");
                            case CellType.FORMULA:
                                throw new Exception("The formula of this cell is too complex!");
                            case CellType.NUMERIC:
                                if (isDateTime == null)
                                {
                                    if (DateUtil.IsCellDateFormatted(cell))
                                    {
                                        return cell.DateCellValue;
                                    }
                                    else
                                    {
                                        return cell.NumericCellValue;
                                    }
                                }
                                else if (isDateTime == true)
                                {
                                    return cell.DateCellValue;
                                }
                                else
                                {
                                    return cell.NumericCellValue;
                                }
                            case CellType.STRING:
                                return cell.StringCellValue;
                            case CellType.Unknown:
                                return cell.ToString();
                            default:
                                return cell.ToString();
                        }
                    }
                case CellType.NUMERIC:
                    {
                        if (isDateTime == null)
                        {
                            if (DateUtil.IsCellDateFormatted(cell))
                            {
                                return cell.DateCellValue;
                            }
                            else
                            {
                                return cell.NumericCellValue;
                            }
                        }
                        else if (isDateTime == true)
                        {
                            return cell.DateCellValue;
                        }
                        else
                        {
                            return cell.NumericCellValue;
                        }
                    }
                case CellType.STRING:
                    return cell.StringCellValue;
                case CellType.Unknown:
                    return cell.ToString();
                default:
                    return cell.ToString();
            }
        }
        catch (System.NullReferenceException)
        {
            return null;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    public int SheetCount
    {
        get
        {
            return Book.NumberOfSheets;
        }
    }

    public string GetSheetName(int index)
    {
        return Book.GetSheetName(index);
    }

    public void AddPicture(byte[] data, int row, int col)
    {
        int picIndex = Book.AddPicture(data, PictureType.PNG);

        IDrawing draw = ActiveSheet.CreateDrawingPatriarch();

        IClientAnchor anchor = draw.CreateAnchor(0, 0, 255, 255, col, row, col + 5, col + 5);
        IPicture pic = draw.CreatePicture(anchor, picIndex);
        pic.Resize();
    }
}

public enum OperatorTypes
{
    /// <summary>
    /// 介於最大值與小值之間
    /// </summary>
    BETWEEN = OperatorType.BETWEEN,
    /// <summary>
    /// 等於最小值
    /// </summary>
    EQUAL = OperatorType.EQUAL,
    /// <summary>
    /// 大於或等於最小值
    /// </summary>
    GREATER_OR_EQUAL = OperatorType.GREATER_OR_EQUAL,
    /// <summary>
    /// 大於最小值
    /// </summary>
    GREATER_THAN = OperatorType.GREATER_THAN,
    /// <summary>
    /// 忽略
    /// </summary>
    NO_COMPARISON = OperatorType.IGNORED,
    /// <summary>
    /// 小於或等於最小值
    /// </summary>
    LESS_OR_EQUAL = OperatorType.LESS_OR_EQUAL,
    /// <summary>
    /// 小於最小值
    /// </summary>
    LESS_THAN = OperatorType.LESS_THAN,
    /// <summary>
    /// 不在最小值與最大值之間
    /// </summary>
    NOT_BETWEEN = OperatorType.NOT_BETWEEN,
    /// <summary>
    /// 不等於最小值
    /// </summary>
    NOT_EQUAL = OperatorType.NOT_EQUAL
}

public enum NPOIDataType
{
    /// <summary>
    /// 驗證整數
    /// </summary>
    Integer,
    /// <summary>
    /// 驗證符點數
    /// </summary>
    Float,
    /// <summary>
    /// 驗證日期
    /// </summary>
    Date,
    /// <summary>
    /// 驗證時間
    /// </summary>
    Time,
    /// <summary>
    /// 驗證字符長度
    /// </summary>
    TextLength
}

public static class NPOIColor
{

    /// <summary>
    /// 紅色
    /// </summary>
    public static short RED { get { return NPOI.HSSF.Util.HSSFColor.RED.index; } }

    /// <summary>
    /// 藍色
    /// </summary>
    public static short BLUE { get { return NPOI.HSSF.Util.HSSFColor.BLUE.index; } }

    /// <summary>
    /// 淺綠色
    /// </summary>
    public static short AQUA { get { return NPOI.HSSF.Util.HSSFColor.AQUA.index; } }

    /// <summary>
    /// 自動
    /// </summary>
    public static short AUTOMATIC { get { return NPOI.HSSF.Util.HSSFColor.AUTOMATIC.index; } }

    /// <summary>
    /// 黑色
    /// </summary>
    public static short BLACK { get { return NPOI.HSSF.Util.HSSFColor.BLACK.index; } }

    /// <summary>
    /// 藍灰色
    /// </summary>
    public static short BLUE_GREY { get { return NPOI.HSSF.Util.HSSFColor.BLUE_GREY.index; } }

    /// <summary>
    /// 明綠色
    /// </summary>
    public static short BRIGHT_GREEN { get { return NPOI.HSSF.Util.HSSFColor.BRIGHT_GREEN.index; } }

    /// <summary>
    /// 棕色
    /// </summary>
    public static short BROWN { get { return NPOI.HSSF.Util.HSSFColor.BROWN.index; } }

    /// <summary>
    /// 正常
    /// </summary>
    public static short COLOR_NORMAL { get { return NPOI.HSSF.Util.HSSFColor.COLOR_NORMAL; } }

    /// <summary>
    /// 珊瑚色
    /// </summary>
    public static short CORAL { get { return NPOI.HSSF.Util.HSSFColor.CORAL.index; } }

    /// <summary>
    /// 亮藍色
    /// </summary>
    public static short CORNFLOWER_BLUE { get { return NPOI.HSSF.Util.HSSFColor.CORNFLOWER_BLUE.index; } }

    /// <summary>
    /// 深藍色
    /// </summary>
    public static short DARK_BLUE { get { return NPOI.HSSF.Util.HSSFColor.DARK_BLUE.index; } }

    /// <summary>
    /// 深綠色
    /// </summary>
    public static short DARK_GREEN { get { return NPOI.HSSF.Util.HSSFColor.DARK_GREEN.index; } }

    /// <summary>
    /// 深紅色
    /// </summary>
    public static short DARK_RED { get { return NPOI.HSSF.Util.HSSFColor.DARK_RED.index; } }

    /// <summary>
    /// 深茶色
    /// </summary>
    public static short DARK_TEAL { get { return NPOI.HSSF.Util.HSSFColor.DARK_TEAL.index; } }

    /// <summary>
    /// 深黃
    /// </summary>
    public static short DARK_YELLOW { get { return NPOI.HSSF.Util.HSSFColor.DARK_YELLOW.index; } }

    /// <summary>
    /// 金色
    /// </summary>
    public static short GOLD { get { return NPOI.HSSF.Util.HSSFColor.GOLD.index; } }

    /// <summary>
    /// 綠色
    /// </summary>
    public static short GREEN { get { return NPOI.HSSF.Util.HSSFColor.GREEN.index; } }

    /// <summary>
    /// 25%灰色
    /// </summary>
    public static short GREY_25_PERCENT { get { return NPOI.HSSF.Util.HSSFColor.GREY_25_PERCENT.index; } }

    /// <summary>
    /// 40%灰色
    /// </summary>
    public static short GREY_40_PERCENT { get { return NPOI.HSSF.Util.HSSFColor.GREY_40_PERCENT.index; } }

    /// <summary>
    /// 50%灰色
    /// </summary>
    public static short GREY_50_PERCENT { get { return NPOI.HSSF.Util.HSSFColor.GREY_50_PERCENT.index; } }

    /// <summary>
    /// 80%灰色
    /// </summary>
    public static short GREY_80_PERCENT { get { return NPOI.HSSF.Util.HSSFColor.GREY_80_PERCENT.index; } }

    /// <summary>
    /// 靛藍色
    /// </summary>
    public static short INDIGO { get { return NPOI.HSSF.Util.HSSFColor.INDIGO.index; } }

    /// <summary>
    /// 淡紫色
    /// </summary>
    public static short LAVENDER { get { return NPOI.HSSF.Util.HSSFColor.LAVENDER.index; } }

    /// <summary>
    /// 粉黃色
    /// </summary>
    public static short LEMON_CHIFFON { get { return NPOI.HSSF.Util.HSSFColor.LEMON_CHIFFON.index; } }

    /// <summary>
    /// 淡藍色
    /// </summary>
    public static short LIGHT_BLUE { get { return NPOI.HSSF.Util.HSSFColor.LIGHT_BLUE.index; } }

    /// <summary>
    /// 淡亮藍色
    /// </summary>
    public static short LIGHT_CORNFLOWER_BLUE { get { return NPOI.HSSF.Util.HSSFColor.LIGHT_CORNFLOWER_BLUE.index; } }

    /// <summary>
    /// 淡綠色
    /// </summary>
    public static short LIGHT_GREEN { get { return NPOI.HSSF.Util.HSSFColor.LIGHT_GREEN.index; } }

    /// <summary>
    /// 淡桔黃色
    /// </summary>
    public static short LIGHT_ORANGE { get { return NPOI.HSSF.Util.HSSFColor.LIGHT_ORANGE.index; } }

    /// <summary>
    /// 淡藍綠色
    /// </summary>
    public static short LIGHT_TURQUOISE { get { return NPOI.HSSF.Util.HSSFColor.LIGHT_TURQUOISE.index; } }

    /// <summary>
    /// 淡黃色
    /// </summary>
    public static short LIGHT_YELLOW { get { return NPOI.HSSF.Util.HSSFColor.LIGHT_YELLOW.index; } }

    /// <summary>
    /// 綠黃色
    /// </summary>
    public static short LIME { get { return NPOI.HSSF.Util.HSSFColor.LIME.index; } }

    /// <summary>
    /// 栗色
    /// </summary>
    public static short MAROON { get { return NPOI.HSSF.Util.HSSFColor.MAROON.index; } }

    /// <summary>
    /// 橄欖綠色
    /// </summary>
    public static short OLIVE_GREEN { get { return NPOI.HSSF.Util.HSSFColor.OLIVE_GREEN.index; } }

    /// <summary>
    /// 桔色
    /// </summary>
    public static short ORANGE { get { return NPOI.HSSF.Util.HSSFColor.ORANGE.index; } }

    /// <summary>
    /// 白灰藍色
    /// </summary>
    public static short PALE_BLUE { get { return NPOI.HSSF.Util.HSSFColor.PALE_BLUE.index; } }

    /// <summary>
    /// 粉紅色
    /// </summary>
    public static short PINK { get { return NPOI.HSSF.Util.HSSFColor.PINK.index; } }

    /// <summary>
    /// 紫紅色
    /// </summary>
    public static short PLUM { get { return NPOI.HSSF.Util.HSSFColor.PLUM.index; } }

    /// <summary>
    /// 玫瑰紅色
    /// </summary>
    public static short ROSE { get { return NPOI.HSSF.Util.HSSFColor.ROSE.index; } }

    /// <summary>
    /// 高貴藍
    /// </summary>
    public static short ROYAL_BLUE { get { return NPOI.HSSF.Util.HSSFColor.ROYAL_BLUE.index; } }

    /// <summary>
    /// 海綠色
    /// </summary>
    public static short SEA_GREEN { get { return NPOI.HSSF.Util.HSSFColor.SEA_GREEN.index; } }

    /// <summary>
    /// 天空藍
    /// </summary>
    public static short SKY_BLUE { get { return NPOI.HSSF.Util.HSSFColor.SKY_BLUE.index; } }

    /// <summary>
    /// 棕褐色
    /// </summary>
    public static short TAN { get { return NPOI.HSSF.Util.HSSFColor.TAN.index; } }

    /// <summary>
    /// 茶色
    /// </summary>
    public static short TEAL { get { return NPOI.HSSF.Util.HSSFColor.TEAL.index; } }

    /// <summary>
    /// 藍綠色
    /// </summary>
    public static short TURQUOISE { get { return NPOI.HSSF.Util.HSSFColor.TURQUOISE.index; } }

    /// <summary>
    /// 紫色
    /// </summary>
    public static short VIOLET { get { return NPOI.HSSF.Util.HSSFColor.VIOLET.index; } }

    /// <summary>
    /// 白色
    /// </summary>
    public static short WHITE { get { return NPOI.HSSF.Util.HSSFColor.WHITE.index; } }

    /// <summary>
    /// 黃色
    /// </summary>
    public static short YELLOW { get { return NPOI.HSSF.Util.HSSFColor.YELLOW.index; } }

}

/// <summary>
/// 針對excel的Oledb
/// </summary>
public class OleDbExcel
{
    /// <summary>
    /// OLEDB鏈接
    /// </summary>
    public OleDbConnection Connection
    {
        get;
        set;
    }

    /// <summary>
    /// 用Oledb對Excel進行操做
    /// 注:必須是標準表形式Excel內容
    /// </summary>
    /// <param name="excelFile">Excel文件</param>
    public OleDbExcel(string excelFile)
    {
        string conStr = string.Empty;
        FileInfo file = new FileInfo(excelFile);
        if (!file.Exists) { throw new Exception("文件不存在"); }
        string extension = file.Extension;
        switch (extension)
        {
            case ".xls":
                conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excelFile + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
                break;
            case ".xlsx":
                conStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFile + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'";
                break;
            default:
                conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excelFile + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
                break;
        }

        //連接Excel
        Connection = new OleDbConnection(conStr);
    }

    private List<string> tableNames;

    /// <summary>
    /// 獲取Excel內的Sheet名稱
    /// </summary>
    public List<string> Sheets
    {
        get
        {
            if (tableNames == null)
            {
                try
                {
                    tableNames = new List<string>();
                    //讀取Excel裏面的sheet名
                    Connection.Open();

                    DataTable schemaTable = Connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

                    for (int i = 0; i < schemaTable.Rows.Count; i++)
                    {
                        DataRow dr = schemaTable.Rows[i];
                        string tbName = dr["table_name"].ToString();
                        if (tbName[tbName.Length - 1] == '$')
                        {
                            tableNames.Add(tbName);
                        }
                    }
                    Connection.Close();
                }
                catch (Exception ex)
                {
                    if (Connection.State != ConnectionState.Closed)
                    {
                        Connection.Close();
                    }
                    throw new Exception(ex.Message, ex);
                }
            }
            return tableNames;
        }
    }

    /// <summary>
    /// 查詢出全部數據
    /// </summary>
    /// <param name="tableName">Sheet名稱</param>
    /// <returns>sheet內的全部數據</returns>
    public DataSet QueryAll(string tableName)
    {
        try
        {
            DataSet excelData = new DataSet();
            OleDbDataAdapter adapter = new OleDbDataAdapter();
            adapter.SelectCommand = new OleDbCommand();
            adapter.SelectCommand.Connection = Connection;
            adapter.SelectCommand.CommandText = string.Format("SELECT * FROM {0}", "[" + tableName + "]");
            adapter.Fill(excelData);
            return excelData;
        }
        catch (Exception ex)
        {
            if (Connection.State != ConnectionState.Closed)
            {
                Connection.Close();
            }
            throw new Exception(ex.Message, ex);
        }
    }

    /// <summary>
    /// 查詢出全部數據
    /// </summary>
    /// <param name="tableIndex">Sheet序號(從0開始)</param>
    /// <returns>sheet內的全部數據</returns>
    public DataSet QueryAll(int tableIndex)
    {
        return QueryAll(Sheets[tableIndex]);
    }

    /// <summary>
    /// 利用Sql進行查詢
    /// </summary>
    /// <param name="sql">Sql語句</param>
    /// <returns>查詢出的數據</returns>
    public DataSet Query(string sql)
    {
        try
        {
            DataSet excelData = new DataSet();
            OleDbDataAdapter adapter = new OleDbDataAdapter(sql, Connection);
            adapter.Fill(excelData);
            return excelData;
        }
        catch (Exception ex)
        {
            if (Connection.State != ConnectionState.Closed)
            {
                Connection.Close();
            }
            throw new Exception(ex.Message, ex);
        }
    }

    /// <summary>
    /// 利用Sql進行查詢
    /// </summary>
    /// <param name="sql">Sql語句</param>
    /// <param name="param">查詢參數</param>
    /// <returns>查詢出的數據</returns>
    public DataSet Query(string sql, params OleDbParameter[] param)
    {
        try
        {
            DataSet excelData = new DataSet();
            OleDbDataAdapter adapter = new OleDbDataAdapter(sql, Connection);
            adapter.SelectCommand.Parameters.AddRange(param);
            adapter.Fill(excelData);
            return excelData;
        }
        catch (Exception ex)
        {
            if (Connection.State != ConnectionState.Closed)
            {
                Connection.Close();
            }
            throw new Exception(ex.Message, ex);
        }
    }

    /// <summary>
    /// 利用Sql進行數據操做
    /// </summary>
    /// <param name="sql">sql語句</param>
    /// <returns>影響的行數</returns>
    public int ExecuteSql(string sql)
    {
        try
        {
            Connection.Open();
            OleDbCommand cmd = Connection.CreateCommand();
            cmd.CommandText = sql;
            int rtn = cmd.ExecuteNonQuery();
            Connection.Close();
            return rtn;
        }
        catch (Exception ex)
        {
            if (Connection.State != ConnectionState.Closed)
            {
                Connection.Close();
            }
            throw new Exception(ex.Message, ex);
        }
    }

    /// <summary>
    /// 利用Sql進行數據操做
    /// </summary>
    /// <param name="sql">sql語句</param>
    /// <param name="param">執行參數</param>
    /// <returns>影響的行數</returns>
    public int ExecuteSql(string sql, params OleDbParameter[] param)
    {
        try
        {
            Connection.Open();
            OleDbCommand cmd = Connection.CreateCommand();
            cmd.CommandText = sql;
            cmd.Parameters.AddRange(param);
            int rtn = cmd.ExecuteNonQuery();
            Connection.Close();
            return rtn;
        }
        catch (Exception ex)
        {
            if (Connection.State != ConnectionState.Closed)
            {
                Connection.Close();
            }
            throw new Exception(ex.Message, ex);
        }
    }
}
View Code

三、後臺引用字體

    [HttpPost]
        public ActionResult Import(HttpPostedFileBase importfile, SGM_ShenHeForm form, int? pageSize, int? CurrentPageIndex, int? ReplaceFlag = 0)
        {
            importfile = Request.Files["importfile"];
            if (importfile == null)
            {
                return Content("<script>alert('未選擇文件!');history.go(-1);</script>");
            } 

        NPOIExcel excel = new NPOIExcel(importfile.InputStream, importfile.FileName); var ITEM_SERI_STR = excel.ReadValue(i, 2); //獲取excel裏的值 }

四、界面、JSui

  <div style="margin-top: 10px; margin-bottom: 5px; position: relative; overflow-y: hidden;display:inline">
                        <input type="button" id="btnImport" value="導入" />
                        <input name="importfile" id="importfile" type="file" style="opacity: 0; filter: alpha(opacity=0); width: 80px; font-size: 15px; position: absolute; top: 0; left: 0; margin-left: -15px;" accept=".xls,.xlsx"
                            onchange=" $.messager.progress({title: '請稍候',msg: '正在處理數據...'});Import();" />
                    </div>
  function Import() {
        debugger;
        var old = $("#f1").attr("action");  //form 表單的ID
        $("#f1").attr("action", "@Url.Action("Import")");
        $("#f1").attr("enctype", "multipart/form-data");
        $("#f1").submit();
        $("#f1").attr("action", old);
    }

前臺也能夠是不用表單形式,放一個 <input type="file" name="upfile" value=" " /> 按鈕提交到後臺一個方法,方法裏接收filethis

 五、效果spa

點擊導入按鈕後彈出選擇文件框,選擇excel文件後(雙擊或者打開)直接提交後臺debug

相關文章
相關標籤/搜索