C#-读写Excel常用框架及其使用方式

目录

一、MiniExcel开源框架(推荐)

1、写/导出

方式一

方式二

多表创建

更改配置

特性使用

CSV尾行新增行

CSV、XLSX互转

2、读/导入

简单示例

二、NPOI开源框架


一、MiniExcel开源框架(推荐)

添加NuGet包MiniExcel

详细了解:https://gitee.com/dotnetchina/MiniExcel

1、写/导出

方式一
cs 复制代码
        private void Button_Click_TestMini(object sender, RoutedEventArgs e)
        {
            var path = Path.Combine(Directory.GetCurrentDirectory(), "testExcel.xlsx");
            //匿名类型
            //MiniExcel.SaveAs(path, new[]
            //{
            //    new { ID=1,Name="Test"},
            //    new { ID=2,Name="Mini" },
            //    new { ID=3,Name="Excel"}
            //}, overwriteFile: true);
            MiniExcel.SaveAs(path, new[]
            {
                new Test(){ ID=1,Name="Test"},
                new Test(){ ID=2,Name="Mini" },
                new Test(){ ID=3,Name="Excel"}
            }, overwriteFile: true);
        }

        public class Test
        {
            [ExcelColumn(Name = "ID", Width = 20)]
            public int ID { get; set; }
            [ExcelColumn(Name = "Name", Width = 20)]
            public string Name { get; set; }
        }
方式二
cs 复制代码
        private void Button_Click_TestMini(object sender, RoutedEventArgs e)
        {
            var path = Path.Combine(Directory.GetCurrentDirectory(), "testExcel.xlsx");
           //List<Dictionary<string,object>> test= new List<Dictionary<string, object>>()
           //{ 
           // new Dictionary<string, object>(){ { "ID", "1" },{"Name","Test" } },
           // new Dictionary<string, object>(){ { "ID", "2" },{"Name","Mini" } },
           // new Dictionary<string, object>(){ { "ID", "3" },{"Name","Excel" } },
           //};
           
            List<Test> test = new List<Test>()
            {
                new Test(){ ID=1,Name="Test"},
                new Test(){ ID=2,Name="Mini" },
                new Test(){ ID=3,Name="Excel"}
            };
            MiniExcel.SaveAs(path, test);
        }

        public class Test
        {
            [ExcelColumn(Name = "ID", Width = 20)]
            public int ID { get; set; }
            [ExcelColumn(Name = "Name", Width = 20)]
            public string Name { get; set; }
        }
多表创建
cs 复制代码
        private void Button_Click_TestMini(object sender, RoutedEventArgs e)
        {
            var path = Path.Combine(Directory.GetCurrentDirectory(), "testExcel.xlsx");
            var Books = new[]
            {
                new {ID=1,Name="红楼梦" },
                new {ID=2,Name="三国演义" },
                new {ID=3,Name="西游记" },
                new {ID=4,Name="水浒传" },
            };
            var users = new List<Test>()
            {
                new Test(){ ID=1,Name="Mini" },
                new Test(){ ID=2,Name="Test"}
            };
            var sheets = new Dictionary<string, object>()
            {
                { "Sheet1",Books },
                { "Sheet2",users}
            };
            MiniExcel.SaveAs(path, sheets,excelType:ExcelType.XLSX);
        }

        public class Test
        {
            [ExcelColumn(Name = "ID", Width = 20)]
            public int ID { get; set; }
            [ExcelColumn(Name = "Name", Width = 20)]
            public string Name { get; set; }
        }
更改配置
cs 复制代码
MiniExcel.SaveAs(path, sheets,configuration:new OpenXmlConfiguration() 
{
    TableStyles=TableStyles.None,//表格样式选择
    AutoFilter=false,//自动筛选
    EnableWriteNullValueCell=false,//是否可写入空值,默认true
});
特性使用
  • Name,指定列名称
  • Width,指定列宽
  • Index,指定第几列
  • Ignore,是否忽略该列
  • Format,自定义格式
cs 复制代码
public class Test
{
    [ExcelColumn(Name = "Id", Width = 20,Index =1,Ignore =true)]
    public int ID { get; set; }

    [ExcelColumn(Name = "UserName", Width = 20)]
    public string Name { get; set; }

