提供一个使用Npoi生成excel文档的例子,应能帮助到各位使用Npoi的朋友,因为具有多种情形处理

news2024/12/23 9:57:49

提供一个使用Npoi生成excel文档的例子,应能帮助到各位使用Npoi的朋友,因为具有多种情形处理

 

照例,文章开始之前,先看下最终效果:

实现的需求点如下:
1.第一行大标题加了背景色,且这个背景色,不在常用的颜色范围中,需要自定义。同时标题的字体大小要进行变化。
2.第二行的表格信息是单独的,每一项信息对应一个单元格给它填写值。如线体,然后跟着一个单元格给它写值。
3.第三行,要实现单元格合并。且根据单元格的文字多少,自适应文档的单元格宽度范围。
4.第四行,从第4行开始,就是填充表格数据了。要注意的是跟第3行一样,要合并单元格。
5.要冻结“点检状态”的单元格位置。
6.第1行的高度要最高,第2行的高度要次之,第3行的高度再次之,第4行用excel的默认高度。
7.单元格实现黑色边框。

由于代码注释已经很详细了,所以,我就直接贴上完整代码,就不啰唆了,我知道,读者其实也不想看我放屁,你们只想要源码,而且还不想放在下载中(因为那个要积分要钱)。

那么好的,来了(NPOI用的版本是2.6.0):

using System;
using System.Collections.Generic;
using System.IO;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using NPOI.XSSF.UserModel;
using NPOI.HSSF.Util;

using static EquipmentInspectionExcelGenerator;
using SixLabors.ImageSharp;

/// <summary>
/// 用于设备点检数据的Excel生成
/// </summary>
public class EquipmentInspectionExcelGenerator
{
    /// <inheritdoc cref="EquipmentInspectionExcelGenerator"/>
    public EquipmentInspectionExcelGenerator() { }

    /// <summary>
    /// 点检信息
    /// </summary>
    public class InspectionInformation
    {
        /// <summary>
        /// 线体
        /// </summary>
        public string LineBody { get; set; }
        /// <summary>
        /// 工序名称
        /// </summary>
        public string ProcessName { get; set; }
        /// <summary>
        /// 设备编号
        /// </summary>
        public string EquipmentNumber { get; set; }
        /// <summary>
        /// 开机人员
        /// </summary>
        public string Operator { get; set; }
        /// <summary>
        /// 日期
        /// </summary>
        public string Date { get; set; }
        /// <summary>
        /// 班次
        /// </summary>
        public string Shift { get; set; }
        /// <summary>
        /// 点检项目数
        /// </summary>
        public string InspectionItemCount { get; set; }
        /// <summary>
        /// NG项目数
        /// </summary>
        public string NGItemCount { get; set; }
    }

    /// <summary>
    /// 点检项目
    /// </summary>
    public class InspectionData
    {
        /// <summary>
        /// 功能
        /// </summary>
        public string Functionality { get; set; }
        /// <summary>
        /// 生产时状态要求
        /// </summary>
        public string ProductionStatusRequirements { get; set; }
        /// <summary>
        /// 不符合要求设备反应计划
        /// </summary>
        public string NoncomplianceReactionPlan { get; set; }
        /// <summary>
        /// 点检状态
        /// </summary>
        public string InspectionStatus { get; set; }
        /// <summary>
        /// 判定结果
        /// </summary>
        public string JudgmentResult { get; set; }
        /// <summary>
        /// 点检时间
        /// </summary>
        public string InspectionTime { get; set; }
        /// <summary>
        /// 反应计划
        /// </summary>
        public string ReactionPlan { get; set; }
        /// <summary>
        /// 当班点检次数
        /// </summary>
        public string InspectionCount { get; set; }
    }

