了解了CAD中Table类的基本用法,今天咱们再来看看如何从Excel中读取数据,从而可以实现把数据丝滑地复制到CAD中。
我们这里使用NPOI库, NPOI 是一个开源的.NET库,允许.NET开发者在没有安装Microsoft Office的情况下读取和写入Microsoft Office文件格式。
一,安装NPOI库
在解决方案资源管理器中,右击项目名称,在弹出的菜单中选择管理NuGet程序包。
在弹出的界面中,选择浏览选项卡,输入NPOI,程序自动列出相应的库列表,选中、点击即可安装使用。
二、打开Excel
string filePath = @"c:\1.xlsx";
using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
IWorkbook workbook = new XSSFWorkbook(fs);//工作薄
ISheet sheet = workbook.GetSheetAt(0); // 获取第一个工作表
//输入操作代码
}
三、获取数据
1,获取表格行数
int rowNums = sheet.LastRowNum + 1;//从0开始算
2,获取表格列数
NPOI库没有专门获取总列数的方法,需要遍历每一行,获取每一行最后一个单元格的数值,求取最大值,可得出最多列数,适用于不同列数的单元格,列数是从1开始算的。
int colNums = 1;
int j;
for (int i = 0; i < rowNums; i++)
{
if( sheet.GetRow(i) != null)
{j = sheet.GetRow(i).LastCellNum;
if (j > colNums)
{ colNums = j; }
}
}
Console.WriteLine(#34;总共有{colNums}行");
如果每行列数相同可以通过下面代码获取:
int colNums =sheet.GetRow(0).LastCellNum;
3,获取指定行的行高
IRow row = sheet.GetRow(1);
double height = row.HeightInPoints;//获取第2行的行高,单位是磅
4,获取指定列的列宽
double width = sheet.GetColumnWidth(i) / 256://单位是字符宽度,根据使用字体不同,会有差异
5,获取合并单元格区域集合
var mergedRegion = sheet.MergedRegions;//合并单元格的坐标集合
这个集合的元素有四个值,分别是item.FirstRow, item.FirstColumn, item.LastRow, item.LastColumn,可遍历将其转换为元组,添加至集合中使用。
var mergedRegion = sheet.MergedRegions;//合并单元格的坐标集合
foreach (var item in mergedRegion)
{
var middle = new Tuple<int, int, int, int>(item.FirstRow, item.FirstColumn, item.LastRow, item.LastColumn);
}
6,获取对齐方式
IRow row = sheet.GetRow(1);//第2行
ICell cell = row.GetCell(1);//第2个单元格
ICellStyle cellStyle = cell.CellStyle;//单元格样式
string horizontalAlignment = cellStyle.Alignment.ToString();//水平对齐方式,三种:Left,Center,Rigth
string verticalAlignment = cellStyle.VerticalAlignment.ToString();//垂直对齐方式,三种:Top,Center,Bottom
7,获取单元格内容
string content = cell.ToString()
将所有内容都转换为字符串,如果单元格是公式,将会赋值公式,不是公式的结果,如=A1*A2
如果要获取公式的计算结果,可以按下面方法获取,识别判断是数字公式、字符串公式或布尔公式。
if (cell.CellType == CellType.Formula)
{
if (evaluator.Evaluate(cell).CellType is CellType.Numeric)
{
Console.WriteLine(#34;单元格内容是{evaluator.Evaluate(cell).NumberValue.ToString()}");
}
else if (evaluator.Evaluate(cell).CellType is CellType.String)
{
Console.WriteLine(#34;单元格内容是{evaluator.Evaluate(cell).StringValue.ToString()}");
}
else Console.WriteLine(#34;单元格内容是{evaluator.Evaluate(cell).BooleanValue.ToString()}");
}
四,注意事项
1,连接Excel时,需要将Excel文件关闭,否则会出现读取错误。
2,读取单元格时,如果单元格未赋值,程序会报错,记得加上判断语句 if(row != null)等。