首页 > 编程语言 >C# 使用ClosedXML 导出数据(工具类)

C# 使用ClosedXML 导出数据(工具类)

时间:2024-10-17 16:33:23浏览次数:8  
标签:string C# worksheet 导出 value sheetName var using ClosedXML

使用ClosedXML导出数据工具类代码:

using ClosedXML.Excel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace Chine.MVCClibrary.Meet.Tools
{
    public class ExcelHelper
    {
        /// <summary>
        /// 导出全量
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="data"></param>
        /// <param name="filePath"></param>
        /// <param name="sheetName"></param>
        public static void ExportToExcel<T>(List<T> data, string filePath, string sheetName) where T : new()
        {
            using (var workbook = new XLWorkbook())
            {
                var worksheet = workbook.Worksheets.Add(sheetName);

                // 获取所有属性作为列头
                var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

                //添加表头
                for (int i = 0; i < properties.Length; i++)
                {
                    worksheet.Cell(1, i + 1).Value = properties[i].Name;
                }

                //填充数据
                for (int row = 0; row < data.Count; row++)
                {
                    for (int col = 0; col < properties.Length; col++)
                    {
                        var value = properties[col].GetValue(data[row], null);
                        worksheet.Cell(row + 2, col + 1).Value = value ?? "";
                    }
                }

                //保存Excel到指定路径
                workbook.SaveAs(filePath);
            }
        }

        /// <summary>
        /// 导出特定列
        /// </summary>
        /// <typeparam name="T">数据实体</typeparam>
        /// <param name="data">需要导出的数据</param>
        /// <param name="columnMappings">属性英文,中文对应关系(定义的就是需要导出的字段)</param>
        /// <param name="filePath">导出路径</param>
        /// <param name="sheetName"></param>
        public static void ExportToExcel<T>(List<T> data, Dictionary<string, string> columnMappings, string filePath, string sheetName) where T : new()
        {
            List<string> columnsToExport = columnMappings.Keys.ToList();
            using (var workbook = new XLWorkbook())
            {
                //写入sheetName
                var worksheet = workbook.Worksheets.Add(sheetName);

                // 写入标题行
                int columnIndex = 1;
                foreach (var column in columnsToExport)
                {
                    if (columnMappings.ContainsKey(column))
                    {
                        worksheet.Cell(1, columnIndex).Value = columnMappings[column]; // 使用中文标题
                        columnIndex++;
                    }
                }

                //设置标题行样式
                IXLStyle style = worksheet.Range(1, 1, 1, columnIndex - 1).Style;
                style.Font.Bold = true;
                style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
                style.Fill.BackgroundColor = XLColor.LightGreen;
                style.Border.SetOutsideBorder(XLBorderStyleValues.Thin);
                style.Border.SetInsideBorder(XLBorderStyleValues.Thin);

                // 写入数据行
                for (int i = 0; i < data.Count; i++)
                {
                    columnIndex = 1;
                    foreach (var column in columnsToExport)
                    {
                        var property = typeof(T).GetProperty(column);
                        if (property != null)
                        {
                            var value = property.GetValue(data[i]);

                            worksheet.Cell(i + 2, columnIndex).DataType = XLDataType.Text; // 设置单元格数据类型为文本
                            worksheet.Cell(i + 2, columnIndex).Value = IsNumeric(value.ToString()) ? $"'{value?.ToString() ?? ""}" : value?.ToString() ?? "";
                            columnIndex++;
                        }
                    }
                }

                // 设置列宽自适应内容宽度
                worksheet.Columns().AdjustToContents();

                // 保存文件
                workbook.SaveAs(filePath);
            }
        }

        private static bool IsNumeric(string value)
        {
            if (string.IsNullOrEmpty(value) || value.Length < 15) return false;

            return Regex.IsMatch(value, @"^\d+(\.\d+)?$");
        }

    }
}

 

 

调用方示例:

