使用ClosedXML读取Excel文件

54

我的Excel文件不是表格数据。我正在尝试从一个Excel文件中读取数据。 我的Excel文件中有一些是表格数据的部分。

我需要循环遍历从第3行到第20行的表格数据并读取它们。

以下是我的部分代码:

     string fileName = "C:\\Folder1\\Prev.xlsx";
     var workbook = new XLWorkbook(fileName);
     var ws1 = workbook.Worksheet(1); 

如何循环读取第3行到第20行的第3、4、6、7、8列? 此外,如果一行为空,如何确定并跳过它而不读取给定行的每一列的值。

4个回答

56

访问一行:

var row = ws1.Row(3);

检查行是否为空:

bool empty = row.IsEmpty();

访问行中的单元格(列):

var cell = row.Cell(3);
从单元格中获取数值:
object value = cell.Value;
// or
string value = cell.GetValue<string>();

了解更多信息请查看文档


你知道一种访问单元格样式并将其应用为HTML样式的方法吗? - xwpdev
这是另一个问题(也许你应该创建它)。你可以使用 cell.Style... 访问样式,但据我所知,你无法自动将它们转换为 HTML 或 CSS 样式。你需要自己编写转换器。 - Raidri
你能告诉我如何使用字段名获取单元格的值吗? - Neeraj Mehta
@NeerajMehta 你应该发布一个新的问题来询问那个。 - Raidri
现在发布http://stackoverflow.com/questions/33168302/how-to-get-the-value-of-excel-sheet-cell-using-their-field-name - Neeraj Mehta
@Raidri 请在 http://github.com/ClosedXML/ClosedXML 上链接到新网站。Codeplex 网站已经过时。 - Francois Botha

31

这是我的最爱。

var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row
foreach (var row in rows)
{
    var rowNumber = row.RowNumber();
    // Process the row
}

如果仅使用.RowsUsed(),您的范围将包含大量列。远远超过实际填充的数量!

因此,首先使用.RangeUsed()来限制范围。这将帮助您更快地处理文件!

您还可以使用.Skip(1)跳过列标题行(如果有的话)。


26

我不确定这个解决方案是否能解决OP的问题,但我更喜欢使用RowsUsed方法。它可用于获取仅非空或已由用户编辑的那些行的列表。这样,我可以避免在处理每一行时进行空值检查。

下面的代码片段可以处理所有非空行中第3到20行编号。在开始foreach循环之前,我已经过滤了空行。请注意,在开始处理行之前过滤非空行可能会影响将被处理的行的总数。因此,在应用基于foreach循环内处理的行数的任何逻辑时,您需要小心。

string fileName = "C:\\Folder1\\Prev.xlsx";
using (var excelWorkbook = new XLWorkbook(fileName))
{
    var nonEmptyDataRows = excelWorkbook.Worksheet(1).RowsUsed();

    foreach (var dataRow in nonEmptyDataRows)
    {
       //for row number check
       if(dataRow.RowNumber() >=3 && dataRow.RowNumber() <= 20)
       {
           //to get column # 3's data
           var cell = dataRow.Cell(3).Value;
       }
    }
}

RowsUsed方法在常见的需要处理Excel表格行的问题中非常有用。


2

它易于使用。

 XLWorkbook workbook = new XLWorkbook(FilePath);
 var rowCount = workbook.Worksheet(1).LastRowUsed().RowNumber();
 var columnCount = workbook.Worksheet(1).LastColumnUsed().ColumnNumber();
 int column = 1;
 int row = 1;
 List<string> ll = new List<string>();
 while (row <= rowCount)
 {
      while (column <= columnCount)
      {
         string title = workbook.Worksheets.Worksheet(1).Cell(row, column).GetString();
                ll.Add(title);
                column++;
       }

 row++;
 column = 1;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接