我用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将已在单元格上定义的查找解释为数据(即使在默认值为空时也是如此)。
答案 0 :(得分:0)
快速和脏将在您的Linq语句中添加.Where(...),过滤掉非空行。
result = workbookPart.WorksheetParts
.Select(worksheetPart => ParseSheet(worksheetNames[worksheetPart.Uri.OriginalString], worksheetPart.Worksheet, stringTable))
.Where(e => e.Cell1 != string.Empty)
.ToList();
当然,这取决于你的ParseSheet()方法返回的内容。