使用npoi单元格范围地址读取excel

时间:2014-01-20 08:26:11

标签: c# excel npoi

我知道NPOI对于创建excel文件非常棒。现在我想在特定专栏中阅读excel。这是我的excel格式:

           D       E       F       G       H
3          Col1    Col2    Col3    Col4    Col5
4                  a               1       1/1/2014
5                  b               2       2/1/2014
6                  c               3       3/1/2014
7                  d               4       4/1/2014
8                  e               5       5/1/2014

我只想获得Col2,Col4和Col5中的数据。 它应该是这样的:

Col2   Col4   Col5
a      1      1/1/2014
b      2      2/1/2014
c      3      3/1/2014
d      4      4/1/2014
e      5      5/1/2014

我该怎么办? 我可以使用范围地址来获取特定列,然后获取单元格值吗?

感谢专家。

2 个答案:

答案 0 :(得分:7)

如果您有一个固定的工作表模板,那么实现您想要的最简单的方法是循环遍历行并检索指定索引处的单元格值。

例如,基于OP的例子:

var sheet = workbook.GetSheetAt(0); // assuming 0 is the worksheet index
for (var i = 0; i <= sheet.LastRowNum; i++)
{
  var row = sheet.GetRow(i);
  if (row == null) continue;

  // do your work here
  Console.Write("{0}\t", row.GetCell(4));
  Console.Write("{0}\t", row.GetCell(6));
  Console.Write("{0}\t", row.GetCell(7));
  Console.WriteLine();
}

但是如果你坚持使用范围地址,你可以尝试使用这样的CellRangeAddress类:

var sheet = workbook.GetSheetAt(0);
var range = "E3:H8";
var cellRange = CellRangeAddress.ValueOf(range);      

for (var i = cellRange.FirstRow; i <= cellRange.LastRow; i++)
{
  var row = sheet.GetRow(i);
  for (var j = cellRange.FirstColumn; j <= cellRange.LastColumn; j++)
  {
    // skip cell with column index 5 (column F)
    if (j == 5) continue;

    // do your work here
    Console.Write("{0}\t", row.GetCell(j));                             
  }

  Console.WriteLine();
}

答案 1 :(得分:0)

我知道这是一个老问题,但是使用NPOI读取文件有一个非常简单的解决方案。希望这会对某人有所帮助。

请注意,如果excel中有公式,则会为您提供公式而不是值。

using NPOI.Extension;    

创建一个类并设置列索引

public class DataItem
{
    [Column(Index = 4)]
    public string E_Column { get; set; }

    [Column(Index = 6)]
    public string G_Column { get; set; }

    [Column(Index = 7)]
    public string H_Column { get; set; }
}

现在为了阅读文件,我建议用try-catch包装它以防万一

private List<DataItem> LoadExcelData()
{
    // Load all the data from sheet 0, starting from row 4
    List<DataItem> result = Excel.Load<DataItem>(@"C:\temp\test.xlsx", 4, 0).ToList();

    return result;
}