Export 之 ClosedXML Ranges篇


链接与安装

GitHub ClosedXML wiki

nuget

nuget 安装 :dotnet add package ClosedXML --version 0.95.4


什么是Range

这个在已经讨论过了,而且定位方法也有提到。


Merge 合并

var wb = new XLWorkbook();
var ws = wb.Worksheets.Add("Position");

// 选中了2、3两行,通过Row(1)指定合并其中的第一行
ws.Cell("B2").Value = "Merged Row(1) of Range (B2:D3)";
ws.Range("B2:D3").Row(1).Merge();
ws.Range("B2:D3").Style.Border.OutsideBorder = XLBorderStyleValues.Thick;

// 选中了F、G两列,通过Column(1)指定合并其中的第一列
ws.Cell("F2").Value = "Merged Column(1) of Range (F2:G8)";
ws.Cell("F2").Style.Alignment.WrapText = true;
ws.Range("F2:G8").Column(1).Merge();
ws.Range("F2:G8").Style.Border.OutsideBorder = XLBorderStyleValues.Thick;

// 合并整个区域,设置文本 水平、垂直居中
ws.Cell("B4").Value = "Merged Range (B4:D6)";
ws.Cell("B4").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
ws.Cell("B4").Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
ws.Range("B4:D6").Merge();
ws.Range("B4:D6").Style.Border.OutsideBorder = XLBorderStyleValues.Thick;

// 取消合并
ws.Cell("B8").Value = "Unmerged";
ws.Range("B8:D8").Merge();
ws.Range("B8:D8").Unmerge();
ws.Range("B8:D8").Style.Border.OutsideBorder = XLBorderStyleValues.Thick;

wb.SaveAs($"{Guid.NewGuid()}.xlsx");


Clear 清空

//构建 10x10单元 数据
foreach (var ro in Enumerable.Range(1, 10))
{
  foreach (var co in Enumerable.Range(1, 10))
  {
    var cell = ws.Cell(ro, co);
    cell.Value = cell.Address.ToString();//设置值为cell的地址
    cell.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; //设置水平居中
    cell.Style.Fill.BackgroundColor = XLColor.Turquoise; //设置背景颜色
    cell.Style.Font.Bold = true; //文本加粗
  }
}

// 清空一个区域
ws.Range("B1:C2").Clear();

// 指定区域上的 某行 进行清空
ws.Range("B4:C5").Row(1).Clear();

// 指定区域上的 某列 进行清空
ws.Range("E1:F4").Column(2).Clear();

// 第 7 行清空
ws.Row(7).Clear();

// 第 H 类清空
ws.Column("H").Clear();


Delete 删除

这是一个有趣的功能,初看文档我也没咋看明白,生成结果我悟了。来吧,我们一起缕一缕。

定义:与Clear不同,删除呈现的效果上如同excel 删除 行或列。周围数据会依据不同形式进行填充。

规则:

  • IXLRange提供的Delete方法必须指定 XLShiftDeletedCells (确定删除数据后周围数据填充方向)

    1. XLShiftDeletedCells.ShiftCellsUp :位于range区域正下方数据向上填充
    2. XLShiftDeletedCells.ShiftCellsLeft :位于range区域左侧数据向右填充
  • IXLRow 和 IXLColumn 删除没有任何参数,也就是说删除 行 一定向上填充,删除 列 一定向右填充

  • IXLRangeRow 和 IXLRangeColumn 无参默认如第二条规则,设置参数如第一条

//构建 10x10单元 数据
foreach (var ro in Enumerable.Range(1, 10))
    foreach (var co in Enumerable.Range(1, 10))
        ws.Cell(ro, co).Value = ws.Cell(ro, co).Address.ToString();//设置值为cell的地址

// 删除区域,向上填充
ws.Range("B4:C5").Delete(XLShiftDeletedCells.ShiftCellsUp);

// 删除区域,向左填充
ws.Range("D1:E3").Delete(XLShiftDeletedCells.ShiftCellsLeft);

// 删除整行
ws.Row(5).Delete();

// 删除区域行,向上填充
ws.Range("A1:C4").Row(2).Delete(XLShiftDeletedCells.ShiftCellsUp);

// 删除整列
ws.Column(5).Delete();

// 删除区域列,向左填充
ws.Range("A1:C4").Column(2).Delete(XLShiftDeletedCells.ShiftCellsLeft);

如果想很好的呈现删除规则,需要动图,之后再做吧。况且实际开发中很少使用这个功能。


Multiple Ranges 多区域选择

ws.Ranges("A1:B2,C3:D4,E5:F6").Style.Fill.BackgroundColor = XLColor.Red;

ws.Ranges("A5:B6,E1:F2").Style.Fill.BackgroundColor = XLColor.Orange;


Insert 插入行或列

var rngHeaders = ws.Range("B3:F3");

// 在选中row的上方插入行
ws.Row(1).InsertRowsAbove(2);

// 在选中列的前方插入列
ws.Column(1).InsertColumnsBefore(2);

rngHeaders.Style.Fill.BackgroundColor = XLColor.LightSalmon;


Named Ranges 对区域进行命名

  • 使用 IXLRange 的 AddToNamed("name") ,默认作用域为整个workbook(就是在不同的sheet中都可以使用)

  • 默认使用 IXLWorkbook 的 Range("name") 取回,如果 XLScope.Worksheet 使用 IXLWorkSheet 的 Range("name") 取回

var wsPresentation = wb.Worksheets.Add("Presentation");
var wsData = wb.Worksheets.Add("Data");

// 在data sheet中添加数据
wsData.Cell(1, 1).Value = "Name";
wsData.Cell(1, 2).Value = "Age";
wsData.Cell(2, 1).Value = "Tom";
wsData.Cell(2, 2).Value = 30;
wsData.Cell(3, 1).Value = "Dick";
wsData.Cell(3, 2).Value = 25;
wsData.Cell(4, 1).Value = "Harry";
wsData.Cell(4, 2).Value = 29;

// 对区域命名
wsData.Range("A2:B4").AddToNamed("PeopleData");

// 在函数中使用 求和运算
wsPresentation.Cell(1, 1).Value = "People Count:";
wsPresentation.Cell(1, 2).FormulaA1 = "COUNT(PeopleData)";

wsPresentation.Range("B1").AddToNamed("PeopleCount", XLScope.Worksheet);

wsPresentation.Cell(2, 1).Value = "Total:";
wsPresentation.Cell(2, 2).FormulaA1 = "PeopleCount";

// 复制区域
wsPresentation.Cell(4, 1).Value = "People Data:";
wsPresentation.Cell(5, 1).Value = wb.Range("PeopleData");
sheet Presentation sheet Data

Copy

// 定义一个区域
var firstTableCell = ws.FirstCellUsed(); //获取使用的第一个cell
var lastTableCell = ws.LastCellUsed(); //获取使用的最后一个cell
var rngData = ws.Range(firstTableCell.Address, lastTableCell.Address);

// copy到另一个sheet
var wsCopy = workbook.Worksheets.Add("Contacts Copy");
wsCopy.Cell(1,1).Value = rngData;