    [ExcelColumn(Name = "Date", Width = 20,Format ="yyyy/MM/dd HH:mm:ss")]
    public DateTime DateTime { get; set; }= DateTime.Now;
}
CSV尾行新增行
cs 复制代码
private void Button_Click(object sender, RoutedEventArgs e)
{
    var path = Path.Combine(Directory.GetCurrentDirectory(), "testExcel.csv");
    var Books = new[]
    {
        new {ID=5,Name="WPF深入浅出" },
        new {ID=6,Name="C#高级编程" },
        new {ID=7,Name="重构" },
    };
    MiniExcel.Insert(path, Books);
}
CSV、XLSX互转
cs 复制代码
private void Button_Click_Convert(object sender, RoutedEventArgs e)
{
    var xlsxPath = Path.Combine(Directory.GetCurrentDirectory(), "testExcel.xlsx");
    var csvPath = Path.Combine(Directory.GetCurrentDirectory(), "testExcel.csv");
    MiniExcel.ConvertXlsxToCsv(xlsxPath, csvPath);
    //MiniExcel.ConvertCsvToXlsx(csvPath, xlsxPath);
}

2、读/导入

简单示例
cs 复制代码
public class User
{
    [ExcelColumn(Name = "Date", Width = 20, Format = "yyyy/MM/dd HH:mm:ss")]
    public DateTime DateTime { get; set; } = DateTime.Now;

    [ExcelColumn(Name = "Id", Width = 20)]
    public int ID { get; set; }

    [ExcelColumn(Name = "UserName", Width = 20)]
    public string Name { get; set; }
}

private void Button_Click_ReadTest(object sender, RoutedEventArgs e)
{
    var path = Path.Combine(Directory.GetCurrentDirectory(), "testExcel.xlsx");
    var users = MiniExcel.Query<User>(path).ToList();
    var user = users.Where(u => u.ID.Equals(4)).FirstOrDefault();
    if (user != null)
        MessageBox.Show(user.Name);
}

二、NPOI开源框架

添加NuGet包NPOI

简单示例如下:

cs 复制代码
        private void Button_Click_TestNPOI(object sender, RoutedEventArgs e)
        {
            IWorkbook workbook = new XSSFWorkbook();
            ISheet sheet1 = workbook.CreateSheet("Sheet1");
            sheet1.CreateRow(0).CreateCell(0).SetCellValue(1);
            sheet1.GetRow(0).CreateCell(1).SetCellValue("NPOI");
            sheet1.CreateRow(1).CreateCell(0).SetCellValue(2);
            sheet1.GetRow(1).CreateCell(1).SetCellValue("Test");
            sheet1.CreateRow(2).CreateCell(0).SetCellValue(3);
            sheet1.GetRow(2).CreateCell(1).SetCellValue("Sheet");

            var path = Path.Combine(Directory.GetCurrentDirectory(), "newExcel.xlsx");
            using (FileStream fs = new FileStream(path, FileMode.Create))
            {
                workbook.Write(fs);
            }
            workbook.Close();
        }
相关推荐
Cc.Y3 分钟前
Java零基础入门:字符串深度掌握——从基础API到StringBuilder性能优化
java·开发语言·性能优化
java资料站4 小时前
十一、评估测试
开发语言·人工智能·python
左手の明天5 小时前
SLIP 协议封装与解析详解:原理、C 代码与实战案例
linux·c语言·开发语言·c++
海上小飞龙5 小时前
【KMP算法-下篇】同一道题:Java 库函数 2600 微秒,手写 KMP 16 微秒
java·开发语言·算法
朝朝辞暮i5 小时前
C++ 第 12 课:局部变量、作用域、变量生命周期
开发语言·c++·算法
狗凯之家源码网5 小时前
淘客口令落地页生成器 PHP 版深度评测
开发语言·php
画绛集美术5 小时前
本地化部署LLM用于美术史问答:一间美术教室的实践记录
开发语言·php
八解毒剂6 小时前
【计组】中央处理器CPU
java·开发语言·计算机组成原理
FakeOccupational7 小时前
【电路笔记 信号】DBPSK 波形查找表+脉冲成形(升余弦+根升余弦滤波)
开发语言·笔记
打工仔折腾 AI7 小时前
工业场景下时序库与实时计算一体化架构选型实践对比
java·开发语言·后端·python·性能优化·架构·ai agent 实战