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 (确定删除数据后周围数据填充方向)
- XLShiftDeletedCells.ShiftCellsUp :位于range区域正下方数据向上填充
- 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;