【发布时间】:2021-07-16 08:06:00
【问题描述】:
我有一个 Excel 工作表,其中有 50 行和 38 列“填充”了实际数据,但是当我尝试获取 .UsedRange 时,我得到的已用范围超过 1025 行和 250 列!请让我知道如何仅获取带有填充数据的实际使用范围并使用 Spreadsheetgear lib 检索实际范围数据?我尝试了类似的方法,但是当用户添加了一些列时,它不起作用。
var workbook = Factory.GetWorkbook(filePath);
var worksheet = workbook.Worksheets[0];
var cells = worksheet.UsedRange;
var headerCount = 0;
// get columns size
for (var columnCount = 0; columnCount <= range.ColumnCount; ++columnCount)
{
if (columnCount > headers.Length && string.IsNullOrEmpty(range[HeaderRow, columnCount].Text))
{
headerCount = columnCount - 1;
break;
}
}
【问题讨论】:
-
Used并不意味着Filled。即使单元格包含空字符串,也会使用它。生成此 Excel 工作表的应用程序可能已经用空格填充了额外的字段,或者忽略了“删除”空单元格。 Excel 本身会在保存工作簿时尝试压缩工作簿,方法是尽可能消除空单元格或将字符串转换为可重用资源 -
尝试使用不同的库,如 ExcelReader 来读取工作表中的数据。如果要读取特定范围,可以将其转换为具有特定名称的 Table 并按名称寻址范围。也可以只命名一个范围。 This SO question 展示了如何使用
sheet.Tables.Add(range,"SomeName")从范围创建命名表 -
SpreadsheetGear 在处理单元格值、确定 UsedRange 等方面非常接近地模拟 Excel 的行为。所以我不会在这里忽略 SpreadsheetGear 的行为,因为同样的行为也可能发生在 Excel 中(可以不能肯定地说,因为没有提供足够的信息)。另一种可能性是“预期的”UsedRange 之外的一些单元格以某种方式被格式化。例如,只需为单元格设置不同的字体,即使它没有单元格值,它也会包含在 UsedRange 中。 @Jdo,请看我的回答,看看这是否对你有帮助。
标签: c# .net excel spreadsheetgear