【问题标题】:How to use Epplus with cells containing few rows如何将 Epplus 与包含几行的单元格一起使用
【发布时间】:2016-05-02 08:25:33
【问题描述】:

我想使用 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 行有值) 我如何将该文本复制到所有行(这将帮助我解决问题)

【问题讨论】:

  • 请提出一个真实/具体的问题!感觉你需要两个 for 循环来获取所有数据。您目前根本没有使用 j 并且有 1 个用于单元格索引的硬代码。
  • accualy 我想添加图像来解释清楚,但它似乎没有得到更新...... j 用于获取工作表中的最后一行!
  • 只是为了确认 - 对于这个问题,您只关心阅读值电子表格,是吗?你不需要写值?

标签: c# asp.net-mvc excel epplus


【解决方案1】:

这些被称为合并单元格。来自合并单元格的值存储在合并范围内 first 单元格的 .Value 属性中。这意味着我们需要做更多的工作才能使用 EPPlus 从合并的单元格中读取值。

EPPlus 为我们提供了一些帮助我们获得正确参考的属性。首先,我们可以使用单元格的.Merge 属性来确定它是否是合并范围的一部分。然后我们可以使用工作表的.MergedCells 属性来查找相关范围。然后只需找到该范围内的第一个单元格并返回值即可。

所以,总结一下:

  1. 使用.Merge 确定我们需要读取的单元格是否属于合并范围的一部分
  2. 如果是,请使用工作表的 .MergedCells 属性获取合并范围的索引
  3. 从合并区域的第一个单元格中读取值

将这些放在一起,我们可以派生一个小辅助方法来获取工作表对象和行/列索引以返回值:

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 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();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    相关资源
    最近更新 更多