如何将 Epplus 与包含几行的单元格一起使用
How to use Epplus with cells containing few rows
我想使用 epplus 导入一些 excel 文件
问题是有些单元格包含不止一行(这会导致问题
我的excel看起来像这样(实际上他们是更多的测试(test2,test3 ....)
这个算法只能得到第一列..但是得到第二列会比较复杂
//this is the list than contain applications (column 2)
ICollection<Application> applications = new List<Application>();
int i = 0;
for (int j = workSheet.Dimension.Start.Row;
j <= workSheet.Dimension.End.Row;
j=i+1)
{
//this is the object that contain the first column
//and also a list of the second column (foreach domain thei `is a list of applications (column 2)`
Domaine domaine = new Domaine();
i += 1;
//add here and not last row
while (workSheet.Cells[i, 1].Text == "" && i < workSheet.Dimension.End.Row)
{
i++;
}
if (i > workSheet.Dimension.End.Row)
break;
domaine.NomDomaine = workSheet.Cells[i, 1].Text;
domaines.Add(domaine);
}
编辑:换句话说,这是一种获取一个单元格中行数的方法,或者一种复制单元格中每一行值的方法
(例如,如果我有一个从第 1 行到第 14 行的单元格,并且第 5 行有值)
我怎样才能将该文本复制到所有行(这将帮助我解决问题)
这些被称为合并单元格。来自合并单元格的值存储在合并区域中 第一个 单元格的 .Value
属性 中。这意味着我们需要做更多的工作才能使用 EPPlus 从合并的单元格中读取值。
EPPlus 为我们提供了一些属性,可以帮助我们获得正确的参考。首先,我们可以使用单元格的 .Merge
属性 来确定它是否是合并范围的一部分。然后我们可以使用工作表的 .MergedCells
属性 来找到相关的范围。然后只需找到该范围内的第一个单元格并 return 计算值即可。
所以,总结一下:
- 使用
.Merge
确定我们需要读取的单元格是否属于合并范围的一部分
- 如果是这样,使用工作表的
.MergedCells
属性 获取合并范围的索引
- 读取合并区域中第一个单元格的值
将这些放在一起,我们可以派生一个小的辅助方法来获取工作表对象和 row/col 索引,以便 return 值:
static string GetCellValueFromPossiblyMergedCell(ExcelWorksheet wks, int row, int col)
{
var cell = wks.Cells[row, col];
if (cell.Merge) //(1.)
{
var mergedId = wks.MergedCells[row, col]; //(2.)
return wks.Cells[mergedId].First().Value.ToString(); //(3.)
}
else
{
return cell.Value.ToString();
}
}
工作示例
如果我有这样的域 class:
class ImportedRecord
{
public string ChildName { get; set; }
public string SubGroupName { get; set; }
public string GroupName { get; set; }
}
我想从如下所示的电子表格中读取:
那我可以用这个方法:
static List<ImportedRecord> ImportRecords()
{
var ret = new List<ImportedRecord>();
var fInfo = new FileInfo(@"C:\temp\book1.xlsx");
using (var excel = new ExcelPackage(fInfo))
{
var wks = excel.Workbook.Worksheets["Sheet1"];
var lastRow = wks.Dimension.End.Row;
for (int i = 2; i <= lastRow; i++)
{
var importedRecord = new ImportedRecord
{
ChildName = wks.Cells[i, 4].Value.ToString(),
SubGroupName = GetCellValueFromPossiblyMergedCell(wks,i,3),
GroupName = GetCellValueFromPossiblyMergedCell(wks, i, 2)
};
ret.Add(importedRecord);
}
}
return ret;
}
static string GetCellValueFromPossiblyMergedCell(ExcelWorksheet wks, int row, int col)
{
var cell = wks.Cells[row, col];
if (cell.Merge)
{
var mergedId = wks.MergedCells[row, col];
return wks.Cells[mergedId].First().Value.ToString();
}
else
{
return cell.Value.ToString();
}
}
我想使用 epplus 导入一些 excel 文件 问题是有些单元格包含不止一行(这会导致问题
我的excel看起来像这样(实际上他们是更多的测试(test2,test3 ....)
这个算法只能得到第一列..但是得到第二列会比较复杂
//this is the list than contain applications (column 2)
ICollection<Application> applications = new List<Application>();
int i = 0;
for (int j = workSheet.Dimension.Start.Row;
j <= workSheet.Dimension.End.Row;
j=i+1)
{
//this is the object that contain the first column
//and also a list of the second column (foreach domain thei `is a list of applications (column 2)`
Domaine domaine = new Domaine();
i += 1;
//add here and not last row
while (workSheet.Cells[i, 1].Text == "" && i < workSheet.Dimension.End.Row)
{
i++;
}
if (i > workSheet.Dimension.End.Row)
break;
domaine.NomDomaine = workSheet.Cells[i, 1].Text;
domaines.Add(domaine);
}
编辑:换句话说,这是一种获取一个单元格中行数的方法,或者一种复制单元格中每一行值的方法
(例如,如果我有一个从第 1 行到第 14 行的单元格,并且第 5 行有值) 我怎样才能将该文本复制到所有行(这将帮助我解决问题)
这些被称为合并单元格。来自合并单元格的值存储在合并区域中 第一个 单元格的 .Value
属性 中。这意味着我们需要做更多的工作才能使用 EPPlus 从合并的单元格中读取值。
EPPlus 为我们提供了一些属性,可以帮助我们获得正确的参考。首先,我们可以使用单元格的 .Merge
属性 来确定它是否是合并范围的一部分。然后我们可以使用工作表的 .MergedCells
属性 来找到相关的范围。然后只需找到该范围内的第一个单元格并 return 计算值即可。
所以,总结一下:
- 使用
.Merge
确定我们需要读取的单元格是否属于合并范围的一部分
- 如果是这样,使用工作表的
.MergedCells
属性 获取合并范围的索引
- 读取合并区域中第一个单元格的值
将这些放在一起,我们可以派生一个小的辅助方法来获取工作表对象和 row/col 索引,以便 return 值:
static string GetCellValueFromPossiblyMergedCell(ExcelWorksheet wks, int row, int col)
{
var cell = wks.Cells[row, col];
if (cell.Merge) //(1.)
{
var mergedId = wks.MergedCells[row, col]; //(2.)
return wks.Cells[mergedId].First().Value.ToString(); //(3.)
}
else
{
return cell.Value.ToString();
}
}
工作示例
如果我有这样的域 class:
class ImportedRecord
{
public string ChildName { get; set; }
public string SubGroupName { get; set; }
public string GroupName { get; set; }
}
我想从如下所示的电子表格中读取:
那我可以用这个方法:
static List<ImportedRecord> ImportRecords()
{
var ret = new List<ImportedRecord>();
var fInfo = new FileInfo(@"C:\temp\book1.xlsx");
using (var excel = new ExcelPackage(fInfo))
{
var wks = excel.Workbook.Worksheets["Sheet1"];
var lastRow = wks.Dimension.End.Row;
for (int i = 2; i <= lastRow; i++)
{
var importedRecord = new ImportedRecord
{
ChildName = wks.Cells[i, 4].Value.ToString(),
SubGroupName = GetCellValueFromPossiblyMergedCell(wks,i,3),
GroupName = GetCellValueFromPossiblyMergedCell(wks, i, 2)
};
ret.Add(importedRecord);
}
}
return ret;
}
static string GetCellValueFromPossiblyMergedCell(ExcelWorksheet wks, int row, int col)
{
var cell = wks.Cells[row, col];
if (cell.Merge)
{
var mergedId = wks.MergedCells[row, col];
return wks.Cells[mergedId].First().Value.ToString();
}
else
{
return cell.Value.ToString();
}
}