首页 > 其他分享 >ExcelPackage操作Excel的常用方法

ExcelPackage操作Excel的常用方法

时间:2023-06-08 13:55:45浏览次数:31  
标签:常用 worksheet Cells 单元格 Excel Style cell ExcelPackage

游戏开发中最常用的工具应该当属Excel了,而Excel在数据量比较大,或者多张表进行关联的时候操作比较繁琐,偶尔会有一些工具需要,减化上述的一些操作,提升工作效率。


最开始想使用Node.js,发现二个问题,Github上第三方库,在保存 Excel 的时候会将格式给丢掉。找来找来,发现 C# 的 Epplus 比较符合需求。


第一步:准备工作

(1) 通过 NuGet 下载 Epplus

(2)Form 的构造函数中添加许可

using OfficeOpenXml;
using OfficeOpenXml.Drawing;
using OfficeOpenXml.Drawing.Chart;
using OfficeOpenXml.Style;
using LicenseContext = OfficeOpenXml.LicenseContext;

 public Form1()
 {
    InitializeComponent();

    // EPPlus需要添加许可
    ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
}


第二步:根据需求对Excel进行操作

ExcelPackage 常用的API

加载或创建 Excel 文件:

ExcelPackage.Load:从现有的 Excel 文件加载数据。

ExcelPackage.Save:保存 Excel 文件。


访问工作表和单元格:

ExcelPackage.Workbook:获取工作簿对象。

ExcelWorkbook.Worksheets:获取工作表集合。

ExcelWorksheet.Cells:获取单元格集合。

ExcelRange.Value:获取或设置单元格的值。


操作工作表:

ExcelWorksheets.Add:添加新的工作表。

ExcelWorksheets.Delete:删除指定的工作表。


操作单元格:

ExcelRange.Merge:合并单元格。

ExcelRange.Style:设置单元格样式。


保存和关闭 Excel 文件:

ExcelPackage.Save:保存 Excel 文件。

ExcelPackage.Dispose:释放 ExcelPackage 对象。

using (var package = new ExcelPackage(new FileInfo("path/to/excel/file.xlsx")))
{
    // 获取工作簿对象
    ExcelWorkbook workbook = package.Workbook;

    // 获取工作表集合
    ExcelWorksheets worksheets = workbook.Worksheets;

    // 获取指定工作表
    ExcelWorksheet worksheet = worksheets["Sheet1"];   // 如果 Sheet1位于第一个位置,使用 worksheets[0] 也可以

    // 遍历每个工作表
    foreach (ExcelWorksheet worksheet in workbook.Worksheets)
    {
        // 获取工作表名称
        string sheetName = worksheet.Name;
        Console.WriteLine($"工作表名称:{sheetName}");

        // 获取工作表的行数和列数
        int rowCount = worksheet.Dimension.Rows;
        int columnCount = worksheet.Dimension.Columns;
        Console.WriteLine($"行数:{rowCount}, 列数:{columnCount}");

        // 遍历每行
        for (int row = 1; row <= rowCount; row++)
        {
            // 遍历每列
            for (int column = 1; column <= columnCount; column++)
            {
                // 获取单元格的值
                object cellValue = worksheet.Cells[row, column].Value;
                Console.WriteLine($"单元格({row}, {column}) 值:{cellValue}");
            }
        }
    }

    // 保存 Excel 文件
    package.Save();
}


第三步:其它注意事项

(1)上面的 Save / SaveAs 函数,对涉及到对 Excel 的读写,如果 Excel 是只读就会报错,最好在操作之前就检测一下。

// 获取Excel的读写属性
FileAttributes attributes = File.GetAttributes(文件的完整路径);

// 检查文件的读写属性
if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
{
    MessageBox.Show($"文本配置表Excel为只读模式,请修改后再操作。");
    return;
}


(2)部分Excel很大,处理起来非常耗时,有以下几个方法进行优化

用 Task 或者线程单独处理 Excel 的读、写、保存操作,处理过程中如果要操作主界面的UI(如果更新进度,打印输出日志)

private void writeLogByTask(string str)
{
    this.Invoke((Action)(() =>
    {
        TextBox_Log.AppendText(str + "\n");

        // 滚动至底部
        //TextBox_Log.ScrollToCaret();
    }));
}


Task.Run(parseDefaultTextExcelHandler).ContinueWith(task =>
{
    this.Invoke((Action)(() =>
    {
        // 操作主界面 UI
        Button_SaveText.Enabled = true;
        Button_SaveText.Text = "保存文本";
    }));
});


(3)当数据量过大时,特别是需要插入数据时,注意使用数组替代List,有插入操作创建数组时预留比较大的空间

private int getInsertIdx(int nId)
{
    int idx = -1;

    for (int i = 3; i < _textIdsArr.Length; i++)
    {
        if (nId > _textIdsArr[i - 1] && (nId < _textIdsArr[i] || _textIdsArr[i] == -1))
        {
            idx = i;
            break;
        }
    }

    if (idx != -1)
    {
        // 后移操作
        for (int i = _textIdsArr.Length - 1; i > idx; i--)
        {
            _textIdsArr[i] = _textIdsArr[i - 1];
        }

        // 插入操作
        _textIdsArr[idx] = nId;
    }

    return idx;
}


