NPOI操作Excel辅助类

/// <summary>
/// NPOI操作excel辅助类
/// </summary>
public static class NPOIHelper
{
    #region 定义与初始化
    public static HSSFWorkbook workbook;
    [Flags]
    public enum LinkType
    {
        网址,
        档案,
        邮件,
        内容
    };

    private static void InitializeWorkbook()
    {
        if (workbook == null)
            workbook = new HSSFWorkbook();
        DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
        dsi.Company = "測試公司";
        workbook.DocumentSummaryInformation = dsi;

        SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
        si.Subject = "測試公司Excel檔案";
        si.Title = "測試公司Excel檔案";
        si.Author = "killysss";
        si.Comments = "謝謝您的使用!";
        workbook.SummaryInformation = si;
    }
    #endregion

    #region 资料形态转换
    public static void WriteSteamToFile(MemoryStream ms, string FileName)
    {
        FileStream fs = new FileStream(FileName, FileMode.Create, FileAccess.Write);
        byte[] data = ms.ToArray();

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

        data = null;
        ms = null;
        fs = null;
    }
    public static void WriteSteamToFile(byte[] data, string FileName)
    {
        FileStream fs = new FileStream(FileName, FileMode.Create, FileAccess.Write);
        fs.Write(data, 0, data.Length);
        fs.Flush();
        fs.Close();
        data = null;
        fs = null;
    }
    public static Stream WorkBookToStream(HSSFWorkbook InputWorkBook)
    {
        MemoryStream ms = new MemoryStream();
        InputWorkBook.Write(ms);
        ms.Flush();
        ms.Position = 0;
        return ms;
    }
    public static HSSFWorkbook StreamToWorkBook(Stream InputStream)
    {
        HSSFWorkbook WorkBook = new HSSFWorkbook(InputStream);
        return WorkBook;
    }
    public static HSSFWorkbook MemoryStreamToWorkBook(MemoryStream InputStream)
    {
        HSSFWorkbook WorkBook = new HSSFWorkbook(InputStream as Stream);
        return WorkBook;
    }
    public static MemoryStream WorkBookToMemoryStream(HSSFWorkbook InputStream)
    {
        //Write the stream data of workbook to the root directory
        MemoryStream file = new MemoryStream();
        InputStream.Write(file);
        return file;
    }
    public static Stream FileToStream(string FileName)
    {
        FileInfo fi = new FileInfo(FileName);
        if (fi.Exists == true)
        {
            FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read);
            return fs;
        }
        else return null;
    }
    public static Stream MemoryStreamToStream(MemoryStream ms)
    {
        return ms as Stream;
    }
    #endregion

    #region DataTable与Excel资料格式转换
    /// <summary>
    /// 将DataTable转成Stream输出.
    /// </summary>
    /// <param name="SourceTable">The source table.</param>
    /// <returns></returns>
    public static Stream RenderDataTableToExcel(DataTable SourceTable)
    {
        HSSFWorkbook workbook = new HSSFWorkbook();
        InitializeWorkbook();

        MemoryStream ms = new MemoryStream();
        ISheet sheet = workbook.CreateSheet();
        IRow headerRow = sheet.CreateRow(0);

        // 处理标题
        foreach (DataColumn column in SourceTable.Columns)
            headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);

        // 处理内容
        int rowIndex = 1;

        foreach (DataRow row in SourceTable.Rows)
        {
            IRow dataRow = sheet.CreateRow(rowIndex);

            foreach (DataColumn column in SourceTable.Columns)
            {
                dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
            }

            rowIndex++;
        }

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

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

        return ms;
    }

    /// <summary>
    /// 将DataTable转成Workbook(自定资料型态)输出.
    /// </summary>
    /// <param name="SourceTable">The source table.</param>
    /// <returns></returns>
    public static HSSFWorkbook RenderDataTableToWorkBook(DataTable SourceTable)
    {
        HSSFWorkbook workbook = new HSSFWorkbook();
        InitializeWorkbook();
        MemoryStream ms = new MemoryStream();
        ISheet sheet = workbook.CreateSheet();
        IRow headerRow = sheet.CreateRow(0);

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

        // handling value.
        int rowIndex = 1;

        foreach (DataRow row in SourceTable.Rows)
        {
            IRow dataRow = sheet.CreateRow(rowIndex);

            foreach (DataColumn column in SourceTable.Columns)
            {
                dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
            }

            rowIndex++;
        }
        return workbook;
    }

    /// <summary>
    /// 将DataTable资料输出成档案。
    /// </summary>
    /// <param name="SourceTable">The source table.</param>
    /// <param name="FileName">文件保存路径</param>
    public static void RenderDataTableToExcel(DataTable SourceTable, string FileName)
    {
        MemoryStream ms = RenderDataTableToExcel(SourceTable) as MemoryStream;
        WriteSteamToFile(ms, FileName);
    }

    /// <summary>
    /// 从流读取资料到DataTable.
    /// </summary>
    /// <param name="ExcelFileStream">The excel file stream.</param>
    /// <param name="SheetName">Name of the sheet.</param>
    /// <param name="HeaderRowIndex">Index of the header row.</param>
    /// <param name="HaveHeader">if set to <c>true</c> [have header].</param>
    /// <returns></returns>
    public static DataTable RenderDataTableFromExcel(Stream ExcelFileStream, string SheetName, bool HaveHeader)
    {
        workbook = new HSSFWorkbook(ExcelFileStream);
        InitializeWorkbook();
        ISheet sheet = workbook.GetSheet(SheetName);

        DataTable table = new DataTable();

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

        for (int i = headerRow.FirstCellNum; i < cellCount; i++)
        {
            string ColumnName = (HaveHeader == true) ? headerRow.GetCell(i).StringCellValue : "f" + i.ToString();
            DataColumn column = new DataColumn(ColumnName);
            table.Columns.Add(column);
        }

        int rowCount = sheet.LastRowNum;
        int RowStart = (HaveHeader == true) ? sheet.FirstRowNum + 1 : sheet.FirstRowNum;
        for (int i = RowStart; i <= sheet.LastRowNum; i++)
        {
            IRow row = sheet.GetRow(i);
            DataRow dataRow = table.NewRow();

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

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


    /// <summary>
    /// 從位元流讀取資料到DataTable.
    /// </summary>
    /// <param name="ExcelFileStream">The excel file stream.</param>
    /// <param name="SheetIndex">Index of the sheet.</param>
    /// <param name="HeaderRowIndex">Index of the header row.</param>
    /// <param name="HaveHeader">if set to <c>true</c> [have header].</param>
    /// <returns></returns>
    public static DataTable RenderDataTableFromExcel(Stream ExcelFileStream, int SheetIndex, bool HaveHeader)
    {
        workbook = new HSSFWorkbook(ExcelFileStream);
        InitializeWorkbook();
        ISheet sheet = workbook.GetSheetAt(SheetIndex);

        DataTable table = new DataTable();

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

        for (int i = headerRow.FirstCellNum; i < cellCount; i++)
        {
            string ColumnName = (HaveHeader == true) ? headerRow.GetCell(i).StringCellValue : "f" + i.ToString();
            DataColumn column = new DataColumn(ColumnName);
            table.Columns.Add(column);
        }

        int rowCount = sheet.LastRowNum;
        int RowStart = (HaveHeader == true) ? sheet.FirstRowNum + 1 : sheet.FirstRowNum;
        for (int i = RowStart; i <= sheet.LastRowNum; i++)
        {
            IRow row = sheet.GetRow(i);
            DataRow dataRow = table.NewRow();

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

            table.Rows.Add(dataRow);
        }

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

    #region List<T>与Excel资料格式转换
    public static Stream RenderListToExcel<T>(List<T> SourceList)
    {
        workbook = new HSSFWorkbook();
        InitializeWorkbook();

        MemoryStream ms = new MemoryStream();
        ISheet sheet = workbook.CreateSheet();
        IRow headerRow = sheet.CreateRow(0);

        PropertyInfo[] properties = typeof(T).GetProperties();

        int columIndex = 0;
        foreach (PropertyInfo column in properties)
        {
            headerRow.CreateCell(columIndex).SetCellValue(column.Name);
            columIndex++;
        }

        int rowIndex = 1;
        foreach (T item in SourceList)
        {
            IRow dataRow = sheet.CreateRow(rowIndex);
            columIndex = 0;

            foreach (PropertyInfo column in properties)
            {
                dataRow.CreateCell(columIndex).SetCellValue(column.GetValue(item, null) == null ? "" : column.GetValue(item, null).ToString());
                columIndex++;
            }
            rowIndex++;
        }

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

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

        return ms;
    }

    public static Stream RenderListToExcel<T>(List<T> SourceList, Dictionary<string, string> head)
    {
        workbook = new HSSFWorkbook();
        InitializeWorkbook();

        MemoryStream ms = new MemoryStream();
        ISheet sheet = workbook.CreateSheet();
        IRow headerRow = sheet.CreateRow(0);

        PropertyInfo[] properties = typeof(T).GetProperties();

        int columIndex = 0;
        foreach (PropertyInfo column in properties)
        {
            headerRow.CreateCell(columIndex).SetCellValue(head[column.Name] == null ? column.Name : head[column.Name].ToString());
            columIndex++;
        }

        int rowIndex = 1;
        foreach (T item in SourceList)
        {
            IRow dataRow = sheet.CreateRow(rowIndex);
            columIndex = 0;

            foreach (PropertyInfo column in properties)
            {
                dataRow.CreateCell(columIndex).SetCellValue(column.GetValue(item, null) == null ? "" : column.GetValue(item, null).ToString());
                columIndex++;
            }
            rowIndex++;
        }

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

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

        return ms;
    }

    public static HSSFWorkbook RenderListToWorkbook<T>(List<T> SourceList)
    {
        workbook = new HSSFWorkbook();
        InitializeWorkbook();

        ISheet sheet = workbook.CreateSheet();
        IRow headerRow = sheet.CreateRow(0);

        PropertyInfo[] properties = typeof(T).GetProperties();

        int columIndex = 0;
        foreach (PropertyInfo column in properties)
        {
            headerRow.CreateCell(columIndex).SetCellValue(column.Name);
            columIndex++;
        }

        int rowIndex = 1;
        foreach (T item in SourceList)
        {
            IRow dataRow = sheet.CreateRow(rowIndex);
            columIndex = 0;

            foreach (PropertyInfo column in properties)
            {
                dataRow.CreateCell(columIndex).SetCellValue(column.GetValue(item, null) == null ? "" : column.GetValue(item, null).ToString());
                columIndex++;
            }
            rowIndex++;
        }

        return workbook;
    }

    public static HSSFWorkbook RenderListToWorkbook<T>(List<T> SourceList, Dictionary<string, string> head)
    {
        workbook = new HSSFWorkbook();
        InitializeWorkbook();

        ISheet sheet = workbook.CreateSheet();
        IRow headerRow = sheet.CreateRow(0);

        PropertyInfo[] properties = typeof(T).GetProperties();

        int columIndex = 0;
        foreach (PropertyInfo column in properties)
        {
            headerRow.CreateCell(columIndex).SetCellValue(head[column.Name] == null ? column.Name : head[column.Name].ToString());
            columIndex++;
        }

        int rowIndex = 1;
        foreach (T item in SourceList)
        {
            IRow dataRow = sheet.CreateRow(rowIndex);
            columIndex = 0;

            foreach (PropertyInfo column in properties)
            {
                dataRow.CreateCell(columIndex).SetCellValue(column.GetValue(item, null) == null ? "" : column.GetValue(item, null).ToString());
                columIndex++;
            }
            rowIndex++;
        }

        return workbook;
    }

    public static void RenderListToExcel<T>(List<T> SourceList, string FileName)
    {
        MemoryStream ms = RenderListToExcel(SourceList) as MemoryStream;
        WriteSteamToFile(ms, FileName);
    }

    public static void RenderListToExcel<T>(List<T> SourceList, Dictionary<string, string> head, string FileName)
    {
        MemoryStream ms = RenderListToExcel(SourceList, head) as MemoryStream;
        WriteSteamToFile(ms, FileName);
    }

    public static List<T> RenderListFromExcel<T>(Stream ExcelFileStream, string SheetName)
    {
        workbook = new HSSFWorkbook(ExcelFileStream);
        InitializeWorkbook();

        ISheet sheet = workbook.GetSheet(SheetName);
        IRow headerRow = sheet.GetRow(sheet.FirstRowNum);
        int cellCount = headerRow.LastCellNum;

        List<T> list = new List<T>();

        for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)
        {
            IRow row = sheet.GetRow(i);
            T t = Activator.CreateInstance<T>();
            PropertyInfo[] properties = t.GetType().GetProperties();
            foreach (PropertyInfo column in properties)
            {
                int j = headerRow.Cells.FindIndex(delegate(ICell c)
                {
                    return c.StringCellValue == column.Name;
                });

                if (j >= 0 && row.GetCell(j) != null)
                {
                    object value = ToType(column.PropertyType, row.GetCell(j).ToString());
                    column.SetValue(t, value, null);
                }
            }

            list.Add(t);
        }
        return list;
    }

    public static List<T> RenderListFromExcel<T>(Stream ExcelFileStream, int SheetIndex)
    {
        workbook = new HSSFWorkbook(ExcelFileStream);
        InitializeWorkbook();

        ISheet sheet = workbook.GetSheetAt(SheetIndex);
        IRow headerRow = sheet.GetRow(sheet.FirstRowNum);
        int cellCount = headerRow.LastCellNum;

        List<T> list = new List<T>();

        for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)
        {
            IRow row = sheet.GetRow(i);
            T t = Activator.CreateInstance<T>();
            PropertyInfo[] properties = t.GetType().GetProperties();
            foreach (PropertyInfo column in properties)
            {
                int j = headerRow.Cells.FindIndex(delegate(ICell c)
                {
                    return c.StringCellValue == column.Name;
                });

                if (j >= 0 && row.GetCell(j) != null)
                {
                    object value = ToType(column.PropertyType, row.GetCell(j).ToString());
                    column.SetValue(t, value, null);
                }
            }

            list.Add(t);
        }
        return list;
    }

    public static List<T> RenderListFromExcel<T>(Stream ExcelFileStream, string SheetName, Dictionary<string, string> head)
    {
        workbook = new HSSFWorkbook(ExcelFileStream);
        InitializeWorkbook();

        ISheet sheet = workbook.GetSheet(SheetName);
        IRow headerRow = sheet.GetRow(sheet.FirstRowNum);
        int cellCount = headerRow.LastCellNum;

        List<T> list = new List<T>();

        for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)
        {
            IRow row = sheet.GetRow(i);
            T t = Activator.CreateInstance<T>();
            PropertyInfo[] properties = t.GetType().GetProperties();
            foreach (PropertyInfo column in properties)
            {
                int j = headerRow.Cells.FindIndex(delegate(ICell c)
                {
                    return c.StringCellValue == (head[column.Name] == null ? column.Name : head[column.Name].ToString());
                });

                if (j >= 0 && row.GetCell(j) != null)
                {
                    object value = ToType(column.PropertyType, row.GetCell(j).ToString());
                    column.SetValue(t, value, null);
                }
            }

            list.Add(t);
        }
        return list;
    }

    public static List<T> RenderListFromExcel<T>(Stream ExcelFileStream, int SheetIndex, Dictionary<string, string> head)
    {
        workbook = new HSSFWorkbook(ExcelFileStream);
        InitializeWorkbook();

        ISheet sheet = workbook.GetSheetAt(SheetIndex);
        IRow headerRow = sheet.GetRow(sheet.FirstRowNum);
        int cellCount = headerRow.LastCellNum;

        List<T> list = new List<T>();

        for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)
        {
            IRow row = sheet.GetRow(i);
            T t = Activator.CreateInstance<T>();
            PropertyInfo[] properties = t.GetType().GetProperties();
            foreach (PropertyInfo column in properties)
            {
                int j = headerRow.Cells.FindIndex(delegate(ICell c)
                {
                    return c.StringCellValue == (head[column.Name] == null ? column.Name : head[column.Name].ToString());
                });

                if (j >= 0 && row.GetCell(j) != null)
                {
                    object value = ToType(column.PropertyType, row.GetCell(j).ToString());
                    column.SetValue(t, value, null);
                }
            }

            list.Add(t);
        }
        return list;
    }

    public static object ToType(Type type, string value)
    {
        if (type == typeof(string))
        {
            return value;
        }

        MethodInfo parseMethod = null;

        foreach (MethodInfo mi in type.GetMethods(BindingFlags.Static
            | BindingFlags.Public))
        {
            if (mi.Name == "Parse" && mi.GetParameters().Length == 1)
            {
                parseMethod = mi;
                break;
            }
        }

        if (parseMethod == null)
        {
            throw new ArgumentException(string.Format(
                "Type: {0} has not Parse static method!", type));
        }

        return parseMethod.Invoke(null, new object[] { value });
    }
    #endregion

    #region 字符串阵列与Excel资料格式转换
    /// <summary>
    /// 建立datatable
    /// </summary>
    /// <param name="ColumnName">欄位名用逗號分隔</param>
    /// <param name="value">data陣列 , rowmajor</param>
    /// <returns>DataTable</returns>
    public static DataTable CreateDataTable(string ColumnName, string[,] value)
    {
        /*  輸入範例
        string cname = " name , sex ";
        string[,] aaz = new string[4, 2];
        for (int q = 0; q < 4; q++)
            for (int r = 0; r < 2; r++)
                aaz[q, r] = "1";
        dataGridView1.DataSource = NewMediaTest1.Model.Utility.DataSetUtil.CreateDataTable(cname, aaz);
        */
        int i, j;
        DataTable ResultTable = new DataTable();
        string[] sep = new string[] { "," };

        string[] TempColName = ColumnName.Split(sep, StringSplitOptions.RemoveEmptyEntries);
        DataColumn[] CName = new DataColumn[TempColName.Length];
        for (i = 0; i < TempColName.Length; i++)
        {
            DataColumn c1 = new DataColumn(TempColName[i].ToString().Trim(), typeof(object));
            ResultTable.Columns.Add(c1);
        }
        if (value != null)
        {
            for (i = 0; i < value.GetLength(0); i++)
            {
                DataRow newrow = ResultTable.NewRow();
                for (j = 0; j < TempColName.Length; j++)
                {
                    newrow[j] = string.Copy(value[i, j].ToString());

                }
                ResultTable.Rows.Add(newrow);
            }
        }
        return ResultTable;
    }
    /// <summary>
    /// Creates the string array.
    /// </summary>
    /// <param name="dt">The dt.</param>
    /// <returns></returns>
    public static string[,] CreateStringArray(DataTable dt)
    {
        int ColumnNum = dt.Columns.Count;
        int RowNum = dt.Rows.Count;
        string[,] result = new string[RowNum, ColumnNum];
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            for (int j = 0; j < dt.Columns.Count; j++)
            {
                result[i, j] = string.Copy(dt.Rows[i][j].ToString());
            }
        }
        return result;
    }
    /// <summary>
    /// 將陣列輸出成位元流.
    /// </summary>
    /// <param name="ColumnName">Name of the column.</param>
    /// <param name="SourceTable">The source table.</param>
    /// <returns></returns>
    public static Stream RenderArrayToExcel(string ColumnName, string[,] SourceTable)
    {
        DataTable dt = CreateDataTable(ColumnName, SourceTable);
        return RenderDataTableToExcel(dt);
    }
    /// <summary>
    /// 將陣列輸出成檔案.
    /// </summary>
    /// <param name="FileName">Name of the file.</param>
    /// <param name="ColumnName">Name of the column.</param>
    /// <param name="SourceTable">The source table.</param>
    public static void RenderArrayToExcel(string FileName, string ColumnName, string[,] SourceTable)
    {
        DataTable dt = CreateDataTable(ColumnName, SourceTable);
        RenderDataTableToExcel(dt, FileName);
    }
    /// <summary>
    /// 將陣列輸出成WorkBook(自訂資料型態).
    /// </summary>
    /// <param name="ColumnName">Name of the column.</param>
    /// <param name="SourceTable">The source table.</param>
    /// <returns></returns>
    public static HSSFWorkbook RenderArrayToWorkBook(string ColumnName, string[,] SourceTable)
    {
        DataTable dt = CreateDataTable(ColumnName, SourceTable);
        return RenderDataTableToWorkBook(dt);
    }

    /// <summary>
    /// 將位元流資料輸出成陣列.
    /// </summary>
    /// <param name="ExcelFileStream">The excel file stream.</param>
    /// <param name="SheetName">Name of the sheet.</param>
    /// <param name="HeaderRowIndex">Index of the header row.</param>
    /// <param name="HaveHeader">if set to <c>true</c> [have header].</param>
    /// <returns></returns>
    public static string[,] RenderArrayFromExcel(Stream ExcelFileStream, string SheetName, int HeaderRowIndex, bool HaveHeader)
    {
        workbook = new HSSFWorkbook(ExcelFileStream);
        InitializeWorkbook();
        ISheet sheet = workbook.GetSheet(SheetName);

        DataTable table = new DataTable();

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

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

        int rowCount = sheet.LastRowNum;
        int RowStart = (HaveHeader == true) ? sheet.FirstRowNum + 1 : sheet.FirstRowNum;
        for (int i = RowStart; i <= sheet.LastRowNum; i++)
        {
            IRow row = sheet.GetRow(i);
            DataRow dataRow = table.NewRow();

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

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

    /// <summary>
    /// 將位元流資料輸出成陣列.
    /// </summary>
    /// <param name="ExcelFileStream">The excel file stream.</param>
    /// <param name="SheetIndex">Index of the sheet.</param>
    /// <param name="HeaderRowIndex">Index of the header row.</param>
    /// <param name="HaveHeader">if set to <c>true</c> [have header].</param>
    /// <returns></returns>
    public static string[,] RenderArrayFromExcel(Stream ExcelFileStream, int SheetIndex, int HeaderRowIndex, bool HaveHeader)
    {
        workbook = new HSSFWorkbook(ExcelFileStream);
        InitializeWorkbook();
        ISheet sheet = workbook.GetSheetAt(SheetIndex);

        DataTable table = new DataTable();

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

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

        int rowCount = sheet.LastRowNum;
        int RowStart = (HaveHeader == true) ? sheet.FirstRowNum + 1 : sheet.FirstRowNum;
        for (int i = RowStart; i <= sheet.LastRowNum; i++)
        {
            IRow row = sheet.GetRow(i);
            DataRow dataRow = table.NewRow();

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

            table.Rows.Add(dataRow);
        }

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

    #region 超链接
    /// <summary>
    /// 在位元流儲存格中建立超連結.
    /// </summary>
    /// <param name="InputStream">The input stream.</param>
    /// <param name="SheetNameOrIndex">Index of the sheet name or.</param>
    /// <param name="LinkName">Name of the link.</param>
    /// <param name="LinkValueOrIndex">Index of the link value or.</param>
    /// <param name="s1">The s1.</param>
    /// <param name="RowIndex">Index of the row.</param>
    /// <param name="CellIndex">Index of the cell.</param>
    /// <returns></returns>
    public static Stream MakeLink(Stream InputStream, string SheetNameOrIndex, string LinkName, string LinkValueOrIndex, LinkType s1, int RowIndex, int CellIndex)
    {
        workbook = new HSSFWorkbook(InputStream);
        InitializeWorkbook();
        MemoryStream ms = new MemoryStream();
        ICellStyle hlink_style = workbook.CreateCellStyle();
        IFont hlink_font = workbook.CreateFont();
        hlink_font.Underline = FontUnderlineType.Single;
        hlink_font.Color = IndexedColors.Blue.Index;
        hlink_style.SetFont(hlink_font);
        string ResultLinkValue = string.Empty;
        int ResultSheet;
        ISheet sheet;
        if (int.TryParse(SheetNameOrIndex, out ResultSheet) == true)
            sheet = workbook.GetSheetAt(ResultSheet);
        else
            sheet = workbook.GetSheet(SheetNameOrIndex);
        ICell cell = sheet.CreateRow(RowIndex).CreateCell(CellIndex);
        cell.SetCellValue(LinkName);
        HSSFHyperlink link;
        switch (s1.ToString())
        {
            case "网址": link = new HSSFHyperlink(HyperlinkType.Url);
                ResultLinkValue = string.Copy(LinkValueOrIndex);
                break;
            case "档案": link = new HSSFHyperlink(HyperlinkType.File);
                ResultLinkValue = string.Copy(LinkValueOrIndex);
                break;
            case "邮件": link = new HSSFHyperlink(HyperlinkType.Email);
                // ResultLinkValue = string.Copy(LinkValue);   
                ResultLinkValue = "mailto:" + LinkValueOrIndex;
                break;
            case "内容":
                int result;
                link = new HSSFHyperlink(HyperlinkType.Document);
                if (int.TryParse(LinkValueOrIndex, out result) == true)
                    ResultLinkValue = "'" + workbook.GetSheetName(result) + "'!A1";
                else
                    ResultLinkValue = "'" + LinkValueOrIndex + "'!A1";
                break;
            default: link = new HSSFHyperlink(HyperlinkType.Url);
                break;
        }
        link.Address = (ResultLinkValue);
        cell.Hyperlink = (link);
        cell.CellStyle = (hlink_style);
        workbook.Write(ms);
        ms.Flush();
        return ms;
    }
    /// <summary>
    /// 在檔案儲存格中建立超連結.
    /// </summary>
    /// <param name="FileName">Name of the file.</param>
    /// <param name="InputStream">The input stream.</param>
    /// <param name="SheetNameOrIndex">Index of the sheet name or.</param>
    /// <param name="LinkName">Name of the link.</param>
    /// <param name="LinkValueOrIndex">Index of the link value or.</param>
    /// <param name="s1">The s1.</param>
    /// <param name="RowIndex">Index of the row.</param>
    /// <param name="CellIndex">Index of the cell.</param>
    public static void MakeLink(string FileName, Stream InputStream, string SheetNameOrIndex, string LinkName, string LinkValueOrIndex, LinkType s1, int RowIndex, int CellIndex)
    {
        MemoryStream ms = MakeLink(InputStream, SheetNameOrIndex, LinkName, LinkValueOrIndex, s1, RowIndex, CellIndex) as MemoryStream;
        WriteSteamToFile(ms, FileName);
    }
    /// <summary>
    /// 建立新位元流並在儲存格中建立超連結.
    /// </summary>
    /// <param name="SheetNameOrIndex">Index of the sheet name or.</param>
    /// <param name="LinkName">Name of the link.</param>
    /// <param name="LinkValueOrIndex">Index of the link value or.</param>
    /// <param name="s1">The s1.</param>
    /// <param name="RowIndex">Index of the row.</param>
    /// <param name="CellIndex">Index of the cell.</param>
    /// <returns></returns>
    public static Stream MakeLinkFromEmpty(string SheetNameOrIndex, string LinkName, string LinkValueOrIndex, LinkType s1, int RowIndex, int CellIndex)
    {

        workbook = new HSSFWorkbook();
        ISheet sheet1 = workbook.CreateSheet();
        //ISheet sheet = hssfworkbook.CreateSheet("Hyperlinks");
        ////cell style for hyperlinks
        ////by default hyperlinks are blue and underlined        
        InitializeWorkbook();
        MemoryStream ms = new MemoryStream();
        ICellStyle hlink_style = workbook.CreateCellStyle();
        IFont hlink_font = workbook.CreateFont();
        hlink_font.Underline = FontUnderlineType.Single;
        hlink_font.Color = IndexedColors.Blue.Index;
        hlink_style.SetFont(hlink_font);
        string ResultLinkValue = string.Empty;
        int ResultSheet;
        ISheet sheet;
        if (int.TryParse(SheetNameOrIndex, out ResultSheet) == true)
            sheet = workbook.GetSheetAt(ResultSheet);
        else
            sheet = workbook.GetSheet(SheetNameOrIndex);
        ICell cell = sheet.CreateRow(RowIndex).CreateCell(CellIndex);
        cell.SetCellValue(LinkName);
        HSSFHyperlink link;
        switch (s1.ToString())
        {
            case "网址": link = new HSSFHyperlink(HyperlinkType.Url);
                ResultLinkValue = string.Copy(LinkValueOrIndex);
                break;
            case "档案": link = new HSSFHyperlink(HyperlinkType.File);
                ResultLinkValue = string.Copy(LinkValueOrIndex);
                break;
            case "邮件": link = new HSSFHyperlink(HyperlinkType.Email);
                // ResultLinkValue = string.Copy(LinkValue);   
                ResultLinkValue = "mailto:" + LinkValueOrIndex;
                break;
            case "内容":
                int result;
                link = new HSSFHyperlink(HyperlinkType.Document);
                if (int.TryParse(LinkValueOrIndex, out result) == true)
                    ResultLinkValue = "'" + workbook.GetSheetName(result) + "'!A1";
                else
                    ResultLinkValue = "'" + LinkValueOrIndex + "'!A1";
                break;
            default: link = new HSSFHyperlink(HyperlinkType.Url);
                break;
        }
        link.Address = (ResultLinkValue);
        cell.Hyperlink = (link);
        cell.CellStyle = (hlink_style);
        workbook.Write(ms);
        ms.Flush();
        return ms;
    }
    /// <summary>
    /// 建立新檔案並在儲存格中建立超連結.
    /// </summary>
    /// <param name="FileName">Name of the file.</param>
    /// <param name="SheetNameOrIndex">Index of the sheet name or.</param>
    /// <param name="LinkName">Name of the link.</param>
    /// <param name="LinkValueOrIndex">Index of the link value or.</param>
    /// <param name="s1">The s1.</param>
    /// <param name="RowIndex">Index of the row.</param>
    /// <param name="CellIndex">Index of the cell.</param>
    public static void MakeLinkFromEmpty(string FileName, string SheetNameOrIndex, string LinkName, string LinkValueOrIndex, LinkType s1, int RowIndex, int CellIndex)
    {
        MemoryStream ms = MakeLinkFromEmpty(SheetNameOrIndex, LinkName, LinkValueOrIndex, s1, RowIndex, CellIndex) as MemoryStream;
        WriteSteamToFile(ms, FileName);
    }
    #endregion

    #region 设定字体字形
    public static ICellStyle SetCellStyle(IFont InputFont)
    {
        InitializeWorkbook();
        ICellStyle style1 = workbook.CreateCellStyle();
        style1.SetFont(InputFont);
        return style1;
    }
    /// <summary>
    /// 設定字體顏色大小到位元流.
    /// </summary>
    /// <param name="InputStream">The input stream.</param>
    /// <param name="FontName">Name of the font.</param>
    /// <param name="FontSize">Size of the font.</param>
    /// <param name="IsAllSheet">if set to <c>true</c> [is all sheet].</param>
    /// <param name="SheetName">Name of the sheet.</param>
    /// <returns></returns>
    public static Stream ApplyStyleToFile(Stream InputStream, string FontName, short FontSize, bool IsAllSheet, params string[] SheetName)
    {
        workbook = new HSSFWorkbook(InputStream);
        InitializeWorkbook();
        IFont font = workbook.CreateFont();
        ICellStyle Style = workbook.CreateCellStyle();
        font.FontHeightInPoints = FontSize;
        font.FontName = FontName;
        Style.SetFont(font);
        MemoryStream ms = new MemoryStream();
        int i;
        if (IsAllSheet == true)
        {
            for (i = 0; i < workbook.NumberOfSheets; i++)
            {
                ISheet Sheets = workbook.GetSheetAt(0);
                for (int k = Sheets.FirstRowNum; k <= Sheets.LastRowNum; k++)
                {
                    IRow row = Sheets.GetRow(k);
                    for (int l = row.FirstCellNum; l < row.LastCellNum; l++)
                    {
                        ICell Cell = row.GetCell(l);
                        Cell.CellStyle = Style;
                    }
                }
            }
        }
        else
        {
            for (i = 0; i < SheetName.Length; i++)
            {
                ISheet Sheets = workbook.GetSheet(SheetName[i]);
                for (int k = Sheets.FirstRowNum; k <= Sheets.LastRowNum; k++)
                {
                    IRow row = Sheets.GetRow(k);
                    for (int l = row.FirstCellNum; l < row.LastCellNum; l++)
                    {
                        ICell Cell = row.GetCell(l);
                        Cell.CellStyle = Style;
                    }
                }
            }
        }
        workbook.Write(ms);
        ms.Flush();
        return ms;
    }
    /// <summary>
    /// 設定字體顏色大小到位元流.
    /// </summary>
    /// <param name="InputStream">The input stream.</param>
    /// <param name="FontName">Name of the font.</param>
    /// <param name="FontSize">Size of the font.</param>
    /// <param name="IsAllSheet">if set to <c>true</c> [is all sheet].</param>
    /// <param name="SheetIndex">Index of the sheet.</param>
    /// <returns></returns>
    public static Stream ApplyStyleToFile(Stream InputStream, string FontName, short FontSize, bool IsAllSheet, params int[] SheetIndex)
    {
        workbook = new HSSFWorkbook(InputStream);
        InitializeWorkbook();
        MemoryStream ms = new MemoryStream();
        IFont font = workbook.CreateFont();
        ICellStyle Style = workbook.CreateCellStyle();
        font.FontHeightInPoints = FontSize;
        font.FontName = FontName;
        Style.SetFont(font);
        int i;
        if (IsAllSheet == true)
        {
            for (i = 0; i < workbook.NumberOfSheets; i++)
            {
                ISheet Sheets = workbook.GetSheetAt(0);
                for (int k = Sheets.FirstRowNum; k <= Sheets.LastRowNum; k++)
                {
                    IRow row = Sheets.GetRow(k);
                    for (int l = row.FirstCellNum; l < row.LastCellNum; l++)
                    {
                        ICell Cell = row.GetCell(l);
                        Cell.CellStyle = Style;
                    }
                }
            }
        }
        else
        {
            for (i = 0; i < SheetIndex.Length; i++)
            {
                ISheet Sheets = workbook.GetSheetAt(SheetIndex[i]);
                for (int k = Sheets.FirstRowNum; k <= Sheets.LastRowNum; k++)
                {
                    IRow row = Sheets.GetRow(k);
                    for (int l = row.FirstCellNum; l < row.LastCellNum; l++)
                    {
                        ICell Cell = row.GetCell(l);
                        Cell.CellStyle = Style;
                    }
                }
            }
        }
        workbook.Write(ms);
        ms.Flush();
        return ms;
    }
    /// <summary>
    /// 設定字體顏色大小到檔案.
    /// </summary>
    /// <param name="FileName">Name of the file.</param>
    /// <param name="InputStream">The input stream.</param>
    /// <param name="FontName">Name of the font.</param>
    /// <param name="FontSize">Size of the font.</param>
    /// <param name="IsAllSheet">if set to <c>true</c> [is all sheet].</param>
    /// <param name="SheetName">Name of the sheet.</param>
    public static void ApplyStyleToFile(string FileName, Stream InputStream, string FontName, short FontSize, bool IsAllSheet, params string[] SheetName)
    {
        MemoryStream ms = ApplyStyleToFile(InputStream, FontName, FontSize, IsAllSheet, SheetName) as MemoryStream;
        WriteSteamToFile(ms, FileName);
    }
    /// <summary>
    /// 設定字體顏色大小到檔案.
    /// </summary>
    /// <param name="FileName">Name of the file.</param>
    /// <param name="InputStream">The input stream.</param>
    /// <param name="FontName">Name of the font.</param>
    /// <param name="FontSize">Size of the font.</param>
    /// <param name="IsAllSheet">if set to <c>true</c> [is all sheet].</param>
    /// <param name="SheetIndex">Index of the sheet.</param>
    public static void ApplyStyleToFile(string FileName, Stream InputStream, string FontName, short FontSize, bool IsAllSheet, params int[] SheetIndex)
    {
        MemoryStream ms = ApplyStyleToFile(InputStream, FontName, FontSize, IsAllSheet, SheetIndex) as MemoryStream;
        WriteSteamToFile(ms, FileName);
    }
    #endregion

    #region 建立空白excel檔
    /// <summary>
    /// 建立空白excel檔到位元流.
    /// </summary>
    /// <param name="SheetName">Name of the sheet.</param>
    /// <returns></returns>
    public static Stream CreateEmptyFile(params string[] SheetName)
    {
        MemoryStream ms = new MemoryStream();
        workbook = new HSSFWorkbook();
        InitializeWorkbook();
        if (SheetName == null)
        {
            workbook.CreateSheet();
        }
        else
        {
            foreach (string temp in SheetName)
                workbook.CreateSheet(temp);
        }
        workbook.Write(ms);
        ms.Flush();
        return ms;
    }
    /// <summary>
    /// 建立空白excel檔到檔案.
    /// </summary>
    /// <param name="FileName">Name of the file.</param>
    /// <param name="SheetName">Name of the sheet.</param>
    public static void CreateEmptyFile(string FileName, params string[] SheetName)
    {
        MemoryStream ms = CreateEmptyFile(SheetName) as MemoryStream;
        WriteSteamToFile(ms, FileName);
    }
    #endregion

    #region 設定格線
    /// <summary>
    /// 設定格線到位元流.
    /// </summary>
    /// <param name="InputSteam">The input steam.</param>
    /// <param name="haveGridLine">if set to <c>true</c> [have grid line].</param>
    /// <param name="SheetName">Name of the sheet.</param>
    /// <returns></returns>
    public static Stream SetGridLine(Stream InputSteam, bool haveGridLine, params string[] SheetName)
    {
        workbook = new HSSFWorkbook(InputSteam);
        InitializeWorkbook();
        MemoryStream ms = new MemoryStream();
        if (SheetName == null)
        {
            for (int i = 0; i < workbook.NumberOfSheets; i++)
            {
                ISheet s1 = workbook.GetSheetAt(i);
                s1.DisplayGridlines = haveGridLine;
            }
        }
        else
        {
            foreach (string TempSheet in SheetName)
            {
                ISheet s1 = workbook.GetSheet(TempSheet);
                s1.DisplayGridlines = haveGridLine;
            }
        }
        workbook.Write(ms);
        ms.Flush();
        return ms;
    }
    /// <summary>
    /// 設定格線到位元流.
    /// </summary>
    /// <param name="InputSteam">The input steam.</param>
    /// <param name="haveGridLine">if set to <c>true</c> [have grid line].</param>
    /// <param name="SheetIndex">Index of the sheet.</param>
    /// <returns></returns>
    public static Stream SetGridLine(Stream InputSteam, bool haveGridLine, params int[] SheetIndex)
    {
        workbook = new HSSFWorkbook(InputSteam);
        InitializeWorkbook();
        MemoryStream ms = new MemoryStream();
        if (SheetIndex == null)
        {
            for (int i = 0; i < workbook.NumberOfSheets; i++)
            {
                ISheet s1 = workbook.GetSheetAt(i);
                s1.DisplayGridlines = haveGridLine;
            }
        }
        else
        {
            foreach (int TempSheet in SheetIndex)
            {
                ISheet s1 = workbook.GetSheetAt(TempSheet);
                s1.DisplayGridlines = haveGridLine;
            }
        }
        workbook.Write(ms);
        ms.Flush();
        return ms;
    }
    /// <summary>
    /// 設定格線到檔案.
    /// </summary>
    /// <param name="FileName">Name of the file.</param>
    /// <param name="InputSteam">The input steam.</param>
    /// <param name="haveGridLine">if set to <c>true</c> [have grid line].</param>
    /// <param name="SheetIndex">Index of the sheet.</param>
    public static void SetGridLine(string FileName, Stream InputSteam, bool haveGridLine, params int[] SheetIndex)
    {
        MemoryStream ms = SetGridLine(InputSteam, haveGridLine, SheetIndex) as MemoryStream;
        WriteSteamToFile(ms, FileName);
    }
    /// <summary>
    /// 設定格線到檔案.
    /// </summary>
    /// <param name="FileName">Name of the file.</param>
    /// <param name="InputSteam">The input steam.</param>
    /// <param name="haveGridLine">if set to <c>true</c> [have grid line].</param>
    /// <param name="SheetName">Name of the sheet.</param>
    public static void SetGridLine(string FileName, Stream InputSteam, bool haveGridLine, params string[] SheetName)
    {
        MemoryStream ms = SetGridLine(InputSteam, haveGridLine, SheetName) as MemoryStream;
        WriteSteamToFile(ms, FileName);
    }
    #endregion

    #region 擷取字串從excel檔案
    /// <summary>
    /// 從位元流將資料轉成字串輸出
    /// </summary>
    /// <param name="InputStream">The input stream.</param>
    /// <returns></returns>
    public static string ExtractStringFromFileStream(Stream InputStream)
    {
        HSSFWorkbook HBook = new HSSFWorkbook(InputStream);
        ExcelExtractor extractor = new ExcelExtractor(HBook);
        return extractor.Text;
    }
    /// <summary>
    /// 從檔案將資料轉成字串輸出
    /// </summary>
    /// <param name="FileName">Name of the file.</param>
    /// <returns></returns>
    public static string ExtractStringFromFileStream(string FileName)
    {
        FileInfo fi = new FileInfo(FileName);
        if (fi.Exists == true)
        {
            using (FileStream fs = fi.Open(FileMode.Open))
            {
                HSSFWorkbook HBook = new HSSFWorkbook(fs);
                ExcelExtractor extractor = new ExcelExtractor(HBook);
                return extractor.Text;
            }
        }
        else return null;
    }
    #endregion

    #region 設定群組

    /// <summary>
    /// 設定群組到位元流.
    /// </summary>
    /// <param name="SheetName">Name of the sheet.</param>
    /// <param name="IsRow">if set to <c>true</c> [is row].</param>
    /// <param name="From">From.</param>
    /// <param name="End">The end.</param>
    /// <returns></returns>
    public static Stream CreateGroup(string SheetName, bool IsRow, int From, int End)
    {
        MemoryStream ms = new MemoryStream();
        workbook = new HSSFWorkbook();
        InitializeWorkbook();
        ISheet sh = workbook.CreateSheet(SheetName);
        for (int i = 0; i <= End; i++)
        {
            sh.CreateRow(i);
        }
        if (IsRow == true)
            sh.GroupRow(From, End);
        else
            sh.GroupColumn((short)From, (short)End);

        workbook.Write(ms);
        ms.Flush();
        return ms;

    }
    /// <summary>
    /// 建立群組到檔案.
    /// </summary>
    /// <param name="FileName">Name of the file.</param>
    /// <param name="SheetName">Name of the sheet.</param>
    /// <param name="IsRow">if set to <c>true</c> [is row].</param>
    /// <param name="From">From.</param>
    /// <param name="End">The end.</param>
    public static void CreateGroup(string FileName, string SheetName, bool IsRow, int From, int End)
    {
        MemoryStream ms = CreateGroup(SheetName, IsRow, From, End) as MemoryStream;
        WriteSteamToFile(ms, FileName);
    }
    #endregion

    #region 從樣板建立檔案

    /// <summary>
    /// 從樣板建立位元流.
    /// </summary>
    /// <param name="TemplateFileName">Name of the template file.</param>
    /// <returns></returns>
    public static Stream CreateFileStreamFromTemplate(string TemplateFileName)
    {
        FileInfo fi = new FileInfo(TemplateFileName);
        if (fi.Exists == true)
        {
            MemoryStream ms = new MemoryStream();
            FileStream file = new FileStream(TemplateFileName, FileMode.Open, FileAccess.Read);
            workbook = new HSSFWorkbook(file);
            DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
            dsi.Company = "測試公司";
            workbook.DocumentSummaryInformation = dsi;
            ////create a entry of SummaryInformation
            SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
            si.Subject = "測試公司Excel檔案";
            si.Title = "測試公司Excel檔案";
            si.Author = "killysss";
            si.Comments = "謝謝您的使用!";
            workbook.SummaryInformation = si;
            workbook.Write(ms);
            ms.Flush();
            return ms;
        }
        else return null;
    }

    /// <summary>
    /// 從樣板建立檔案.
    /// </summary>
    /// <param name="TemplateFileName">Name of the template file.</param>
    /// <param name="OutputFileName">Name of the output file.</param>
    public static void CreateFileFromTemplate(string TemplateFileName, string OutputFileName)
    {
        FileInfo fi = new FileInfo(TemplateFileName);
        if (fi.Exists == true)
        {
            MemoryStream ms = CreateFileStreamFromTemplate(TemplateFileName) as MemoryStream;
            WriteSteamToFile(ms, OutputFileName);
        }
        else
        {

        }
    }
    #endregion

    #region 嵌入圖片
    /// <summary>
    /// Loads the image.
    /// </summary>
    /// <param name="path">The path.</param>
    /// <param name="wb">The wb.</param>
    /// <returns></returns>
    public static int LoadImage(string path, HSSFWorkbook wb)
    {
        FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read);
        byte[] buffer = new byte[file.Length];
        file.Read(buffer, 0, (int)file.Length);
        return wb.AddPicture(buffer, PictureType.JPEG);

    }
    /// <summary>
    /// 嵌入圖片到位元流.
    /// </summary>
    /// <param name="InputStream">The input stream.</param>
    /// <param name="SheetIndex">Index of the sheet.</param>
    /// <param name="PicFileName">Name of the pic file.</param>
    /// <param name="IsOriginalSize">if set to <c>true</c> [is original size].</param>
    /// <param name="RowPosition">The row position.</param>
    /// <returns></returns>
    public static Stream EmbedImage(Stream InputStream, int SheetIndex, string PicFileName, bool IsOriginalSize, int[] RowPosition)
    {
        workbook = new HSSFWorkbook(InputStream);
        InitializeWorkbook();
        MemoryStream ms = new MemoryStream();
        ISheet sheet1 = workbook.GetSheetAt(SheetIndex);
        IDrawing patriarch = sheet1.CreateDrawingPatriarch();
        //create the anchor
        HSSFClientAnchor anchor;
        anchor = new HSSFClientAnchor(0, 0, 0, 0,
            RowPosition[0], RowPosition[1], RowPosition[2], RowPosition[3]);
        anchor.AnchorType = AnchorType.MoveDontResize;
        //load the picture and get the picture index in the workbook
        IPicture picture = patriarch.CreatePicture(anchor, LoadImage(PicFileName, workbook));
        //Reset the image to the original size.
        if (IsOriginalSize == true)
            picture.Resize();
        //Line Style
        //picture.LineStyle = LineStyle.None;
        workbook.Write(ms);
        ms.Flush();
        return ms;
    }
    /// <summary>
    /// 嵌入圖片到檔案.
    /// </summary>
    /// <param name="FileName">Name of the file.</param>
    /// <param name="SheetIndex">Index of the sheet.</param>
    /// <param name="InputStream">The input stream.</param>
    /// <param name="PicFileName">Name of the pic file.</param>
    /// <param name="IsOriginalSize">if set to <c>true</c> [is original size].</param>
    /// <param name="RowPosition">The row position.</param>
    public static void EmbedImage(string FileName, int SheetIndex, Stream InputStream, string PicFileName, bool IsOriginalSize, int[] RowPosition)
    {
        MemoryStream ms = EmbedImage(InputStream, SheetIndex, PicFileName, IsOriginalSize, RowPosition) as MemoryStream;
        WriteSteamToFile(ms, FileName);
    }
    /// <summary>
    /// 建立新位元流並嵌入圖片.
    /// </summary>
    /// <param name="PicFileName">Name of the pic file.</param>
    /// <param name="IsOriginalSize">if set to <c>true</c> [is original size].</param>
    /// <param name="RowPosition">The row position.</param>
    /// <returns></returns>
    public static Stream EmbedImage(string PicFileName, bool IsOriginalSize, int[] RowPosition)
    {
        workbook = new HSSFWorkbook();
        InitializeWorkbook();
        MemoryStream ms = new MemoryStream();
        ISheet sheet1 = workbook.CreateSheet();
        IDrawing patriarch = sheet1.CreateDrawingPatriarch();
        //create the anchor
        HSSFClientAnchor anchor;
        anchor = new HSSFClientAnchor(0, 0, 0, 0,
            RowPosition[0], RowPosition[1], RowPosition[2], RowPosition[3]);
        anchor.AnchorType = AnchorType.MoveDontResize;
        //load the picture and get the picture index in the workbook
        IPicture picture = patriarch.CreatePicture(anchor, LoadImage(PicFileName, workbook));
        //Reset the image to the original size.
        if (IsOriginalSize == true)
            picture.Resize();
        //Line Style
        //picture.LineStyle = LineStyle.None;
        workbook.Write(ms);
        ms.Flush();
        return ms;
    }
    /// <summary>
    /// 建立新檔案並嵌入圖片.
    /// </summary>
    /// <param name="ExcelFileName">Name of the excel file.</param>
    /// <param name="PicFileName">Name of the pic file.</param>
    /// <param name="IsOriginalSize">if set to <c>true</c> [is original size].</param>
    /// <param name="RowPosition">The row position.</param>
    public static void EmbedImage(string ExcelFileName, string PicFileName, bool IsOriginalSize, int[] RowPosition)
    {
        MemoryStream ms = EmbedImage(PicFileName, IsOriginalSize, RowPosition) as MemoryStream;
        WriteSteamToFile(ms, ExcelFileName);
    }
    #endregion

    #region 合併儲存格
    /// <summary>
    /// 合併儲存格於位元流.
    /// </summary>
    /// <param name="InputStream">The input stream.</param>
    /// <param name="SheetIndex">Index of the sheet.</param>
    /// <param name="RowFrom">The row from.</param>
    /// <param name="ColumnFrom">The column from.</param>
    /// <param name="RowTo">The row to.</param>
    /// <param name="ColumnTo">The column to.</param>
    /// <returns></returns>
    public static Stream MergeCell(Stream InputStream, int SheetIndex, int RowFrom, int ColumnFrom, int RowTo, int ColumnTo)
    {
        workbook = new HSSFWorkbook(InputStream);
        InitializeWorkbook();
        MemoryStream ms = new MemoryStream();
        InitializeWorkbook();
        ISheet sheet1 = workbook.GetSheetAt(SheetIndex);
        sheet1.AddMergedRegion(new CellRangeAddress(RowFrom, ColumnFrom, RowTo, ColumnTo));
        workbook.Write(ms);
        ms.Flush();
        return ms;
    }
    /// <summary>
    /// 合併儲存格於檔案.
    /// </summary>
    /// <param name="FileName">Name of the file.</param>
    /// <param name="InputStream">The input stream.</param>
    /// <param name="SheetIndex">Index of the sheet.</param>
    /// <param name="RowFrom">The row from.</param>
    /// <param name="ColumnFrom">The column from.</param>
    /// <param name="RowTo">The row to.</param>
    /// <param name="ColumnTo">The column to.</param>
    public static void MergeCell(string FileName, Stream InputStream, int SheetIndex, int RowFrom, int ColumnFrom, int RowTo, int ColumnTo)
    {
        MemoryStream ms = MergeCell(InputStream, SheetIndex, RowFrom, ColumnFrom, RowTo, ColumnTo) as MemoryStream;
        WriteSteamToFile(ms, FileName);
    }
    /// <summary>
    /// 建立新位元流並合併儲存格.
    /// </summary>
    /// <param name="RowFrom">The row from.</param>
    /// <param name="ColumnFrom">The column from.</param>
    /// <param name="RowTo">The row to.</param>
    /// <param name="ColumnTo">The column to.</param>
    /// <returns></returns>
    public static Stream MergeCell(int RowFrom, int ColumnFrom, int RowTo, int ColumnTo)
    {
        workbook = new HSSFWorkbook();
        InitializeWorkbook();
        MemoryStream ms = new MemoryStream();
        InitializeWorkbook();
        ISheet sheet1 = workbook.CreateSheet();
        sheet1.AddMergedRegion(new CellRangeAddress(RowFrom, ColumnFrom, RowTo, ColumnTo));
        workbook.Write(ms);
        ms.Flush();
        return ms;
    }
    /// <summary>
    /// 建立新檔案並合併儲存格.
    /// </summary>
    /// <param name="FileName">Name of the file.</param>
    /// <param name="RowFrom">The row from.</param>
    /// <param name="ColumnFrom">The column from.</param>
    /// <param name="RowTo">The row to.</param>
    /// <param name="ColumnTo">The column to.</param>
    public static void MergeCell(string FileName, int RowFrom, int ColumnFrom, int RowTo, int ColumnTo)
    {
        MemoryStream ms = MergeCell(RowFrom, ColumnFrom, RowTo, ColumnTo) as MemoryStream;
        WriteSteamToFile(ms, FileName);
    }
    #endregion

    #region 設定儲存格公式
    /// <summary>
    /// 設定儲存格公式於位元流.
    /// </summary>
    /// <param name="InputStream">The input stream.</param>
    /// <param name="SheetIndex">Index of the sheet.</param>
    /// <param name="Formula">The formula.</param>
    /// <param name="RowIndex">Index of the row.</param>
    /// <param name="ColumnIndex">Index of the column.</param>
    /// <returns></returns>
    public static Stream SetFormula(Stream InputStream, int SheetIndex, string Formula, int RowIndex, int ColumnIndex)
    {
        //here, we must insert at least one sheet to the workbook. otherwise, Excel will say 'data lost in file'
        //So we insert three sheet just like what Excel does
        workbook = new HSSFWorkbook(InputStream);
        InitializeWorkbook();
        MemoryStream ms = new MemoryStream();
        ISheet sheet1 = workbook.GetSheetAt(SheetIndex);
        sheet1.CreateRow(RowIndex).CreateCell(ColumnIndex).SetCellFormula(Formula);
        workbook.Write(ms);
        ms.Flush();
        return ms;
    }
    /// <summary>
    /// 設定儲存格公式於檔案.
    /// </summary>
    /// <param name="FileName">Name of the file.</param>
    /// <param name="InputStream">The input stream.</param>
    /// <param name="SheetIndex">Index of the sheet.</param>
    /// <param name="Formula">The formula.</param>
    /// <param name="RowIndex">Index of the row.</param>
    /// <param name="ColumnIndex">Index of the column.</param>
    public static void SetFormula(string FileName, Stream InputStream, int SheetIndex, string Formula, int RowIndex, int ColumnIndex)
    {
        MemoryStream ms = SetFormula(InputStream, SheetIndex, Formula, RowIndex, ColumnIndex) as MemoryStream;
        WriteSteamToFile(ms, FileName);
    }
    /// <summary>
    /// 建立新位元流並設定儲存格公式.
    /// </summary>
    /// <param name="Formula">The formula.</param>
    /// <param name="RowIndex">Index of the row.</param>
    /// <param name="ColumnIndex">Index of the column.</param>
    /// <returns></returns>
    public static Stream SetFormula(string Formula, int RowIndex, int ColumnIndex)
    {
        //here, we must insert at least one sheet to the workbook. otherwise, Excel will say 'data lost in file'
        //So we insert three sheet just like what Excel does
        workbook = new HSSFWorkbook();
        InitializeWorkbook();
        MemoryStream ms = new MemoryStream();
        ISheet sheet1 = workbook.CreateSheet();
        sheet1.CreateRow(RowIndex).CreateCell(ColumnIndex).SetCellFormula(Formula);
        workbook.Write(ms);
        ms.Flush();
        return ms;
    }
    /// <summary>
    /// 建立新檔案並設定儲存格公式.
    /// </summary>
    /// <param name="FileName">Name of the file.</param>
    /// <param name="Formula">The formula.</param>
    /// <param name="RowIndex">Index of the row.</param>
    /// <param name="ColumnIndex">Index of the column.</param>
    public static void SetFormula(string FileName, string Formula, int RowIndex, int ColumnIndex)
    {
        MemoryStream ms = SetFormula(Formula, RowIndex, ColumnIndex) as MemoryStream;
        WriteSteamToFile(ms, FileName);
    }
    #endregion
}
posted @ 2016-07-21 11:02  a boy  阅读(1142)  评论(1编辑  收藏  举报