NPOI入门指南:轻松操作Excel文件的.NET库

news2025/2/21 10:39:08

目录

引言

一、NPOI概述

二、NPOI的主要用途

三、安装NPOI库

四、NPOI基本使用

六、性能优化和内存管理

七、常见问题与解决方案

八、结论

附录


引言

Excel文件作为数据处理的重要工具,广泛应用于各种场景。然而,在没有安装Microsoft Office的环境下,如何高效地操作Excel文件成为了一个挑战。NPOI库的出现,为我们提供了一个强大的解决方案。本文将详细介绍NPOI库的基本使用方法和高级特性,帮助读者轻松操作Excel文件。

一、NPOI概述

NPOI是一个开源的.NET库,它允许开发者在无需安装Microsoft Office的情况下读写Excel文件。NPOI构建在Apache POI项目之上,并提供了丰富的API来操作Excel文件。NPOI支持xls(Excel 97-2003)和xlsx(Excel 2007及更高版本)两种文件格式,并且兼容大部分Excel的特性,如单元格样式、数据格式、公式等。

与其他类似库相比,NPOI具有以下优势:

  • 无需安装Office:NPOI不依赖于Microsoft Office,可以在没有Office的环境下运行。
  • 支持多种文件格式:除了xls和xlsx外,NPOI还支持docx文件格式的读写。
  • 丰富的Excel特性支持:NPOI包含了大部分Excel的特性,如单元格样式、数据格式、公式等。
二、NPOI的主要用途
  1. Excel文件的读写:NPOI允许开发者在不需要安装Microsoft Office的情况下,对Excel文件进行读写操作。这对于需要在没有Office环境的服务器上进行数据处理的应用非常有用。
  2. 支持多种文件格式:除了Excel文件(xls、xlsx)外,NPOI还支持Word文件(docx)的读写。
  3. 丰富的Excel特性支持:NPOI包含了大部分Excel的特性,如单元格样式、数据格式、公式等,使得开发者能够更灵活地操作Excel文件。
三、安装NPOI库

安装NPOI库非常简单,只需要通过NuGet包管理器即可。在Visual Studio中,右键点击项目 -> 选择“管理NuGet程序包” -> 在“浏览”选项卡中搜索“NPOI” -> 点击“安装”按钮即可。

四、NPOI基本使用

        

  • 文件内容示例

  • 代码示例 

 

/// <summary>
/// 简单读取文件内容
/// </summary>
static void SimpleRead()
{
    //文件路径
    string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "01.xlsx");
    //判断文件路径,存在则继续
    if (File.Exists(filePath))
    {
        //文件流
        FileStream fs = null;
        //Excel工作簿操作对象
        IWorkbook workbook = null;
        //开启异常捕捉
        try
        {
            StringBuilder sb = new StringBuilder();
            //定义文件流打开
            fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            //定义工作簿
            workbook = new XSSFWorkbook(fs);
            //读取工作表数量
            var numberOfSheets = workbook.NumberOfSheets;
            //判断工作表数量,大于零则继续
            if (numberOfSheets > 0)
            {
                //获取第一个工作表
                var sheet0 = workbook.GetSheetAt(0);
                sb.AppendLine($"工作表名称:{sheet0.SheetName}");
                sb.AppendLine($"行数量:{sheet0.LastRowNum + 1}");
                if (sheet0.LastRowNum >= 0)
                {
                    //读取每一行信息
                    for (int i = 0; i <= sheet0.LastRowNum; i++)
                    {
                        var row = sheet0.GetRow(i);
                        if (row != null)
                        {
                            sb.Append($"第{i + 1}行数据:");
                            //获取最后一列
                            var lastCellNum = row.LastCellNum;
                            for (int j = 0; j < lastCellNum; j++)
                            {
                                //获取单元格
                                var cell = row.GetCell(j);
                                object cellValue = null;
                                if (cell != null)
                                {
                                    #region 根据不同单元格格式提取内容
                                    switch (cell.CellType)
                                    {
                                        case CellType.Boolean: cellValue = cell.BooleanCellValue; break;
                                        case CellType.Numeric: cellValue = cell.NumericCellValue; break;
                                        case CellType.Formula:
                                            var cachedCellType = cell.GetCachedFormulaResultTypeEnum();
                                            switch (cachedCellType)
                                            {
                                                case CellType.Boolean: cellValue = cell.BooleanCellValue; break;
                                                case CellType.Numeric: cellValue = cell.NumericCellValue; break;
                                                default: cellValue = cell.StringCellValue; break;
                                            }
                                            break;
                                        default: cellValue = cell.StringCellValue; break;
                                    }
                                    #endregion
                                }
                                sb.Append($"\t{cellValue}");
                            }
                            sb.AppendLine();
                        }
                    }
                }
                Console.WriteLine(sb.ToString());
            }
            //关闭相关资源
            workbook.Close();
            workbook = null;
            //关闭相关资源
            fs.Close();
            fs = null;
        }
        catch (Exception ex)
        {
            //显示异常信息
            Console.WriteLine($"发生异常:{ex.Message}");
        }
        finally
        {
            //关闭工作簿
            if (workbook != null)
            {
                workbook.Close();
            }
            //关闭文件流
            if (fs != null)
            {
                fs.Close();
            }
        }
    }
}
  • 运行结果

 简单文件写入

