zoukankan      html  css  js  c++  java
  • 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
    }
  • 相关阅读:
    背包问题
    计蒜客lev3
    线段树BIT操作总结
    图论题收集
    Codeforces Round #607 (Div. 2) 训练总结及A-F题解
    2-sat 学习笔记
    洛谷 P3338 【ZJOI2014】力/BZOJ 3527 力 题解
    $noi.ac$ #51 array 题解
    洛谷 P3292 【SCOI2016】幸运数字/BZOJ 4568 幸运数字 题解
    洛谷 P5283 【十二省联考2019】异或粽子 题解
  • 原文地址:https://www.cnblogs.com/weiweixiang/p/5690981.html
Copyright © 2011-2022 走看看