具有列表查找功能的 OpenXML 读取 Excel 文件不会预过滤数据

本文关键字:文件 数据 过滤 Excel 读取 列表 查找 功能 OpenXML | 更新日期: 2023-09-27 18:36:49

我用openXML为excel文件编写了一个解析器。代码的核心是:

using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filePath, false))
  {
    WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
    List<SharedStringItem> stringTable = workbookPart.SharedStringTablePart.SharedStringTable.Elements<SharedStringItem>().ToList();
    Dictionary<string, string> worksheetNames = ReadWorksheetNames(workbookPart);
    result = workbookPart.WorksheetParts.Select(worksheetPart => ParseSheet(worksheetNames[worksheetPart.Uri.OriginalString], worksheetPart.Worksheet, stringTable)).ToList();
  }

这适用于简单的 excel 文件。 例如,一个包含八个数据行的文件给了我一个包含八个数据行的工作表。但是,当为一列定义列表查找时,工作表将返回1048552行。如何仅筛选真实数据?似乎 openXML 将已经在单元格上定义的查找解释为数据(即使默认值为空时也是如此)。

具有列表查找功能的 OpenXML 读取 Excel 文件不会预过滤数据

快速而肮脏的将是添加一个.Where(...) 到过滤掉非空行的 Linq 语句。

    result = workbookPart.WorksheetParts
        .Select(worksheetPart => ParseSheet(worksheetNames[worksheetPart.Uri.OriginalString], worksheetPart.Worksheet, stringTable))
        .Where(e => e.Cell1 != string.Empty)
        .ToList();

当然,这将取决于你的 ParseSheet() 方法返回什么。