    /// <summary>
    /// 生成excel
    /// </summary>
    /// <param name="filePath">存储路径</param>
    /// <param name="information"><inheritdoc cref="InspectionInformation" path="/summary"/></param>
    /// <param name="datas"><inheritdoc cref="InspectionData" path="/summary"/></param>
    public void GenerateExcel(string filePath, InspectionInformation information, List<InspectionData> datas)
    {
        if (string.IsNullOrEmpty(filePath))
        {
            throw new ArgumentException("filePath is required", nameof(filePath));
        }
        if (information == null)
        {
            throw new ArgumentNullException("information is required", nameof(information));
        }
        if (datas == null)
        {
            throw new ArgumentNullException("datas is required", nameof(datas));
        }

        // 创建Excel工作簿
        IWorkbook workbook = new XSSFWorkbook();
        ISheet sheet = workbook.CreateSheet("设备功能开关点检表格");

        // 设置第1行的表头,合并16列并居中显示
        IRow row1 = sheet.CreateRow(0);
        row1.Height = Convert.ToInt16(row1.Height * 2.5);

        IFont headerFont = workbook.CreateFont();
        headerFont.FontHeightInPoints = 18;  // 设置字体大小
        headerFont.IsBold = true; // 设置字体加粗

        ICell cell1 = row1.CreateCell(0);
        var headerCellStyle = CreateHeaderCellStyle(workbook);
        headerCellStyle.SetFont(headerFont);
        cell1.CellStyle = headerCellStyle;
        cell1.SetCellValue("设备功能开关点检表格");
        sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, 15));

        // 设置第2行的列标题
        IRow row2 = sheet.CreateRow(1);
        row2.Height = Convert.ToInt16(row2.Height * 2);

        IFont columnHeaderFont = workbook.CreateFont();
        columnHeaderFont.IsBold = true; // 设置字体加粗

        string[] columnHeaders = new string[]
        {
            "线体", information.LineBody, "工序名称", information.ProcessName, "设备编号", information.EquipmentNumber, "开机人员", information.Operator, "日期", information.Date, "班次", information.Shift, "点检项目数", information.InspectionItemCount, "NG项目数", information.NGItemCount
        };
        for (int i = 0; i < columnHeaders.Length; i++)
        {
            ICell cell = row2.CreateCell(i);
            var columnHeaderCellStyle = CreateColumnHeaderCellStyle(workbook);
            if (i % 2 == 0)
            {
                columnHeaderCellStyle.SetFont(columnHeaderFont);
            }
            cell.CellStyle = columnHeaderCellStyle;
            cell.SetCellValue(columnHeaders[i]);
            sheet.SetColumnWidth(i, 200 * 15); // 设置列宽自适应内容
        }

        // 设置第3行的列标题
        IRow row3 = sheet.CreateRow(2);
        row3.Height = Convert.ToInt16(row3.Height * 1.6);
        string[] subColumnHeaders = new string[]
        {
            "序号", "功能", "", "生产时状态要求", "", "不符合要求设备反应计划", "", "点检状态", "", "判定结果", "", "点检时间", "",
            "反应计划", "", "当班点检次数"
        };
        for (int i = 0; i < subColumnHeaders.Length; i++)
        {
            ICell cell = row3.CreateCell(i);
            cell.CellStyle = CreateColumnHeaderCellStyle(workbook);
            cell.SetCellValue(subColumnHeaders[i]);
        }

        // 循环设置数据
        for (var i = 0; i < datas.Count; i++)
        {
            var data = datas[i];
            IRow dataRow = sheet.CreateRow(i + 3);
            dataRow.Height = Convert.ToInt16(dataRow.Height * 1.2);
            string[] values = new string[]
                {
                    (i+1).ToString(),
                    data.Functionality,
                    string.Empty,
                    data.ProductionStatusRequirements,
                    string.Empty,
                    data.NoncomplianceReactionPlan,
                    string.Empty,
                    data.InspectionStatus,
                    string.Empty,
                    data.JudgmentResult,
                    string.Empty,
                    data.InspectionTime,
                    string.Empty,
                    data.ReactionPlan,
                    string.Empty,
                    data.InspectionCount,
                };
            for (int j = 0; j < values.Length; j++)
            {
                ICell cell = dataRow.CreateCell(j);
                cell.CellStyle = CreateCellStyle(workbook);
                cell.SetCellValue(values[j]);
            }
        }

        // 合并单元格
        int rowCount = sheet.LastRowNum + 1;
        for (int i = 2; i < rowCount; i++)
        {
            sheet.AddMergedRegion(new CellRangeAddress(i, i, 1, 2));
            sheet.AddMergedRegion(new CellRangeAddress(i, i, 3, 4));
            sheet.AddMergedRegion(new CellRangeAddress(i, i, 5, 6));
            sheet.AddMergedRegion(new CellRangeAddress(i, i, 7, 8));
            sheet.AddMergedRegion(new CellRangeAddress(i, i, 9, 10));
            sheet.AddMergedRegion(new CellRangeAddress(i, i, 11, 12));
            sheet.AddMergedRegion(new CellRangeAddress(i, i, 13, 14));
        }

        // 冻结“点检状态”列的位置
        sheet.CreateFreezePane(7, 2);

        // 保存Excel文件
        using (FileStream fileStream = new FileStream(filePath, FileMode.Create))
        {
            workbook.Write(fileStream, true);
        }
    }

    /// <summary>
    /// 创建表头样式
    /// </summary>
    /// <param name="workbook"></param>
    /// <returns></returns>
    private ICellStyle CreateHeaderCellStyle(IWorkbook workbook)
    {
        ICellStyle style = workbook.CreateCellStyle();
        //style.Alignment = HorizontalAlignment.Center;
        style.VerticalAlignment = VerticalAlignment.Center;
        style.FillForegroundColor = 0;// IndexedColors.Grey25Percent.Index;//Grey25Percent的颜色还是太深了。用自定义的颜色让他更淡些。
        style.FillPattern = FillPattern.SolidForeground;
        ((XSSFColor)style.FillForegroundColorColor).SetRgb(new byte[] { 242, 242, 242 });//自定义一个淡色
      
        style.BorderTop = BorderStyle.Thin;
        style.BorderBottom = BorderStyle.Thin;
        style.BorderLeft = BorderStyle.Thin;
        style.BorderRight = BorderStyle.Thin;

        style.TopBorderColor = IndexedColors.Black.Index;
        style.BottomBorderColor = IndexedColors.Black.Index;
        style.LeftBorderColor = IndexedColors.Black.Index;
        style.RightBorderColor = IndexedColors.Black.Index;


        return style;
    }

    /// <summary>
    /// 创建列头样式
    /// </summary>
    /// <param name="workbook"></param>
    /// <returns></returns>
    private ICellStyle CreateColumnHeaderCellStyle(IWorkbook workbook)
    {
        ICellStyle style = CreateCellStyle(workbook);
        style.FillForegroundColor = IndexedColors.Grey40Percent.Index;
        return style;
    }

    /// <summary>
    /// 创建单元格样式
    /// </summary>
    /// <param name="workbook"></param>
    /// <returns></returns>
    private ICellStyle CreateCellStyle(IWorkbook workbook)
    {
        ICellStyle style = workbook.CreateCellStyle();
        style.Alignment = HorizontalAlignment.Center;
        style.VerticalAlignment = VerticalAlignment.Center;
        style.BorderTop = BorderStyle.Thin;
        style.BorderBottom = BorderStyle.Thin;
        style.BorderLeft = BorderStyle.Thin;
        style.BorderRight = BorderStyle.Thin;

        style.TopBorderColor = IndexedColors.Black.Index;
        style.BottomBorderColor = IndexedColors.Black.Index;
        style.LeftBorderColor = IndexedColors.Black.Index;
        style.RightBorderColor = IndexedColors.Black.Index;

        return style;
    }
}

