用C#解释Excel文件

时间:2016-06-18 20:34:33

标签: c# excel epplus

我最近承接了一个小项目,我必须过滤Excel文件'表内容。我计划在这个项目中使用C#和EPPLUS,并将输入的Excel表转换为Datatable来处理所有数据查询。

但是,我从客户端获得的Excel文件是可疑的格式,其中表格在工作表上的所有位置都有填充说明和中间的空格。每个Excel文件似乎也有自己的方式来安排数据,以下是我目前所见的一个例子:

enter image description here

我只是做了一些将Excel表转换为C#的实验,但是从目前为止我所看到的系统基本上是从单元格A1开始逐页迭代一张数据。有没有办法在这个迭代过程中检测一个表,并将它们与标题/描述/空行分开?我想简单地检查表格边框以确定是否有表格,但是对于场景D,一些Excel文件甚至没有设置表格边框。

我打算告知客户这个,所以我们可以就Excel文件的标准格式达成一致,但这是我第一个使用解释Excel文件的项目,所以我也有一个小的元问题:这是正确的吗去做?我假设这些不同的Excel格式可能是由于业务选择(即来自不同部门),所以对于那些在过去遇到过这类问题的人来说,说服客户改变他们的标准是正常的。目前的方法还是应该与他们目前合作的方式一起使用?

1 个答案:

答案 0 :(得分:0)

正如评论中所提到的那样,如果"表"只是分散的细胞簇。您将不得不想出一些非常精细的AI来尝试检测可能的各种场景。

如果不能让客户改变他们的做法,但他们愿意稍微调整一下,我会建议使用真正的ExcelTables。有了这个,excel已经通过客户端或您应用表格为您完成了工作。例如,以下是工作表中的两个随机表:

enter image description here

请注意,我只是复制/粘贴了相同的单元格,然后我通过右上角的按钮将它们格式化为表格。这样做会让它看起来更好 - 它实际上创建了一个ExcelTable对象,您可以直接在EPPlus中引用它。以下是演示的内容:

public void Detect_Tables_Test()
{
    //http://stackoverflow.com/questions/37901408/interpreting-an-excel-file-in-c-sharp
    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}

现在您已经拥有了行/列地址,您可以将其用作获取数据的参考,在其上方查找描述行等等。