使用不同工作表名称的多个Excel工作表的读取

3
我想了解如何在C#中使用oledb读取不同工作表名称的多个Excel工作表。目前我有一个读取多个工作表的方法(但是只能读取固定的工作表名称):
DataSet ds = new DataSet();
var excelConnectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0", path); 
OleDbConnection connection = new OleDbConnection();
connection.ConnectionString = excelConnectionString;

var i = 1;
while (i <= 4)
{
    string query = "SELECT * FROM [Sheet" + i + "$]";
    ds.Clear();
    OleDbDataAdapter data = new OleDbDataAdapter(query, connection);
    data.Fill(ds);

    // other stuff
    i = i + 1;
}

这个是有效的。但是我现在面临不同的情况,其中工作表名称不固定,例如:Sheet1 是 Dog,Sheet2 是 Cat,Sheet3 是 Bird。

现在我的问题是如何使用现有的代码循环这些工作表名称。

2个回答

4

以下代码来自VB.net,但不确定翻译效果如何。返回一个字符串列表,该列表包含所有工作表的名称:

OleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})

MSDN 链接

一旦您有了工作表名称列表,您可以使用简单的 For Each 循环进行迭代。

编辑:

以下代码适用于 C#

添加函数

static DataTable GetSchemaTable(string connectionString)
{
    using (OleDbConnection connection = new 
               OleDbConnection(connectionString))
    {
        connection.Open();
        DataTable schemaTable = connection.GetOleDbSchemaTable(
            OleDbSchemaGuid.Tables,
            new object[] { null, null, null, "TABLE" });
        return schemaTable;
    }
}

您的代码将变为:

您的代码将变成:

DataSet ds = new DataSet();
var excelConnectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0", path); 
OleDbConnection connection = new OleDbConnection();
connection.ConnectionString = excelConnectionString;

DataTable sheets = GetSchemaTable(excelConnectionString);

foreach (dataRow r in sheets.rows)
{
    string query = "SELECT * FROM [" + r.Item(0).ToString + "]";
    ds.Clear();
    OleDbDataAdapter data = new OleDbDataAdapter(query, connection);
    data.Fill(ds);

}

请确保在每次迭代后都要对ds执行某些操作。


好的!谢谢你的想法。现在我需要寻找那个的C#版本 :) - SyntaxError
你绝对是正确的。我已经做出了解决方案,它看起来和你的解决方案一模一样。谢谢!干杯! :) - SyntaxError
无论如何,我在这里也找到了一个解决方案 http://www.codeproject.com/Articles/8096/C-Retrieve-Excel-Workbook-Sheet-Names - SyntaxError

0

我使用下面的代码,在同一个 Excel 文件中的不同工作表上均能正常运行。

using (SpreadsheetDocument doc = SpreadsheetDocument.Open(ratesFilePath, false))
{
    WorkbookPart workbookPart = doc.WorkbookPart;
    Sheets sheets = workbookPart.Workbook.GetFirstChild<Sheets>();
    foreach (Sheet sheet in sheets)
    {
        if (sheet.Name == "Sheet Name")
        {
            Worksheet worksheet = ((WorksheetPart)workbookPart.GetPartById(sheet.Id)).Worksheet;
            SheetData sheetData = (SheetData)worksheet.GetFirstChild<SheetData>();
            foreach (Row row in sheetData)
            {

                if ((row.FirstChild as Cell).CellReference.ToString().Contains("A") && (row.FirstChild as Cell).CellValue != null && row.RowIndex != 1)
                {
                    RateInformation RateInformationElement = new RateInformation();
                    foreach (Cell c in row)
                    {
                        string cellValue = null;
                        if ((c.DataType != null) && (c.DataType == CellValues.SharedString))
                        {
                            int id = -1;
                            if (Int32.TryParse(c.InnerText, out id))
                            {
                                SharedStringItem item = GetSharedStringItemById(workbookPart, id);
                                if (item.Text != null)
                                {
                                    //code to take the string value
                                    cellValue = item.Text.Text;
                                }
                                else if (item.InnerText != null)
                                {
                                    if (Convert.ToDouble(item.InnerText).ToString() != null)
                                    {
                                        cellValue = Convert.ToDouble(item.InnerText).ToString();
                                    }
                                    else 
                                    { 
                                        cellValue = item.InnerText;
                                    }
                                }
                                else if (item.InnerXml != null)
                                {
                                    cellValue = item.InnerXml;
                                }
                            }
                        }
                        else
                        {
                            cellValue = c.InnerText;
                        }
                        if (c.CellReference.ToString().Contains("A"))
                        {
                            RateInformationElement.Unit = cellValue;
                        }
                        else if (c.CellReference.ToString().Contains("B"))
                        {
                            Decimal.TryParse(cellValue, NumberStyles.Any, CultureInfo.InvariantCulture, out decimal result);
                            RateInformationElement.Price = Convert.ToDecimal(result);
                        }
                    }
                    rateInformations.Add(RateInformationElement);
                }
            }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接