调用方式如下:

public class Example
{
    /// <summary>
    /// 请参照这个方法的调用代码,来进行调用
    /// </summary>
    public void 演示调用()
    {
        string filePath = @"C:\Users\Administrator\Desktop\excel.xlsx";
        InspectionInformation information = new InspectionInformation();
        information.LineBody = "JITA-003";
        information.ProcessName = "侧边涂胶";
        information.EquipmentNumber = "JIT02TM";
        information.Operator = "Marc";
        information.Date = "2023-5-29";
        information.Shift = "day shift";
        information.InspectionItemCount = "4";
        information.NGItemCount = "28";
        List<InspectionData> datas = new List<InspectionData>();
        datas.Add(new InspectionData
        {
            Functionality = "前段联机",
            ProductionStatusRequirements = "启用",
            NoncomplianceReactionPlan = "停机",
            InspectionStatus = "屏蔽",
            JudgmentResult = "NG",
            InspectionTime = "2023/4/21/8:34",
            ReactionPlan = "停机",
            InspectionCount = "2"
        });
        datas.Add(new InspectionData
        {
            Functionality = "后段联机",
            ProductionStatusRequirements = "启用",
            NoncomplianceReactionPlan = "停机",
            InspectionStatus = "屏蔽",
            JudgmentResult = "NG",
            InspectionTime = "2023/4/21/8:34",
            ReactionPlan = "停机",
            InspectionCount = "2"
        });
        datas.Add(new InspectionData
        {
            Functionality = "上位机联机",
            ProductionStatusRequirements = "启用",
            NoncomplianceReactionPlan = "停机",
            InspectionStatus = "屏蔽",
            JudgmentResult = "NG",
            InspectionTime = "2023/4/21/8:34",
            ReactionPlan = "停机",
            InspectionCount = "2"
        });
        datas.Add(new InspectionData
        {
            Functionality = "点胶门禁",
            ProductionStatusRequirements = "启用",
            NoncomplianceReactionPlan = "停机",
            InspectionStatus = "屏蔽",
            JudgmentResult = "NG",
            InspectionTime = "2023/4/21/8:34",
            ReactionPlan = "停机",
            InspectionCount = "2"
        });

        EquipmentInspectionExcelGenerator generator = new EquipmentInspectionExcelGenerator();
        generator.GenerateExcel(filePath, information, datas);
    }
}

