ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Excel帮助类

2022-07-15 17:00:26  阅读:144  来源: 互联网

标签:case 帮助 string int Excel sheetName startCol public


using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SmooreCommon.Excel
{
    /// <summary>
    /// NPOIExcel
    /// </summary>
    public class NPOIHelper
    {
        /// <summary>
        /// 记录打开的Excel的路径
        /// </summary>
        private string npoiFileName;
        /// <summary>
        /// 工作簿,全局变量
        /// </summary>
        protected IWorkbook workbook;
        /// <summary>
        /// 获取工作表或是创建的
        /// </summary>
        private NPOI.SS.UserModel.ISheet sheet;
        /// <summary>
        /// 构造方法
        /// </summary>
        public NPOIHelper()
        {
            npoiFileName = "";
            workbook = new XSSFWorkbook();
        }
        /// <summary>
        /// 打开
        /// </summary>
        /// <param name="filename">excel文件路径</param>
        public void Open(string filename)
        {
            using (FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read))
            {
                string ext = Path.GetExtension(filename).ToLower();
                if (ext == ".xlsx")
                    workbook = new XSSFWorkbook(fileStream);
                else
                {
                    workbook = new HSSFWorkbook(fileStream);
                }
            }
            npoiFileName = filename;
        }
        /// <summary>
        /// 创建一个Excel对象,该对象为可见的
        /// </summary>
        public void Create(string sheetname = "Sheet1")
        {
            sheet = workbook.CreateSheet(sheetname);
        }

        /// <summary>
        /// 获取一个工作表
        /// </summary>
        /// <param name="SheetName">工作表名称</param>
        /// <returns></returns>
        public ISheet GetSheet(string SheetName)
        {
            return (sheet = workbook.GetSheet(SheetName) ?? workbook.CreateSheet(SheetName));
        }
        /// <summary>
        /// 添加一个工作表
        /// </summary>
        /// <param name="SheetName">工作表名称</param>
        /// <returns></returns>
        public ISheet AddSheet(string SheetName)
        {
            ISheet s = workbook.CreateSheet(SheetName);
            return s;
        }
        /// <summary>
        /// 删除一个工作表
        /// </summary>
        /// <param name="SheetName">工作表名称</param>
        public void DelSheet(string SheetName)
        {
            int index = workbook.GetNameIndex(SheetName);
            workbook.RemoveSheetAt(index);
        }
        /// <summary>
        /// 重命名一个工作表
        /// </summary>
        /// <param name="OldSheetName">老工作表名称</param>
        /// <param name="NewSheetName">新工作表名称</param>
        /// <returns></returns>
        public ISheet ReNameSheet(string OldSheetName, string NewSheetName)
        {
            int index = workbook.GetNameIndex(OldSheetName);
            workbook.SetSheetName(index, NewSheetName);
            return workbook.GetSheetAt(index);
        }
        /// <summary>
        /// 设置单元格的值
        /// </summary>
        /// <param name="sheetName">工作表名称</param>
        /// <param name="row">行</param>
        /// <param name="col">列</param>
        /// <param name="value">设置的值</param>
        private void SetCellValue(ISheet sheetName, int row, int col, object value)
        {
            if (value == null) return;
            IRow _row = sheetName.GetRow(row) ?? sheetName.CreateRow(row);
            ICell cell = _row.GetCell(col) ?? _row.CreateCell(col);
            string valuetype = value.GetType().Name.ToLower();
            switch (valuetype)
            {
                case "string"://字符串类型   
                case "system.string":
                case "datetime":
                case "system.datetime"://日期类型  
                case "boolean"://布尔型   
                case "system.boolean"://布尔型    
                    cell.SetCellType(CellType.String);
                    cell.SetCellValue(value.ToString());
                    break;
                case "byte":
                case "int":
                case "int16":
                case "int32":
                case "int64":
                case "system.int16"://整型   
                case "system.int32":
                case "system.int64":
                case "system.byte":
                    cell.SetCellType(CellType.Numeric);
                    cell.SetCellValue(Convert.ToInt32(value));
                    break;
                case "single":
                case "system.single":
                case "double":
                case "system.double":
                case "decimal":
                case "system.decimal":
                    cell.SetCellType(CellType.Numeric);
                    cell.SetCellValue(Convert.ToDouble(value));
                    break;
                case "dbnull"://空值处理   
                case "system.dbnull"://空值处理   
                    cell.SetCellValue("");
                    break;
                default:
                    cell.SetCellValue(value.ToString());
                    break;
            }
        }
        /// <summary>
        /// 要设值的工作表的名称 X行Y列 value 值
        /// </summary>
        /// <param name="sheetName">工作表名</param>
        /// <param name="row">行</param>
        /// <param name="col">列</param>
        /// <param name="value">插入的值</param>
        public void SetCellValue(string sheetName, int row, int col, object value)
        {
            ISheet s = GetSheet(sheetName);
            SetCellValue(s, row, col, value);
        }
        /// <summary>
        /// 获取单元格值
        /// </summary>
        /// <param name="sheetName">工作表名</param>
        /// <param name="row">行</param>
        /// <param name="col">列</param>
        /// <returns></returns>
        public ICell GetCell(string sheetName, int row, int col)
        {
            return GetSheet(sheetName).GetRow(row).Cells[col];
        }

        /// <summary>
        /// 获取单元格值
        /// </summary>
        /// <param name="sheetName">工作表名</param>
        /// <param name="row">行</param>
        /// <param name="col">列</param>
        /// <returns></returns>
        private ICell GetCell(ISheet sheetName, int row, int col)
        {

            //return ws.GetRow(row).Cells[col];
            return sheetName.GetRow(row).GetCell(col);
        }

        /// <summary>
        /// 设置单元格的属性(字体,大小,颜色,对齐方式)(前提是该行列范围内有值,否则报错)
        /// </summary>
        /// <param name="sheetName"></param>
        /// <param name="startRow">起始行</param>
        /// <param name="startCol">起始列</param>
        /// <param name="endRow">结束行</param>
        /// <param name="endCol">结束列</param>
        /// <param name="fontName">字体</param>
        /// <param name="indexedColors">字体颜色</param>
        /// <param name="fontSize">字体大小</param>
        /// <param name="horizontalAlignment">水平排列</param>
        public void SetCellProperty(string sheetName, int startRow, int startCol, int endRow, int endCol, string fontName, IndexedColors indexedColors, int fontSize, HorizontalAlignment horizontalAlignment)
        {
            SetCellProperty(GetSheet(sheetName), startRow, startCol, endRow, endCol, fontName, indexedColors, fontSize, horizontalAlignment);
        }

        /// <summary>
        /// 设置一个单元格的属性(字体,大小,颜色,对齐方式)
        /// </summary>
        /// <param name="sheetName"></param>
        /// <param name="Startx"></param>
        /// <param name="Starty"></param>
        /// <param name="Endx"></param>
        /// <param name="Endy"></param>
        /// <param name="fontName"></param>
        /// <param name="indexedColors"></param>
        /// <param name="fontSize"></param>
        /// <param name="horizontalAlignment"></param>
        private void SetCellProperty(ISheet sheetName, int startRow, int startCol, int endRow, int endCol, string fontName, IndexedColors indexedColors, int fontSize, HorizontalAlignment horizontalAlignment)
        {
            ICellStyle style = workbook.CreateCellStyle();
            IFont font = workbook.CreateFont();
            font.Color = indexedColors.Index;
            font.FontName = fontName;
            font.FontHeightInPoints = (short)fontSize;
            //font.Boldweight = Boldweight;//字体加粗
            style.Alignment = horizontalAlignment;
            //style.VerticalAlignment = VerticalAlignment.Center; //垂直居中
            style.SetFont(font);
            foreach (ICell cell in GetCellsOfRange(sheetName, startRow, startCol, endRow, endCol))
            {
                cell.CellStyle = style;
                cell.CellStyle.BorderLeft = BorderStyle.Thin;
                cell.CellStyle.BorderRight = BorderStyle.Thin;
                cell.CellStyle.BorderTop = BorderStyle.Thin;
                cell.CellStyle.BorderBottom = BorderStyle.Thin;
            }
        }

        /// <summary>
        /// 获取起止范围内的行列值
        /// </summary>
        /// <param name="sheetName"></param>
        /// <param name="startRow"></param>
        /// <param name="startCol"></param>
        /// <param name="endRow"></param>
        /// <param name="endCol"></param>
        /// <returns></returns>
        public IList<ICell> GetCellsOfRange(string sheetName, int startRow, int startCol, int endRow, int endCol)
        {
            return (GetCellsOfRange(GetSheet(sheetName), startRow, startCol, endRow, endCol));
        }

        /// <summary>
        /// 获取起止范围内的行列值
        /// </summary>
        /// <param name="sheetName"></param>
        /// <param name="startRow"></param>
        /// <param name="startCol"></param>
        /// <param name="endRow"></param>
        /// <param name="endCol"></param>
        /// <returns></returns>
        private IList<ICell> GetCellsOfRange(ISheet sheetName, int startRow, int startCol, int endRow, int endCol)
        {
            IList<ICell> allCell = new List<ICell>();
            for (int i = startRow; i <= endRow; i++)
                for (int j = startCol; j <= endCol; j++)
                {
                    allCell.Add(GetCell(sheetName, i, j));
                }
            return allCell;
        }

        /// <summary>
        /// 合并单元格
        /// </summary>
        /// <param name="sheetName"></param>
        /// <param name="startRow"></param>
        /// <param name="endRow"></param>
        /// <param name="startCol"></param>
        /// <param name="endCol"></param>
        private void MergedCells(ISheet sheetName, int startRow, int endRow, int startCol, int endCol)
        {
            //CellRangeAddress四个参数为:起始行,结束行,起始列,结束列
            sheetName.AddMergedRegion(new CellRangeAddress(startRow, endRow, startCol, endCol));
        }
        /// <summary>
        /// 合并单元格
        /// </summary>
        /// <param name="sheetName"></param>
        /// <param name="startRow"></param>
        /// <param name="startCol"></param>
        /// <param name="endRow"></param>
        /// <param name="endCol"></param>
        public void MergedCells(string sheetName, int startRow, int startCol, int endRow, int endCol)
        {
            MergedCells(GetSheet(sheetName), startRow, endRow, startCol, endCol);
        }

        /// <summary>
        /// 文档另存为
        /// </summary>
        /// <param name="FileName"></param>
        /// <returns></returns>
        public bool SaveAs(string FileName)
        {
            npoiFileName = FileName;
            try
            {
                using (FileStream fs = new FileStream(FileName, FileMode.Create, FileAccess.Write))
                {
                    workbook.Write(fs);
                }
                return true;
            }
            catch
            {
                return false;
            }
        }
        /// <summary>
        /// 关闭
        /// </summary>
        public void Close()
        {
            workbook.Close();
        }
        /// <summary>
        /// 自适应宽度
        /// </summary>
        /// <param name="sheetName">表名</param>
        /// <param name="startCol">起始列</param>
        /// <param name="endCol">结束列</param>
        public void AutoColumnWidth(string sheetName, int startCol, int endCol)
        {
            AutoColumnWidth(GetSheet(sheetName), startCol, endCol);
        }
        /// <summary>
        /// 自适应宽度
        /// </summary>
        /// <param name="sheet"></param>
        /// <param name="cols"></param>
        private void AutoColumnWidth(ISheet sheet, int startCol, int endCol)
        {
            for (int col = startCol; col <= endCol; col++)
            {
                sheet.AutoSizeColumn(col);//但是其实还是比实际文本要宽
            }
        }

        /// <summary>
        /// 设置起止范围的行高,单位为磅
        /// </summary>
        /// <param name="sheetName">工作表名称</param>
        /// <param name="startRow">起始行</param>
        /// <param name="endRow">结束行</param>
        /// <param name="heightValue">设置的高值</param>
        public void SetRowsHeight(string sheetName, int startRow, int endRow, int heightValue)
        {
            ISheet sheet = GetSheet(sheetName);
            for (int i = startRow; i <= endRow; i++)
            {
                //sheet.GetRow(i).Height = Height * 20;
                sheet.GetRow(i).HeightInPoints = heightValue;
            }
        }

        /// <summary>
        /// 设置起止列的宽度,单位为字符
        /// </summary>
        /// <param name="sheetName">工作表名称</param>
        /// <param name="startCol">起始列</param>
        /// <param name="endCol">结束列</param>
        /// <param name="widthValue">设置的宽度值</param>
        public void SetColumnsWidth(string sheetName, int startCol, int endCol, int widthValue)
        {
            ISheet sheet = GetSheet(sheetName);
            for (int j = startCol; j <= endCol; j++)
            {
                sheet.SetColumnWidth(3, widthValue * 256);
            }
        }
        /// <summary>
        /// 插入新行
        /// </summary>
        /// <param name="sheetName">工作表名</param>
        /// <param name="insertRowIndex">插入的行索引位置</param>
        /// <param name="insertRowCount">插入的行数量</param>
        /// <param name="formatRowIndex">获取插入行的参照样式的行索引</param>
        public void InsertRow(string sheetName, int insertRowIndex, int insertRowCount, int formatRowIndex)
        {
            ISheet sheet = GetSheet(sheetName);
            IRow formatRow = sheet.GetRow(formatRowIndex);
            InsertRow(sheet, insertRowIndex, insertRowCount, formatRow);
        }


        /// <summary>
        /// 插入新行
        /// </summary>
        /// <param name="sheetName"></param>
        /// <param name="insertRowIndex"></param>
        /// <param name="insertRowCount"></param>
        /// <param name="formatRow"></param>
        private void InsertRow(ISheet sheetName, int insertRowIndex, int insertRowCount, IRow formatRow)
        {
            sheet.ShiftRows(insertRowIndex, sheet.LastRowNum, insertRowCount, true, false);
            for (int i = insertRowIndex; i < insertRowIndex + insertRowCount; i++)
            {
                IRow targetRow = null;
                ICell sourceCell = null;
                ICell targetCell = null;
                targetRow = sheet.CreateRow(i);
                for (int m = formatRow.FirstCellNum; m < formatRow.LastCellNum; m++)
                {
                    sourceCell = formatRow.GetCell(m);
                    if (sourceCell == null)
                    {
                        continue;
                    }
                    targetCell = targetRow.CreateCell(m);
                    targetCell.CellStyle = sourceCell.CellStyle;
                    targetCell.SetCellType(sourceCell.CellType);

                }
            }

            for (int i = insertRowIndex; i < insertRowIndex + insertRowCount; i++)
            {
                IRow firstTargetRow = sheet.GetRow(i);
                ICell firstSourceCell = null;
                ICell firstTargetCell = null;

                for (int m = formatRow.FirstCellNum; m < formatRow.LastCellNum; m++)
                {
                    firstSourceCell = formatRow.GetCell(m, MissingCellPolicy.CREATE_NULL_AS_BLANK);
                    if (firstSourceCell == null)
                    {
                        continue;
                    }
                    firstTargetCell = firstTargetRow.GetCell(m, MissingCellPolicy.CREATE_NULL_AS_BLANK);
                    firstTargetCell.CellStyle = firstSourceCell.CellStyle;
                    firstTargetCell.SetCellType(firstSourceCell.CellType);
                }
            }
        }


    }
}

 

标签:case,帮助,string,int,Excel,sheetName,startCol,public
来源: https://www.cnblogs.com/request/p/16482025.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有