ExcelRange的读取操作,注意判断得到的值是否为空

ExcelWorksheet _worksheet = _excelPackage.Workbook.Worksheets[0];
string strContent = _worksheet.Cells[$"B{rowNum}"].Value?.ToString();

// 获取单元格的值
object cellValue = worksheet.Cells[row, column].Value;

// 用 "B1" 可以获取单元格的值,用  worksheet.Cells[1, 2] 也可以

(4) 单元格样式的操作方法:边框、行高、合并、背景色、文字颜色、文字大小

// 检查是否存在名为 "xxxx" 的工作表
bool sheetExists = excelPackage.Workbook.Worksheets.Any(sheet => sheet.Name == SHEET_NAME);
if (sheetExists)
{
    excelPackage.Workbook.Worksheets.Delete(SHEET_NAME);
    //excelPackage.Save();
}

ExcelWorksheet worksheet = excelPackage.Workbook.Worksheets.Add(SHEET_NAME);

// 设置XX项目xx版本周报
// 合并 A1 到 ?1 的单元格
char colStart = 'A';
char colEnd = (char)(colStart + (DEST_RELATE_DICTIONARY.Count - 1));
string strRange = string.Format("A1:{0}1", colEnd);

worksheet.Cells[strRange].Merge = true;

setCellBorder(worksheet.Cells[strRange]);

// 设置 A1 到 ?1 的单元格背景颜色为黄色
worksheet.Cells[strRange].Style.Fill.PatternType = ExcelFillStyle.Solid;
worksheet.Cells[strRange].Style.Fill.BackgroundColor.SetColor(Color.White);

// 设置 A1 到 ?1 的单元格高度为 30
worksheet.Row(1).Height = 30;

// 在 A1 到 ?1 的单元格中添加文本
worksheet.Cells["A1"].Value = "XX项目XX版本";
worksheet.Cells["A1"].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
worksheet.Cells["A1"].Style.VerticalAlignment = ExcelVerticalAlignment.Center;

worksheet.Cells["A1"].Style.Font.Name = FONT_NAME;
worksheet.Cells["A1"].Style.Font.Bold = true;
worksheet.Cells["A1"].Style.Font.Size = 20;           

// 构建第二列,定义自定义颜色
Color myColor = Color.FromArgb(255, 153, 0);
worksheet.Row(2).Height = 20;
for (int i = 0; i < FIELD_COLUMN_LIST.Count; i++)
{
    string secondRowColIdx = $"{(char)('A' + i)}2";

    ExcelRange cell = worksheet.Cells[secondRowColIdx];

    // 在 B 列中设置单元格值
    cell.Value = FIELD_COLUMN_LIST[i];

    // 设置单元格背景颜色
    cell.Style.Fill.PatternType = ExcelFillStyle.Solid;
    cell.Style.Fill.BackgroundColor.SetColor(myColor);
    cell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
    cell.Style.VerticalAlignment = ExcelVerticalAlignment.Center;

    cell.Style.Font.Name = FONT_NAME;
    cell.Style.Font.Bold = true;
    cell.Style.Font.Size = 10;

    setCellBorder(cell);
}



private void setCellBorder(ExcelRange cell)
{
    // 设置单元格所有线框
    cell.Style.Border.Top.Style = ExcelBorderStyle.Thin;
    cell.Style.Border.Left.Style = ExcelBorderStyle.Thin;
    cell.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
    cell.Style.Border.Right.Style = ExcelBorderStyle.Thin;

    cell.Style.Font.Name = FONT_NAME;
}

(5)复制多行单元格(保留其样式),并在指定的行插入复制的行

private void copyRowDataAndPaste(ExcelWorksheet worksheet, RowRangeInfo rowRangeInfo, int insertRowIdx)
{
    // 复制行数据
    int sourceRowStart = rowRangeInfo.sourceRowStartIdx;
    int sourceRowEnd = rowRangeInfo.sourceRowEndIdx;

    for (int row = sourceRowEnd; row >= sourceRowStart; row--)
    {
        // copyStylesFromRow
        worksheet.InsertRow(insertRowIdx, 1, row);

        writeLogToMainThread($"在第 {insertRowIdx} 行插入一行,复制第 {row} 行的样式");

        ExcelRange sourceRange = worksheet.Cells[row, 1, row, worksheet.Dimension.Columns];
        ExcelRange destinationRange = worksheet.Cells[insertRowIdx, 1, insertRowIdx, worksheet.Dimension.Columns];

        // update value
        destinationRange.Value = sourceRange.Value;
    }
}
// InsertRow函数的使用说明
using (var package = new ExcelPackage(new FileInfo("path/to/excel/file.xlsx")))
{
    ExcelWorksheet worksheet = package.Workbook.Worksheets["Sheet1"];

    // 在第3行之后插入2行
    worksheet.InsertRow(3, 2);

    // 从第1行复制样式到新插入的行
    worksheet.InsertRow(3, 2, 1);

    // 保存修改后的Excel文件
    package.Save();
}

