OLEDB を使用して Excel スプレッドシートからワークシート名を取得する際に問題があります。問題は、GetOleDbSchemaTable を使用すると、結果の DataTable に実際のワークシート名以上のものがあることです。Excelによって内部的に使用されていると想定できる「テーブル」の余分な行があります。
たとえば、myWorksheet という名前のワークシートがある場合、以下のコードは、myWorksheet$、myWorksheet$PrintTable、および myWorksheet$_ を含むリストになる可能性があります。最初の myWorksheet$ レコードのみが実際のワークシート用です。他は要らないゴミです。それらをメタデータで見ると、TABLE 型であっても通常のテーブルのように見えます。
今のところ、名前に「$_」または「$Print」が含まれているものを手動で除外しましたが、他の Excel 機能によってこれらの余分なレコードが別の形式で表示される可能性があることは誰にもわかりません。
ワークシートではないこれらの内部テーブルではなく、実際のワークシート名のみを取得する最良の方法を知っている人はいますか? メタデータにそれらを区別するものはありますか?
private ArrayList getXlsWorksheetNames(OleDb.OleDbConnection conn)
{
ArrayList wsList = new ArrayList();
DataTable schemaTable;
try
{
conn.Open();
schemaTable = conn.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Tables, null);
foreach (DataRow row in schemaTable.Rows)
{
//form.appendToResultsTxt("Adding worksheet to list: " + Environment.NewLine +
// "Name = " + row.Field<string>("TABLE_NAME") + "," + Environment.NewLine +
// "Type = " + row.Field<string>("TABLE_TYPE") + "," + Environment.NewLine + Environment.NewLine);
wsList.Add(row.Field<string>("TABLE_NAME"));
}
conn.Close();
}
catch (Exception ex)
{
if (this.mode == Cps2TxtUtilModes.GUI_MODE)
{
this.form.appendToResultsTxt(ex.ToString());
}
throw;
}
return wsList;
}
このリンクの記事を読みましたが、彼らは私とは違うことをしているようには見えず、ワークシート以外の余分なテーブルをフィルタリングして除外しているようには見えないため、Microsoft は正しい答え。
http://support.microsoft.com/kb/318452
また、以下のリンクのスレッドのように、多くの StackOverflow も調べましたが、これは役に立ちましたが、この 1 つの問題は解決しません。
Excel OleDbを使用してシート名をシート順に取得する
誰かが尋ねる前に、私はスプレッドシートで使用されている機能を実際に制御できないことも言いたいと思います。表を印刷する」。
どんなアイデアでも大歓迎です。ありがとう!