祝您用餐愉快。

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

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

相关文章

解密 JS 参数:逆向工程的实用技巧

大家好&#xff0c;我是安果&#xff01; 大部分网站都会对关键参数进行加密&#xff0c;JS 逆向时&#xff0c;我们首要任务是定位参数具体的加密逻辑 常见方式包含&#xff1a;关键字搜索、堆栈调试、XHR 及事件监听、AST 内存漫游、JS Hook 注入等 本篇文章以 JS Hook 注入定…

惊爆!Python打造花式照片墙!

大家注意&#xff1a;因为微信最近又改了推送机制&#xff0c;经常有小伙伴说错过了之前被删的文章&#xff0c;比如前阵子冒着风险写的爬虫&#xff0c;再比如一些限时福利&#xff0c;错过了就是错过了。 所以建议大家加个星标&#xff0c;就能第一时间收到推送。&#x1f44…

NXP IMX8M + Ethercat+Codesys工业实时运动控制解决方案

面向边缘计算应用的全新i.MX 8M Plus异构应用处理器&#xff0c;搭载专用神经网络加速器、独立实时子系统、双摄像头ISP、高性能DSP和GPU。 恩智浦半导体宣布推出i.MX 8M Plus应用处理器&#xff0c;进一步丰富其业界领先的产品组合。这是恩智浦首个集成了专用神经处理引擎&…

G0第25章:Gin框架进阶项目实战

1 Gin框架源码解析 通过阅读gin框架的源码来探究gin框架路由与中间件的秘密。 1.1 Gin框架路由详解 gin框架使用的是定制版本的httprouter&#xff0c;其路由的原理是大量使用公共前缀的树结构&#xff0c;它基本上是一个紧凑的Trie tree 或者只是&#xff08;Radix Tree&am…

Linux Tomcat服务 虚拟主机 多实例部署

Tomcat 服务 Tomcat 是 Java 语言开发的&#xff0c;Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器。Tomcat 属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试 java开发的JSP 动态页面程序的首选。一般…

Linux教程——常见Linux发行版本有哪些?

新手往往会被 Linux 众多的发行版本搞得一头雾水&#xff0c;我们首先来解释一下这个问题。 从技术上来说&#xff0c;李纳斯•托瓦兹开发的 Linux 只是一个内核。内核指的是一个提供设备驱动、文件系统、进程管理、网络通信等功能的系统软件&#xff0c;内核并不是一套完整的…

DDD领域模型

一、分层介绍 controller层&#xff1a;处理页面或者api请求的输入输出&#xff0c;定义VO(REQ,RES)&#xff0c;没有业务逻辑&#xff0c;只做请求处理和下层逻辑接application层&#xff1a;处理跨领域domain的复杂逻辑&#xff0c;定义DTOdomain层&#xff1a;领域核心逻辑…

深入理解Qt多线程编程:QThread、QTimer与QAudioOutput的内在联系__QObject的主线程的事件循环

深入理解Qt多线程编程&#xff1a;QThread、QTimer与QAudioOutput的内在联系__QObject的主线程的事件循环 1. Qt多线程编程的基础1.1 QObject和线程&#xff08;QObject and Threads&#xff09;1.2 QThread的使用和理解&#xff08;Understanding and Using QThread&#xff0…

C#,码海拾贝(35)——求“实对称矩阵““特征值与特征向量“的“雅可比法“之C#源代码

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 矩阵类 /// 作者&#xff1a;周长发 /// 改进&#xff1a;深度混淆 /// https://blog.csdn.net/beijinghorn /// </summary> public partial class Matrix {…

编码器 | 基于 Transformers 的编码器-解码器模型

