1

Excelブックのワークシートのリストを取得しようとしていますが、返されるコレクションには、元のxlsxxmlでは「定義済みの名前」と呼ばれているように見えるシート名とデータ列IDの両方が含まれています。ワークシート名のみを返す方法を教えてください。

私が使用しているコードは、次の行に沿っています。

OleDbConnection connExcel = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;"
            + @"Data Source=" + FilePath + ";"
            + @"Extended Properties=""Excel 8.0;HDR=Yes;""");

OleDbCommand cmdExcel = new OleDbCommand();
cmdExcel.Connection = connExcel;
connExcel.Open();

DataTable testTable = connExcel.GetSchema("Tables");

結果のtestTableコレクションの内容には、TABLE_NAMEの下に次のエントリが含まれます。

  • DATA1
  • DATA2
  • データ3
  • DATA4
  • DATA5
  • Sheet1 $
  • TEST1 -TEST2
  • TESTHKEY
  • テストキー
  • TESTVKEY

それらはすべてTABLE_TYPEのTABLEを持っています。

上記に対応する元のワークブックには、5列を含む1つのワークシートがあり、最初の行にはヘッダーが含まれます。Sheet1$エントリにのみ興味があります。スプレッドシートはExcel2010で作成されていますが、C#で記述されたASP.NET4アプリで処理しようとしています。ワークシートの名前が変更されている可能性があるため、常にSheet1$になることを保証することはできません。

4

2 に答える 2

3

私の最初の考えは間違っていたので、回避策としてこれを思いつきました。返される実際のワークシート名は常に$で終わるはずなので、それをハックして確認しました。散らかっていますが、あなたは私が確信している一般的な考えを理解します。

OleDbConnection connExcel = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;"
        + @"Data Source=c:\test.xlsx;"
        + @"Extended Properties=""Excel 12.0 Xml;HDR=Yes;""");

        OleDbCommand cmdExcel = new OleDbCommand();
        cmdExcel.Connection = connExcel;
        connExcel.Open();

        DataTable testTable = connExcel.GetSchema("Tables");

        String[] excelSheets = new String[testTable.Rows.Count];
        int i = 0;

        foreach (DataRow row in testTable.Rows)
        {
            excelSheets[i] = row["TABLE_NAME"].ToString();

            if (excelSheets[i].EndsWith("$"))
            {
                Console.WriteLine(excelSheets[i] = row["TABLE_NAME"].ToString());
                i++;
            }
            else
            {
                i++;
            }

        }

        Console.ReadLine();
于 2012-05-24T19:17:54.873 に答える
-1
private static string EXCEL_CONNECTIONSTRING = string.Format("Provider=Microsoft.ACE.OLEDB.12.0; data source={0}; Extended Properties=Excel 12.0;", "#{FILENAME}");

private IEnumerable<string> GetWorksheetNames(string excelFile)
{

     var currentConnectionString = EXCEL_CONNECTIONSTRING.Replace("#{FILENAME}", excelFile);

     using (OleDbConnection connection = new OleDbConnection(currentConnectionString))
     {
        OleDbCommand cmdExcel = new OleDbCommand();


        cmdExcel.Connection = connection;
        connection.Open();

        DataTable dt = connection.GetSchema("Tables");

        IEnumerable<string> excelSheets = dt.Rows.Cast<DataRow>().Select(row => row["TABLE_NAME"].ToString());
        dt.Dispose();
        connection.Close();
        return excelSheets;

     }

  }
于 2019-09-30T14:33:06.890 に答える