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

pet*_*ter 0 .net c# .net-4.5

我试图从excel文件中检索数据并存储到datatable.It适用于单张文件.但如果一个excel文件包含多张工作表我必须从工作表中检索所有值.现在我面临的主要问题是一些sheet包含与其他sheet相同的列名.如果我将它存储在单个数据表中,我将获得重复的列名异常.如何解决这个问题.我想通过使用返回每个表的表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;
    }
}
Run Code Online (Sandbox Code Playgroud)

阅读所有的床单,我改变线var ws = pck.Workbook.Worksheets.First();var ws = pck.Workbook.Worksheets;和迭代集合但是由于具有多张同一列names.Any代码更改共享重复列例外结束?

UPDATE

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

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();
                    }
                }
Run Code Online (Sandbox Code Playgroud)

UPDATE

调用代码如下所示

DataTable dt = Extensionexcel.Exceltotable(@"D:\ sample.xlsx");

Sri*_*vel 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;
    }
}
Run Code Online (Sandbox Code Playgroud)