public ActionResult TicketPurchaserExport()
{
    var list = Factory.M_Meeting_Purchaser.GetTicketPurchaserPageList("", "", -1, 100000, 1, out int count);
    if (list == null || list.Count == 0)
    {
        return JResult(false, "没有数据导出");
    }

    string sheetName = "购票者信息管理";
    string filePath = Server.MapPath("~\\UploadFile\\" + sheetName + ".xlsx");

    Dictionary<string, string> columnMappings = new Dictionary<string, string>()
    {
        { "PurchaserGlobalId", "购票人GlobalId" },
        { "PurchaserMelaId", "购票人会员编号" },
        { "PurchasedTicketCount", "购票资格数量" },
        { "StatusDes", "状态" },
        { "AttendeeCount", "已确认出席人数" },
        { "PurchaserName", "购票人姓名" },
        { "PurchaserPhoneNumber", "购票人手机号" },
        { "PurchaserIDNumber", "购票人身份证号" },
        { "IsPurchaserAttendanceDes", "购票人是否出席" },
        { "SpouseName", "配偶姓名" },
        { "SpousePhoneNumber", "配偶手机号" },
        { "SpouseIDNumber", "配偶身份证号" },
        { "IsSpouseAttendanceDes", "配偶是否出席" }
    };

    ExcelHelper.ExportToExcel(list, columnMappings, filePath, sheetName);

    return File(filePath, "application/vnd.ms-excel", $"{sheetName}.xlsx");
}

 

标签:string,C#,worksheet,导出,value,sheetName,var,using,ClosedXML
From: https://www.cnblogs.com/skyfreedom/p/18472598

相关文章

  • Next.js 与 React 全栈开发:整合 TypeScript、Redux 和 Ant Design
    在上一集,我们编写完毕导航页面,并且非常的美观,但是我们发现编写网站是存静态的,在现代的网站当中一般都是动静结合,也就是说部分数据是从数据库读取的,部分静态数据是写在网页上面的,因此这章讲述如何搭建一个数据库。搭建数据库(PostgreSQL)在这里我们使用容器的方法进行数据库搭建,这......
  • 利用Visual Studio调试WSL下的C++工程
    这里写了一个基于Qt5的控制台的小代码:#include<QCoreApplication>#include<QDebug>intmain(intargc,char**argv){ QCoreApplicationa(argc,argv);qDebug()<<"Applicationstarted";inttestValue=42;qDebug()<<"......
  • nvm command errors All In One
    nvmcommanderrorsAllInOneerrorsnvmcannotchangethedefaultaliasnode.jsversion❌$nvminstall18.20.4#currentuse$nvmuse18.20.4#setdefault,butnotusedefault❌$nvmaliasdefault18.20.4solutions#usedefault✅$nvmusede......
  • Oracle数据库配置
    Oracle数据库配置一:修改Oracle数据库内存    查看当前内存配置    showparametermemory,万一配置错了起不来,只能通过pfile文件重新启动          修改memory_target        MEMORY_TARGET:oracle所能使用的最大内存,该参数......
  • 实验三: JavaScript数组与函数
    实验目的熟练掌握常用JavsScript的数组、自定义函数、作用域。实验内容数组定义及元素获取;数组的遍历;数组内容的增删改查;数组的排序;数组的反转、截取、合并、元素拼接函数的声明;函数的调用;匿名函数;作用域。实验步骤:数组定义及元素获取;数组的遍历;数组内容的增删改查......
  • 7:OracleRAC安装配置(19C)
    7:OracleRAC安装配置(19C)测试环境搭建:OracleLinux7.6, 19C环境介绍:RAC01(两张网卡)  IP:172.17.0.30  PRIIP:10.10.10.30  VIP:172.17.0.32RAC02(两张网卡)   IP:172.17.0.31  PRIIP:10.10.10.31  VIP:172.17.0.33SCANIP:172.17.0.34共享存储RACFile(一张......
  • C语言[数组作函数参数]
    输入10个整数作为一个数组,要求判断并且输出其中最大的值和它是数组中的第几位数。本次代码调用max函数数组元素为a[1]~a[9]代码如下:#include<stdio.h>intmain(){  intmax(intx,inty);  inti,m,n,a[10];  printf("enter10intergernumber:"); ......
  • 5:安装配置 Oracle18C
    5:安装配置Oracle18C安装需求如下: 安装完成。  总结:    数据库名称为Oracletest      表空间 spacetest    账号:spacetest    密码:spacetest    表:spacetast删除数据库上面的步骤走完是卸......
  • 3:Oracle体系结构(逻辑结构)
    3:Oracle体系结构(逻辑结构) ......
  • docker以及nvidia-docker的安装、移植以及使用案例
    详细描述docker、nvidia-docker的安装步骤,通过案例描述docker的基本使用命令,包含docker创建、移植、加载等。文档真实案例编写,亲测可用,傻瓜式教程,直接复制即可成功安装。默认已经安装显卡驱动。一、docker的安装#由于apt官方库里的docker版本可能比较旧,所以先卸载可能......