如何 return 来自 c# 中方法的多个数据

How to return mutiple data from a method in c#

我试图从 excel 文件中检索数据并存储到 datatable.It 中,对于单个 sheet 文件效果很好。但是如果 excel 文件包含多个 sheets 我必须从 sheets.Main 中检索所有值 现在我面临的问题是一些 sheets 包含与其他 sheets.if 相同的列名 我将其存储在单个数据中table 我将得到重复的列名 exception.How 来解决这个 problems.I 想到 return table 每个 sheet 通过使用 tupleparams 但没有解决此问题的任何想法.. 运行良好的单个 sheet 代码如下所示

我创建了如下扩展方法

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;
    }
}

为了阅读所有 sheet 我更改了行 var ws = pck.Workbook.Worksheets.First();var ws = pck.Workbook.Worksheets; 和迭代集合但以重复列异常结束,因为多个 sheet 具有相同列 names.Any 代码更改为共享 ?

更新

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

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(@"D:\sample.xlsx");

您可以 return 包含 table 列表的 DataSet 而不是 DataTable。 DataSet 中的每个 table 都代表 excel.

中的一个 sheet

您的代码将是这样的:

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;
    }
}

嗨,彼得,你为什么不直接 return IEnumerable< DataTable > ?

请注意 .First 是您在 IEnumerable 上用于获取单个项目的方法。 如果您先停止使用。那么你就有了整个 collection.

而不是 return 数据表,为什么不将方法更新为 return 数据集,由 Excel 文档中每个 sheet 的数据表组成。