代码示例

/// <summary>
/// 简单写文件内容
/// </summary>
static void SimpleWrite()
{
    //文件路径
    string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "02.xlsx");

    //文件流
    FileStream fs = null;
    //Excel工作簿操作对象
    IWorkbook workbook = null;
    //开启异常捕捉
    try
    {
        #region 判断或创建文件
        var dir = Path.GetDirectoryName(filePath);
        if (!Directory.Exists(dir))
        {
            Directory.CreateDirectory(dir);
        }
        if (!File.Exists(filePath))
        {
            using (FileStream stream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
            using (var wb = new XSSFWorkbook())
            {
                wb.Write(stream);
                wb.Close();
                stream.Close();
            }
        }
        #endregion

        //定义工作簿
        workbook = new XSSFWorkbook();
        #region 预防性处理工作表
        ISheet sheet = workbook.CreateSheet("数据");
        #region 第一行,标题:时间,内容
        var row1 = sheet.CreateRow(0);
        row1.CreateCell(0).SetCellValue("时间");
        row1.CreateCell(1).SetCellValue("内容");
        #endregion
        #region 增加几行数据
        int rowIndex = 1;
        for (int i = 0; i < 10; i++)
        {
            var row = sheet.CreateRow(rowIndex++);
            row.CreateCell(0).SetCellValue(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
            row.CreateCell(1).SetCellValue(Guid.NewGuid().ToString().ToUpper());
        }
        #endregion
        //自适应
        sheet.AutoSizeColumn(0);
        sheet.AutoSizeColumn(1);
        #endregion
        #region 保存
        using (fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
        {
            workbook.Write(fs);
        }
        #endregion
        //关闭相关资源
        workbook.Close();
        workbook = null;
        //关闭相关资源
        fs.Close();
        fs = null;
    }
    catch (Exception ex)
    {
        //显示异常信息
        Console.WriteLine($"发生异常:{ex.Message}");
    }
    finally
    {
        //关闭工作簿
        if (workbook != null)
        {
            workbook.Close();
        }
        //关闭文件流
        if (fs != null)
        {
            fs.Close();
        }
    }
}

运行结果 

定义单元格格式

代码示例

/// <summary>
/// 11 加粗 格式
/// </summary>
/// <param name="workbook"></param>
/// <returns></returns>
static ICellStyle GetHeaderStyle(IWorkbook workbook)
{
    var style = GetStyle(workbook, true);
    style.FillPattern = FillPattern.SolidForeground;
    style.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Grey25Percent.Index;
    return style;
}
/// <summary>
/// 红色背景 格式
/// </summary>
/// <param name="workbook"></param>
/// <returns></returns>
static ICellStyle GetRedBackNormalStyle(IWorkbook workbook)
{
    var style = GetStyle(workbook);
    style.FillPattern = FillPattern.SolidForeground;
    style.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Red.Index;
    return style;
}
/// <summary>
/// 红色字体 格式
/// </summary>
/// <param name="workbook"></param>
/// <returns></returns>
static ICellStyle GetRedNormalStyle(IWorkbook workbook)
{
    IFont font = workbook.CreateFont();
    font.Color = IndexedColors.Red.Index;
    font.FontHeightInPoints = 11;
    return GetStyle(workbook, font);
}
/// <summary>
/// 常规 格式
/// </summary>
/// <param name="workbook"></param>
/// <returns></returns>
static ICellStyle GetNormalStyle(IWorkbook workbook)
{
    return GetStyle(workbook);
}
/// <summary>
/// 时间 格式
/// </summary>
/// <param name="workbook"></param>
/// <returns></returns>
static ICellStyle GetDateTimeStyle(IWorkbook workbook)
{
    return GetStyle(workbook, false, 11, "yyyy-mm-dd hh:mm:ss");
}
/// <summary>
/// 数字 格式
/// </summary>
/// <param name="workbook"></param>
/// <returns></returns>
static ICellStyle GetIntStyle(IWorkbook workbook)
{
    return GetStyle(workbook, false, 11, "0");
}

/// <summary>
/// 浮点数 格式
/// </summary>
/// <param name="workbook"></param>
/// <returns></returns>
static ICellStyle GetFloatStyle(IWorkbook workbook)
{
    return GetStyle(workbook, false, 11, "0.00");
}

/// <summary>
/// 设定格式
/// </summary>
/// <param name="workbook">工作簿</param>
/// <param name="isBold">是否粗体,默认非粗体</param>
/// <param name="fontHeightInPoints">字高度(理解为字大小)</param>
/// <param name="dataFormat">自定义格式</param>
/// <param name="isWrapText">是否自动换行,默认是</param>
/// <returns></returns>
static ICellStyle GetStyle(IWorkbook workbook,
    bool isBold = false,
    double fontHeightInPoints = 11,
    string dataFormat = "",
    bool isWrapText = true)
{
    IFont font = workbook.CreateFont();
    font.IsBold = isBold;
    font.FontHeightInPoints = fontHeightInPoints;
    return GetStyle(workbook, font, dataFormat, isWrapText);
}
/// <summary>
/// 设定格式
/// </summary>
/// <param name="workbook">工作簿</param>
/// <param name="dataFormat">自定义格式</param>
/// <param name="isWrapText">是否自动换行,默认是</param>
/// <returns></returns>
static ICellStyle GetStyle(IWorkbook workbook,
    IFont font,
    string dataFormat = "",
    bool isWrapText = true)
{
    ICellStyle style = workbook.CreateCellStyle();
    style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
    style.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
    style.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
    style.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
    style.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
    style.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
    if (!string.IsNullOrWhiteSpace(dataFormat))
    {
        style.DataFormat = HSSFDataFormat.GetBuiltinFormat(dataFormat);
        if (style.DataFormat == -1) {
            IDataFormat format = workbook.CreateDataFormat();
            style.DataFormat = format.GetFormat(dataFormat);
        }
    }
    style.SetFont(font);
    style.WrapText = isWrapText;
    return style;
}

日常使用1

  • 代码示例

 /// <summary>
        /// 日常应用
        /// </summary>
        static void CommonApplicaiton()
        {
            //文件路径
            string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "03.xlsx");

            //文件流
            FileStream fs = null;
            //Excel工作簿操作对象
            IWorkbook workbook = null;
            //开启异常捕捉
            try
            {
                #region 判断或创建文件
                var dir = Path.GetDirectoryName(filePath);
                if (!Directory.Exists(dir))
                {
                    Directory.CreateDirectory(dir);
                }
                if (!File.Exists(filePath))
                {
                    using (FileStream stream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
                    using (var wb = new XSSFWorkbook())
                    {
                        wb.Write(stream);
                        wb.Close();
                        stream.Close();
                    }
                }
                #endregion

                //定义工作簿
                workbook = new XSSFWorkbook();
                //整数格式单元格样式
                var intStyle = GetIntStyle(workbook);
                //时间格式单元格样式
                var dateTimeStyle = GetDateTimeStyle(workbook);
                //普通单元格样式
                var normalStyle = GetNormalStyle(workbook);
                //标题样式
                var headerStyle = GetHeaderStyle(workbook);
                #region 创建工作表
                ISheet sheet = workbook.CreateSheet("数据");
                #region 第一行,标题:序号,时间,整数随机数
                var row1 = sheet.CreateRow(0);
                var orderCell = row1.CreateCell(0);
                orderCell.CellStyle = headerStyle;
                orderCell.SetCellValue("序号");
                sheet.SetColumnWidth(0, 3 * 512);

                var timeCell = row1.CreateCell(1);
                timeCell.CellStyle = headerStyle;
                timeCell.SetCellValue("时间");
                sheet.SetColumnWidth(1, 10 * 512);

                var randomCell = row1.CreateCell(2);
                randomCell.CellStyle = headerStyle;
                randomCell.SetCellValue("整数随机数");
                sheet.SetColumnWidth(2, 10 * 512);

                #endregion
                #region 增加几行数据
                Random random = new Random();
                int rowIndex = 1;
                for (int i = 0; i < 10; i++)
                {
                    var row = sheet.CreateRow(rowIndex++);
                    //序号,直接用公式
                    var cell1 = row.CreateCell(0);
                    cell1.CellStyle = normalStyle;
                    cell1.CellFormula = "ROW()-1";

                    var cell2 = row.CreateCell(1);
                    cell2.SetCellValue(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                    cell2.CellStyle = normalStyle;                    

                    var cell3 = row.CreateCell(2);
                    cell3.CellStyle = intStyle;
                    cell3.SetCellValue(random.Next());
                }
                #endregion

                #endregion
                #region 保存
                using (fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
                {
                    workbook.Write(fs);
                }
                #endregion
                //关闭相关资源
                workbook.Close();
                workbook = null;
                //关闭相关资源
                fs.Close();
                fs = null;
            }
            catch (Exception ex)
            {
                //显示异常信息
                Console.WriteLine($"发生异常:{ex.Message}");
            }
            finally
            {
                //关闭工作簿
                if (workbook != null)
                {
                    workbook.Close();
                }
                //关闭文件流
                if (fs != null)
                {
                    fs.Close();
                }
            }
        }

运行结果 

 

五、高级特性应用

  1. 数据验证

NPOI支持在Excel单元格中设置数据验证规则,例如限制输入的数据类型、范围等。

  1. 条件格式化

使用NPOI可以创建条件格式化规则,根据单元格的值改变其外观(如颜色、字体等)。

  1. 图表

NPOI支持创建和编辑Excel图表,包括柱状图、折线图、饼图等。

六、性能优化和内存管理
  1. 使用流(Stream)来读写文件

使用FileStream而不是将整个文件加载到内存中,以提高性能和减少内存使用。

  1. 及时释放资源

在操作完Excel文件后,确保释放所有相关的资源,如FileStreamIWorkbook等。

七、常见问题与解决方案
  1. 无法打开xlsx文件

确保已正确安装NPOI库,并且使用了正确的文件路径和文件名。

  1. 单元格样式不生效

检查是否已正确创建和应用了单元格样式。

八、结论

NPOI库为.NET环境下的Excel文件操作提供了强大的支持。通过本文的介绍,相信读者已经掌握了NPOI库的基本使用方法和高级特性。鼓励大家尝试使用NPOI来处理Excel文件,并分享自己的使用经验和技巧。

附录
  • 更多内容请参考以下网址https://github.com/nissl-lab/npoi

  • NPOI官方文档链接:NPOI官方网站
  • 相关资源下载地址:[NPOI NuGet包](NuGet Gallery | NPOI 2.7.0

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1875842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最近写javaweb出现的一个小bug---前端利用 form 表单传多项数据,后端 Servlet 取出的各项数据均为空

目录&#xff1a; 一. 问题引入二 解决问题 一. 问题引入 近在写一个 java web 项目时&#xff0c;遇到一个让我头疼了晚上的问题&#xff1a;前端通过 post 提交的 form 表单数据可以传到后端&#xff0c;但当我从 Servlet 中通过 request.getParameter(“name”) 拿取各项数…

正版软件 | R-Studio Corporate:企业级数据恢复的终极解决方案

数据是企业的生命线&#xff0c;而数据丢失可能随时威胁到企业的正常运营。R-Studio Corporate 是一款专为企业环境设计的多功能数据恢复软件&#xff0c;确保您在面临数据危机时&#xff0c;能够迅速、高效地恢复宝贵数据。 跨平台操作&#xff0c;灵活恢复 R-Studio Corporat…

小时候的子弹击中了现在的我-hive进阶:案例解析(第18天)

系列文章目录 一、Hive表操作 二、数据导入和导出 三、分区表 四、官方文档&#xff08;了解&#xff09; 五、分桶表&#xff08;熟悉&#xff09; 六、复杂类型&#xff08;熟悉&#xff09; 七、Hive乱码解决&#xff08;操作。可以不做&#xff0c;不影响&#xff09; 八、…

收银系统源码-千呼新零售2.0【线上营销】

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货等连锁店使用。 详细介绍请查看&a…

WINDOWS+PHP+Mysql+Apache环境中部署SQLi-Labs、XSS-Labs、UPload-Labs、DVWA、pikachu等靶场环境

web渗透测试学习&#xff0c;需要自己搭建一些靶场&#xff0c;本人主要介绍在WINDOWSPHPMysqlApache环境中部署SQLi-Labs、XSS-Labs、UPload-Labs、DVWA、pikachu等靶场环境。以下是靶场代码下载的链接&#xff1a; pikachu靶场代码 链接&#xff1a;https://pan.baidu.com/s…

GEO数据挖掘-富集分析、TinyArray简化流程、多组样本分析more

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 富集分析一些理论知识具体代码 富集不到的补救措施更多资料---问题数据和常见错误分析Part4-复杂数据及其分析多分组数据分析流程 tinyarray简化版本分析流程多分组…

Interview preparation--Elasticsearch写入原理与调优

ES的写入过程 ES支持的写操作 create&#xff1a; create操作不同于put操作&#xff0c;put操作的时候如果当前put的数据存在则会被覆盖&#xff0c;如果put操作的时候加上操作类型create&#xff0c;如果数据存在则会返回失败&#xff0c;比如&#xff1a;PUT /pruduct/_cre…

实测2024年最佳的三款Socks5代理IP网站

一、引言 在浩瀚的网络世界中&#xff0c;Socks5代理IP服务如同导航灯塔&#xff0c;指引我们穿越数据海洋&#xff0c;安全、稳定地访问目标网站。作为专业的测评团队&#xff0c;我们深知一款优秀的Socks5代理IP网站需要具备哪些特质&#xff1a;稳定的IP资源、高效的连接速…

QT基本对话框(基本对话框、工具盒类、进度条、调色板与电子钟、可扩展对话框、程序启动画面)

此篇文章通过实例介绍基本对话框的用法。首先介绍标准文件对话框&#xff08;QFileDialog&#xff09;、标准颜色对话框&#xff08;QColorDialog&#xff09;、标准字体对话框&#xff08;QFontDialog&#xff09;、标准输入对话框&#xff08;QInputDialog&#xff09;以及标…

AI绘画 Stable Diffusion【特效文字】:火焰特效艺术字,轻松搞定特效生成!

大家好&#xff0c;我是画画的小强 今天我们继续艺术字系列的分享&#xff0c;艺术字的玩法很多&#xff0c;今天给大家带来的是火焰特效艺术字的制作。我们先来看火焰特效艺术字的效果图。 一. 火焰特效文字的制作方法 【第一步】&#xff1a;制作底图 这里制作底图使用白底…

VMware Workstation 安装 Centos 虚拟机

1. 下载 VMware Workstation 直接上网找官网下载即可 2. 下载 Centos 镜像 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 3.打开 VMware 创建虚拟机 3.1点击创建虚拟机 3.2 选择自定义安装 3.3 选择使用 Workstation 的版本 版本越高兼容性越低但性能越好&#xff0c;一…

2024年Stable Diffusion应用入门,AI绘画超详细兼职攻略,从零开始!

. AI绘画&#xff1a; 利用AI工具在AI绘画上的应用非常广泛&#xff0c;涵盖了从艺术创作到工业设计等多个领域。 目前市面上有许多AI绘画软件和工具&#xff0c;适合不同需求的用户。 例如&#xff0c;Midjourney、DALL-E 2、Stable Diffusion、DreamStudio等都是较为知名的…

深入了解Qt 控件:Display Widgets部件(1) 以及 QT自定义控件(电池)

QT自定义控件(电池&#xff09; 在线调色板Qt之CSS专栏Chapter1 QT自定义控件(电池&#xff09;Chapter2 Qt教程 — 3.5 深入了解Qt 控件&#xff1a;Display Widgets部件(1)1 Display Widgets简介2 如何使用Display Widgets部件 Chapter3 Qt自定义控件电池组件使用前言一、最基…

AIGC实战:LLaMA2打造中文写作利器——数据准备与模型训练全攻略

目录 一、下载并加载中文数据集二、中文数据集处理 1、数据格式 2、数据集处理之tokenizer训练格式 1&#xff09;先将一篇篇文本拼凑到一起&#xff08;只是简单的拼凑一起&#xff0c;用于训练tokenizer&#xff09; 2&#xff09;将数据集进行合并 3、数据集处理之模型&am…

新书速览|解密AI绘画与修图: Stable Diffusion+Photoshop

《解密AI绘画与修图&#xff1a; Stable DiffusionPhotoshop》 本书内容 《解密AI绘画与修图&#xff1a;Stable DiffusionPhotoshop》全面介绍了Photoshop和Stable Diffusion的交互方式&#xff0c;以及各自的AI功能和具体使用方法。除了讲解功能&#xff0c;还通过实际案例加…

浪潮信息存储的灵魂:平台化+场景化 全面释放数据价值

在数字化浪潮的席卷下&#xff0c;浪潮信息存储平台凭借卓越的性能和稳定性&#xff0c;正日益成为企业释放数据价值的重要力量。近日&#xff0c;浪潮信息出席了“2024数据基础设施技术峰会”&#xff0c;相关代表聚焦当前数据价值的释放话题&#xff0c;围绕先进存储基础设施…

Mongodb安装与配置

Mongodb的下载 这里下载的是MongoDB 7.0.11版本的 首先进入官网&#xff1a;https://www.mongodb.com/ 点击完上面两步后&#xff0c;加载来到该页面&#xff0c;选择自己的版本、系统&#xff0c;是压缩包(zip)还是安装包(msi)。 下载好之后能&#xff0c;来到安装包哪里&a…

爱奇艺 Opal 机器学习平台:特征中心建设实践

01 综述 Opal 是爱奇艺大数据团队研发的一站式机器学习平台&#xff0c;旨在提升特征迭代、模型训练效率&#xff0c;帮助业务提高收益。整个平台覆盖了机器学习生命周期中特征生产、样本构建、模型探索、模型训练、模型部署等在内的多个关键环节。其中特征作为模型训练的基石…

maven安装jar和pom到本地仓库

举例子我们要将 elastic-job-spring-boot-starter安装到本地的maven仓库&#xff0c;如下&#xff1a; <dependency><groupId>com.github.yinjihuan</groupId><artifactId>elastic-job-spring-boot-starter</artifactId><version>1.0.5&l…

基于SpringBoot网吧管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; Java精品实战案例《600套》 2025-2026年最值得选择的Java毕业设计选题大全&#xff1…