• C#读写Excel


    C#专栏目录

    环境准备

    首先,右键解决方案的依赖项->添加项目引用,搜索Excel,选中Microsoft Excel 16.0 Object Library->点击确定。

    然后在源文件中添加命名空间

    using Excel = Microsoft.Office.Interop.Excel;
    using System.Reflection;
    using System.Runtime.InteropServices;//导入dll
    
    • 1
    • 2
    • 3

    本教程使用了.Net6.0的顶层语句,所以不需要再导入诸如Core之类的,直接开撸代码。下面通过C#实现对Excel的读写

    Excel写入

    为了重点突出重点,下面争取用最短的代码,写一个将多维数组写入Excel并保存的函数,其基本流程如下

    1. 创建一个Excel程序app
    2. 在app中创建一个xlsx文件 wbk
    3. 选中wbk中的第一个sheet
    4. 激活whs

    然后就可以具体读写Excel文件了。

    void dataToExcel(double[,] data, string outName)
    {
        Excel.Application app = new Excel.Application();
        Excel._Workbook wbk = app.Workbooks.Add(true);
        Excel._Worksheet whs = wbk.Sheets[1];
        //激活whs
        whs.Activate();
    
        //将二维数组中的数据写入whs这个sheet
        for (int i = 0; i < data.GetLength(0); i++)
            for (int j = 0; j < data.GetLength(1); j++)
                whs.Cells[i + 1, j + 1] = data[i, j].ToString();
    
        //将wbk另存为outName
        wbk.SaveAs(outName);
        //关闭wbk
        wbk.Close();
        //退出Excel程序
        app.Quit();
    }
    
    double[,] data = new double[5, 5];
    // 获取当前工作路径
    string path = System.Environment.CurrentDirectory;
    // 输出文件的路径
    path = Path.Combine(path, "test.xlsx");
    dataToExcel(data, path);
    Console.WriteLine($"输出到{path}");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    这里需要建立起对Excel中数据组织的一个概念,首先是Excel软件,一个软件可以打开多个xlsx文件,每个文件中对应多个sheet,每个sheet中有多个单元格,对应关系如下表所示。

    ExcelExcel.exetest.xlsxsheet1A1
    C#appwbkwhswhs.Cells[1,1]

    而通过这样一个简单的例程,也就理解了C#操作Excel的基本流程:打开->操作->关闭。

    其打开流程,包括打开Excel程序、打开Excel文件以及打开sheet;关闭则包括关闭Excel文件和Excel程序。

    Excel读取

    读取与写入的流程相似,但写入时需要至少有一个Excel文件,刚好刚刚创建了一个

    void readExcel(string inName)
    {
        var app = new Excel.Application();
        var wbk = app.Workbooks.Add(inName);
        //app.Visible = true;
        
        var sh = wbk.Sheets[1];
        sh.Activate();
        Console.WriteLine("您打开了" + sh.Name);
        Console.WriteLine($"本sheet共有{sh.Rows.Count}行,{sh.Columns.Count}列");
    
        var usedRange = sh.UsedRange.CurrentRegion;
        for (int i = 0; i < usedRange.Rows.Count; i++)
        {
            for (int j = 0; j < usedRange.Columns.Count; j++)
                Console.Write($"{sh.Cells[i + 1, j + 1].Text} ");
            Console.Write("\n");
        }
        wbk.Close();
        app.Quit();
    }
    
    string path = System.Environment.CurrentDirectory;
    path = Path.Combine(path, "test.xlsx");
    readExcel(path);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    命令行中输出结果为


    您打开了Sheet1
    本sheet共有1048576行,16384列
    0 0 0 0 0
    0 0 0 0 0
    0 0 0 0 0
    0 0 0 0 0
    0 0 0 0 0


    其中,**app.Visible = true;**时,Excel软件会被打开。

    sh.Rows.Count, sh.Columns.Count分别表示总行数和总列数,一般就是最大行和最大列。

    sh.UsedRange.CurrentRegion表示已写入的区域,其对应的行数和列数就比较有代表性,根据这两个值进行循环,就可以把刚刚写入的数据打印出来了。

  • 相关阅读:
    嵌入式面试/笔试C相关总结
    数据结构与算法之顺序表经典题目《合并两个有序数组》《合并两个有序链表》
    平面设计师之路 优漫动游
    互联网舆情监控分析
    JAVA恩施茶多芬网店系统设计与实现2021计算机毕业设计Mybatis+系统+数据库+调试部署
    洛谷 P5656
    阿里滑块x5sec 226算法分析
    构建部署_Docker常用命令
    K8S概念与架构
    快来体验快速通道,netty中epoll传输协议详解
  • 原文地址:https://blog.csdn.net/m0_37816922/article/details/128043199