在 C# 中解释 Excel 文件
Interpreting an Excel file in C#
我最近进行了一个小项目,我必须过滤 Excel 个文件的 table 内容。我计划在这个项目中使用 C# 和 EPPLUS,并将输入 Excel table 转换为 Datatable 来处理所有数据查询。
但是,我从客户那里得到的 Excel 文件格式可疑,其中 table 到处都是 sheet,带有填充说明和空白之间的空间。每个 Excel 文件似乎也有自己的数据排列方式,以下是我目前所见的示例:
我只做了一些将 Excel table 转换为 C# 的实验,但据我目前所见,系统基本上是逐行迭代 sheet 从单元格 A1 开始。有没有办法在这个迭代过程中检测到 table,并将它们与 title/description/empty 行分开?我想简单地检查 table 边界以确定是否存在 table,但是在场景 D 中,一些 Excel 文件甚至没有设置 table 边界.
我打算就此通知客户,以便我们就 Excel 文件的标准格式达成一致,但这是我的第一个解释 Excel 文件的项目,所以我还有一个小元问题:这是正确的做法吗?我假设这些不同的 Excel 格式可能是由于业务选择(即来自不同部门),所以对于那些过去遇到过此类问题的人来说,说服客户改变他们目前的方法还是我应该只接受他们目前使用的方法?
如评论中所述,如果 "tables" 只是分散的细胞簇,那真是一团糟。您将不得不想出一些非常复杂的 AI 来尝试检测可能出现的各种情况。
如果不太可能让客户改变他们的做法,但他们愿意稍微调整一下,我建议使用 true ExcelTables
。有了这个,excel 已经通过客户端或您应用表格的方式为您完成了工作。例如,这里有工作表中的两个随机表:
请注意,我只是 copy/pasted 相同的单元格,但我随后通过右上角的按钮将它们格式化为表格。这不仅仅是让它看起来不错 - 它实际上创建了一个 ExcelTable
对象,您可以在 EPPlus 中直接引用该对象。这是将演示的内容:
public void Detect_Tables_Test()
{
//
var fileInfo = new FileInfo(@"c:\temp\DetectTablesTest.xlsx");
using (var pck = new ExcelPackage(fileInfo))
{
var workbook = pck.Workbook;
var worksheet = workbook.Worksheets.First();
var tables = worksheet.Tables;
tables.ToList().ForEach(table =>
{
Console.WriteLine($"{{Name: {table.Name}, Address: {table.Address}, Columns: {table.Columns.Count}}}");
});
}
}
这在输出中给出了这个:
{Name: 'Table1', Address: 'G10:I20', Columns: 3}
{Name: 'Table2', Address: 'A1:C11', Columns: 3}
现在您有了 row/col 个地址,您可以将其用作获取数据的参考,查找其上方的描述行等。
我最近进行了一个小项目,我必须过滤 Excel 个文件的 table 内容。我计划在这个项目中使用 C# 和 EPPLUS,并将输入 Excel table 转换为 Datatable 来处理所有数据查询。
但是,我从客户那里得到的 Excel 文件格式可疑,其中 table 到处都是 sheet,带有填充说明和空白之间的空间。每个 Excel 文件似乎也有自己的数据排列方式,以下是我目前所见的示例:
我只做了一些将 Excel table 转换为 C# 的实验,但据我目前所见,系统基本上是逐行迭代 sheet 从单元格 A1 开始。有没有办法在这个迭代过程中检测到 table,并将它们与 title/description/empty 行分开?我想简单地检查 table 边界以确定是否存在 table,但是在场景 D 中,一些 Excel 文件甚至没有设置 table 边界.
我打算就此通知客户,以便我们就 Excel 文件的标准格式达成一致,但这是我的第一个解释 Excel 文件的项目,所以我还有一个小元问题:这是正确的做法吗?我假设这些不同的 Excel 格式可能是由于业务选择(即来自不同部门),所以对于那些过去遇到过此类问题的人来说,说服客户改变他们目前的方法还是我应该只接受他们目前使用的方法?
如评论中所述,如果 "tables" 只是分散的细胞簇,那真是一团糟。您将不得不想出一些非常复杂的 AI 来尝试检测可能出现的各种情况。
如果不太可能让客户改变他们的做法,但他们愿意稍微调整一下,我建议使用 true ExcelTables
。有了这个,excel 已经通过客户端或您应用表格的方式为您完成了工作。例如,这里有工作表中的两个随机表:
请注意,我只是 copy/pasted 相同的单元格,但我随后通过右上角的按钮将它们格式化为表格。这不仅仅是让它看起来不错 - 它实际上创建了一个 ExcelTable
对象,您可以在 EPPlus 中直接引用该对象。这是将演示的内容:
public void Detect_Tables_Test()
{
//
var fileInfo = new FileInfo(@"c:\temp\DetectTablesTest.xlsx");
using (var pck = new ExcelPackage(fileInfo))
{
var workbook = pck.Workbook;
var worksheet = workbook.Worksheets.First();
var tables = worksheet.Tables;
tables.ToList().ForEach(table =>
{
Console.WriteLine($"{{Name: {table.Name}, Address: {table.Address}, Columns: {table.Columns.Count}}}");
});
}
}
这在输出中给出了这个:
{Name: 'Table1', Address: 'G10:I20', Columns: 3}
{Name: 'Table2', Address: 'A1:C11', Columns: 3}
现在您有了 row/col 个地址,您可以将其用作获取数据的参考,查找其上方的描述行等。