如何从c#中的方法返回多个数据

时间:2015-04-11 12:33:35

标签: c# .net .net-4.5

我试图从excel文件中检索数据并存储到datatable.It适用于单张文件。但是如果excel文件包含多张工作表我必须从工作表中检索所有值。现在主要问题我是饰面是一些工作表包含与其他工作表相同的列名。如果我将它存储在一个数据表中,我将获得重复的列名异常。如何解决这个问题。我想通过使用tuple来返回每个工作表的表格params但是没有任何想法可以解决这个问题..单张表的代码运行良好如下所示

我创建了一个类似下面的扩展方法

public static DataTable getDataTableFromExcel(string path)
{
    using (var pck = new OfficeOpenXml.ExcelPackage())
    {
        DataTable tbl = new DataTable();
        try
        {
            using (var stream = File.OpenRead(path))
            {
                pck.Load(stream);
            }
            var ws = pck.Workbook.Worksheets.First();
            bool hasHeader = true; // adjust it accordingly( i've mentioned that this is a simple approach)
            string ErrorMessage = string.Empty;
            foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column])
            {
                tbl.Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column));
            }
            var startRow = hasHeader ? 2 : 1;
            for (var rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++)
            {
                var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column];
                var row = tbl.NewRow();
                foreach (var cell in wsRow)
                {
                    row[cell.Start.Column - 1] = cell.Text;
                }
                tbl.Rows.Add(row);
            }
        }
        catch (Exception exp)
        {

        }
        return tbl;
    }
}

读取所有工作表我更改了行var ws = pck.Workbook.Worksheets.First();var ws = pck.Workbook.Worksheets;和迭代集合但以重复列异常结束,因为多个工作表具有相同的列名。任何代码更改为共享?

更新

对于迭代收集我确实如下所示

public static DataTable Exceltotable(this string path)
        {
            using (var pck = new OfficeOpenXml.ExcelPackage())
            {
                DataTable tbl = new DataTable();
                try
                {
                    using (var stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                    {
                        pck.Load(stream);
                    }
                    var wss = pck.Workbook.Worksheets;
                    foreach (var ws in wss)
                    {
                        bool hasHeader = true; // adjust it accordingly( i've mentioned that this is a simple approach)
                        string ErrorMessage = string.Empty;
                        foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column])
                        {

                                if ((firstRowCell.Text != "MAXIMO FIELD NAME") && (firstRowCell.Text != "Sr NO") && (firstRowCell.Text != "Sr NO"))
                                {
                                    tbl.Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column));
                                }


                        }
                        var startRow = hasHeader ? 2 : 1;
                        for (var rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++)
                        {
                            var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column];
                            var row = tbl.NewRow();
                            foreach (var cell in wsRow)
                            {
                                row[cell.Start.Column - 1] = cell.Text;
                            }
                            tbl.Rows.Add(row);
                        }
                        Console.WriteLine();
                    }
                }

更新

调用代码如下所示

DataTable dt = Extensionexcel.Exceltotable(@&#34; D:\ sample.xlsx&#34;);

3 个答案:

答案 0 :(得分:6)

您可以返回包含表格的DataSet而不是DataTable。 DataSet中的每个表都代表excel中的工作表。

您的代码将是这样的:

public static DataSet Exceltotable(this string path)
{
    using (var pck = new OfficeOpenXml.ExcelPackage())
    {
        using (var stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        {
            pck.Load(stream);
        }

        DataSet dataSet = new DataSet();
        var wss = pck.Workbook.Worksheets;
        foreach (var ws in wss)
        {
            DataTable tbl = new DataTable();
            //Populate the datatable here
            ...
           dataSet.Tables.Add(tbl);
        }
        return dataSet;
    }
}

答案 1 :(得分:3)

你好peter为什么不直接返回IEnumerable&lt; DataTable&gt; ?

请注意.First是一种在IEnumerable上使用的方法来获取单个项目。 如果你先停止使用然后你就拥有了整个系列。

答案 2 :(得分:3)

为什么不更新方法以返回DataSet,而不是返回DataTable,为什么不返回一个DataSet,它包含Excel文档中每个工作表的DataTable。