基于 transformer 的编码器-解码器模型是 表征学习 和 模型架构 这两个领域多年研究成果的结晶。本文简要介绍了神经编码器-解码器模型的历史&#xff0c;更多背景知识&#xff0c;建议读者阅读由 Sebastion Ruder 撰写的这篇精彩 博文。此外&#xff0c;建议读者对 自注意力 (…

【AUTOSAR】Bootloader说明(一)---- 时序流程

电机控制器选用TI TMS28xx DSP&#xff0c;包括boot-loader与应用软件两个部分。其中boot-loader包括下列内容&#xff1a; RAM自检应用程序有效性检查UDS命令处理FLASH操作 下面分别说明DSP上电后整个软件运行流程及程序刷新过程。 DSP软件执行流程 DSP复位后&#xff0c;将…

【Mysql基础】-关于常用的函数简单案例

目录 一、系统函数 二、日期函数 三、字符串函数数 说明&#xff1a;以下所有的操作在8.0的mysql数据库操作系统上操作 一、系统函数 1 显示连接列表&#xff1a;show PROCESSLIST; 2 MD5加密&#xff1a;select MD5("root") 二、日期函数 1、 推算一周之后的…

QMI8658 - 姿态传感的零偏(常值零偏)标定

1. 零偏 理论上在静止状态下三轴输出为0,0,0&#xff0c;但实际上输出有一个小的偏置&#xff0c;这是零偏的静态分量&#xff08;也称固定零偏&#xff09;。 陀螺生产出来后就一直固定不变的零偏值。对于传统的高性能惯性器件来说&#xff0c;该误差在出厂标定时往往就被补偿…

《水经注地图服务》用户如何登录?

《水经注地图服务》&#xff08;WeServer&#xff09;是一款可快速发布全国乃至全球海量卫星影像的地图发布服务产品&#xff0c;该产品完全遵循OGC相关协议标准&#xff0c;是一个基于若干项目成功经验总结的产品。它可以轻松发布100TB级海量卫星影像&#xff0c;从而使“在内…

如何使用 Raycast 一键打开预设工作环境

工作中&#xff0c;你一定遇到过这样的场景&#xff1a;你正在认真写代码&#xff0c;线上突然出现报警。看到报警信息之后&#xff0c;你不得不打开浏览器&#xff0c;点开收藏夹&#xff0c;打开监控页面、告警页面、trace 页面、日志搜索平台……有时&#xff0c;还需要打开…

chatgpt赋能python:Python取值:了解基础知识和应用方法

Python取值&#xff1a;了解基础知识和应用方法 什么是Python取值&#xff1f; Python取值是指从一个对象中获取信息或者值。对象可以包括列表、字典、元组、变量等。Python提供了多种方法来取值&#xff0c;包括基础的索引和切片操作&#xff0c;以及高级的列表推导式、字典…

MySQL JDBC详解

文章目录 简介JDBC APIJDBC Driver ManagerJDBC 驱动 JDBC 开发步骤一&#xff0c;导入 JDBC 驱动包&#xff0c;并加载驱动类二&#xff0c;建立数据库连接三&#xff0c;发送 SQL 语句&#xff0c;并获取执行结果Statement 对象PreparedStatement 对象 四&#xff0c;处理返回…

ADAS方案的简单比较

ADAS方案的简单比较 1 概述2 厂商Tesla硬件布局网络基础结构&#xff1a;HydraNet多头网络 NVIDIA百度&#xff08;Apollo&#xff09;版本历史硬件布局软件框架各版本框架 WaymoVolvo-Uber 3 芯片4 其他from [最全自动驾驶技术架构和综述](https://blog.csdn.net/buptgshengod…

项目质量管理

质量与项目质量 质量的定义&#xff1a;一组固有特征满足要求的程序。 质量是反应实体主题明确和隐含需求的能力的特性总和 质量与等级的关系&#xff1a; 一个低等级&#xff08;功能有限&#xff09;&#xff0c;高质量&#xff08;无明显缺陷&#xff0c;用户手册易读&am…

《Datawhale南瓜书》出第二版啦!

Datawhale干货 作者&#xff1a;Datawhale开源项目团队 作为机器学习的入门经典教材&#xff0c;周志华老师的《机器学习》&#xff0c;自2016年1月底出版以来&#xff0c;首印5000册一周售罄&#xff0c;并在8个月内重印9次。先后登上了亚马逊&#xff0c;京东&#xff0c;当…