(6)对指定的单元格设置注释

using (var package = new ExcelPackage(new FileInfo("path/to/excel/file.xlsx")))
{
    ExcelWorksheet worksheet = package.Workbook.Worksheets["Sheet1"];

    // 获取单元格A1
    ExcelRange cell = worksheet.Cells["A1"];

    // 设置注释
    ExcelComment comment = cell.AddComment("这是一个注释");
    comment.Author = "John";
    comment.AutoFit = true;

    // 获取注释的 RichText 对象
    ExcelRichText richText = comment.RichText.Add("这是注释的文本");

    // 设置文字大写
    richText.Font.Uppercase = true;

    // 设置其他字体属性
    richText.Font.Size = 12;
    richText.Font.Bold = true;
    richText.Font.Italic = true;
    richText.Font.Color = Color.Red;

    // 设置注释框的大小
    comment.SetSize(200, 100);

    // 保存修改后的Excel文件
    package.Save();
}

(7)删除指定的行

using (var package = new ExcelPackage(new FileInfo("path/to/excel/file.xlsx")))
{
    ExcelWorksheet worksheet = package.Workbook.Worksheets["Sheet1"];

    // 删除第5行
    int rowIndex = 5;
    worksheet.DeleteRow(rowIndex);

    // 保存修改后的 Excel 文件
    package.Save();
}


更多操作方法,请使用 ChatGPT 进行查询 Open-mouthed smile

标签:常用,worksheet,Cells,单元格,Excel,Style,cell,ExcelPackage
From: https://www.cnblogs.com/meteoric_cry/p/17466263.html

相关文章

  • Linux最常用命令(最全)精美
    By CaesarChang张旭       ~关注我 带你看更多精品技术和面试必备想要进修一下基础的可以加群    号码 1153132260 1  touch文件名:创建文件可以一次创建多个文件,以空格隔开        touchab2rm:删除文件或者文件夹-r:递归删......
  • JMeter常用功能及使用方法详解
    JMeter被广泛应用于软件性能测试,是一个开源的、纯Java编写的测试工具,其中包括了很多强大的功能。以下将重点介绍JMeter常用功能及使用方法。一、JMeter压力测试1.什么是JMeter压力测试?JMeter压力测试就是模拟多种负载条件并分析不同条件下系统(例如网站)的性能表现的过程。2.怎么做JM......
  • Docker(三):Docker的常用命令
    一、官方命令文档https://docs.docker.com/reference/二、基础命令1.查看docker版本信息dockerversion2.查看docker详细信息dockerinfo3.docker帮助命令docker--help三、镜像命令1.查看本机镜像dockerimages此命令能够查看本机上所有的镜像信息REPSOITO......
  • Redis五大数据类型以及常用命令
    Redis五大数据类型以及常用命令redis常用五大数据类型String(字符串)、List(列表)、Hash(哈希表)、Set(无序集合)、Zset(有序集合)redis数据库常见使用命令redis-server : redis服务器启动命令redis-cli : 客户端,操作入口select【dbid】 : 切换数据库dbsize : 查看当前数据库k......
  • 常用的文件操作命令
    vim,vi光标跳转到文首/文末/行首/行尾若在Insert模式下,需要先按一下Esc,文首:按gg(区分大小写)文末:按G(区分大小写)(跳转到行首和行尾,各有两种方法:)行首:①按option②按0(数字0)行尾:按fn+左右上下键......
  • 【20230607】【用Python让Excel飞起来】 第一章 python 快速上手 I
    001安装Anacondaanaconda.com直接下载,然后安装记得安装的时候将path和link.py点上,不然回头去配置环境变量有一些麻烦如何判断成功安装在CMD中输入conda-V即可查看002安装配置pycharm直接安装即可,官网下载,然后安装注意pycharm的pro版本是收费的,edu邮箱可以免费1年......
  • Python&Excel办公自动化
    操作工作簿01新建一个excel工作簿#2023-4-17importxlwingsasxw#启动excel,但不新建工作簿app是什么,app是excel程序本身app=xw.App(visible=True,add_book=True)#新建一个工作簿workbook=app.books.add()#保存新建的工作簿workbook.save('D:\python_data/tes......
  • BOS EDI 项目 Excel 方案开源介绍
    BOSEDI&Excel方案简介本文将继续分享BOS示例工作流:使用Excel端口和Email端口生成一系列文件,完成与BOS的EDI通信。下载工作流  下载示例文件 BOSEDI到Excel示例流具有预配置的端口,用于从BOS的EDI集成规范转换以下交易集:1.4905物料需求计划,BOS->企业2.4913发货通......
  • Python pandas库操作 excel
    Pythonpandas库操作excel特别提示:pandas库是基于numpy库的软件库,因此安装Pandas之前需要先安装numpy库。默认的pandas不能直接读写excel文件,需要安装读、写库即xlrd、xlwt才可以实现xls后缀的excel文件的读写,要想正常读写xlsx后缀的excel文件,还需要安装openpyxl库。数据......
  • 多线程:线程的常用方法
             ......