96

null ではない電話番号フィールドを持つ、AZ でソートされたすべての姓フィールドの別のテーブルからサブテーブルを作成しようとしています。これは SQL で簡単に実行できますが、Excel 内で SQL クエリを実行する方法がわかりません。データをpostgresqlにインポートして、そこでクエリを実行したくなるのですが、それは少しやり過ぎのようです。

私がやろうとしていることは、SQL クエリSELECT lastname, firstname, phonenumber WHERE phonenumber IS NOT NULL ORDER BY lastnameでうまくいくでしょう。Excel がネイティブにできないこととしては、単純すぎるように思えます。このような SQL クエリを Excel 内から実行するにはどうすればよいですか?

4

10 に答える 10

76

これを行うには、他の人がすでに提案している多くの優れた方法があります。「SQL トラック経由で Excel データを取得する」に沿って、ここにいくつかのポインターがあります。

  1. Excel には「データ接続ウィザード」があり、別のデータ ソースから、またはまったく同じ Excel ファイル内からインポートまたはリンクすることができます。

  2. Microsoft Office (および OS) の一部として、関心のある 2 つのプロバイダーがあります。古い "Microsoft.Jet.OLEDB" と最新の "Microsoft.ACE.OLEDB" です。(データ接続ウィザードなどを使用して) 接続を設定するときにそれらを探します。

  3. Excel ワークブックに接続すると、ワークシートまたは範囲はテーブルまたはビューに相当します。ワークシートのテーブル名は、ワークシートの名前にドル記号 ("$") を追加し、角かっこ ("[" と "]") で囲んだものです。範囲の場合、それは単に範囲の名前です。名前のないセル範囲をレコードソースとして指定するには、標準の Excel の行/列表記をシート名の末尾に角かっこで囲んで追加します。

  4. ネイティブ SQL は (多かれ少なかれ) Microsoft Access の SQL になります。(以前は JET SQL と呼ばれていましたが、Access SQL は進化しており、JET は非推奨の古い技術だと思います。)

  5. 例、ワークシートを読む:SELECT * FROM [Sheet1$]

  6. 例、範囲の読み取り:SELECT * FROM MyRange

  7. 例、無名のセル範囲を読み取る:SELECT * FROM [Sheet1$A1:B10]

  8. 詳細を調べるのに役立つ書籍や Web サイトが数多くあります。

その他の注意事項

既定では、Excel データ ソースの最初の行には、フィールド名として使用できる列見出しが含まれていると想定されています。そうでない場合は、この設定をオフにする必要があります。そうしないと、データの最初の行がフィールド名として使用されなくなります。これは、オプションHDR= settingを接続文字列の拡張プロパティに追加することによって行われます。指定する必要のないデフォルトは ですHDR=Yes。列見出しがない場合は、指定する必要がありますHDR=No。プロバイダーは、フィールドに F1、F2 などの名前を付けます。

ワークシートの指定に関する注意事項: プロバイダーは、データのテーブルが、指定されたワークシートの一番上、一番左、空白でないセルから始まると想定します。言い換えれば、データのテーブルは、行 3、列 C から問題なく開始できます。ただし、たとえば、セル A1 のデータの上と左にワークシートのタイトルを入力することはできません。

範囲の指定に関する注意: ワークシートをレコードソースとして指定すると、プロバイダーはワークシート内の既存のレコードの下にスペースが許す限り新しいレコードを追加します。範囲 (名前付きまたは名前なし) を指定すると、スペースが許す限り、範囲内の既存のレコードの下に新しいレコードも追加されます。ただし、元の範囲に対して再クエリを実行すると、結果のレコードセットには範囲外の新しく追加されたレコードが含まれません。

のデータ型 (試してみる価値あり) CREATE TABLE: Short, Long, Single, Double, Currency, DateTime, Bit, Byte, GUID, BigBinary, LongBinary, VarBinary, LongText, VarChar, Decimal

「古い技術」の Excel (拡張子が xls のファイル) に接続しています: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyFolder\MyWorkbook.xls;Extended Properties=Excel 8.0;. Microsoft Excel 5.0 および 7.0 (95) ワークブックには Excel 5.0 ソース データベース タイプを使用し、Microsoft Excel 8.0 (97)、9.0 (2000)、および 10.0 (2002) ワークブックには Excel 8.0 ソース データベース タイプを使用します。

「最新」の Excel (ファイル拡張子が xlsx のファイル) への接続:Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Excel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;"

データをテキストとして扱う: IMEX 設定は、すべてのデータをテキストとして扱います。Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Excel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1";

(詳細はhttp://www.connectionstrings.com/excelを参照)

詳細については、http://msdn.microsoft.com/en-US/library/ms141683 (v=sql.90).aspxおよびhttp://support.microsoft.com/kb/316934を参照してください。

VBA 経由で ADODB 経由で Excel に接続

Microsoft JET 4 の詳細 ( http://support.microsoft.com/kb/275561 )

于 2013-09-24T14:48:05.670 に答える
7

tl;dr; Excel はこれらすべてをネイティブに実行します -フィルターテーブルを使用します

( http://office.microsoft.com/en-gb/excel-help/filter-data-in-an-excel-table-HA102840028.aspx )

oledb 接続を介してプログラムで Excel を開き、ワークシート内のテーブルで SQL を実行できます。

ただし、数式を使用せずにフィルターだけで、やりたいことをすべて実行できます。

  1. 見ているデータ内の任意の場所をクリックします
  2. リボン バーのデータに移動する
  3. 「フィルター」を選択すると、真ん中あたりでじょうごのように見えます
    • テーブルの最初の行の各セルのタイトハンド側に矢印が表示されます
  4. 電話番号の矢印をクリックし、空白の選択を解除します(最後のオプション)
  5. 姓の矢印をクリックし、az オーダー(一番上のオプション)を選択します。

遊んでみてください..いくつかの注意事項:

  1. フィルタリングされた行を選択して、別の場所に貼り付けることができます
  2. 左側のステータス バーに、行の総数のうち、フィルター条件を満たしている行の数が表示されます。(例: 313 レコード中 308 レコードが見つかりました)
  3. 区のExcel 2010で色でフィルタリングできます
  4. 場合によっては、データのステータスまたはクリーン バージョンを提供する計算列を作成し、それらをフィルター処理したり並べ替えたりすることもあります。(たとえば、他の回答の式のように)

頻繁に行う場合や、どこかでデータのインポートを自動化したい場合を除き、フィルターを使用して実行してください..ただし、完全を期すために:

C# オプション:

 OleDbConnection ExcelFile = new OleDbConnection( String.Format( "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0;HDR=YES\"", filename));
 ExcelFile.Open();

開始するのに便利な場所は、スキーマを確認することです。スキーマには、あなたが思っているよりも多くのものがあるかもしれません:

List<String> excelSheets = new List<string>();

// Add the sheet name to the string array.
foreach (DataRow row in dt.Rows) {
    string temp = row["TABLE_NAME"].ToString();
    if (temp[temp.Length - 1] == '$') {
         excelSheets.Add(row["TABLE_NAME"].ToString());
    }
}

次に、シートを照会する場合:

 OleDbDataAdapter da = new OleDbDataAdapter("select * from [" + sheet + "]", ExcelFile);
 dt = new DataTable();
  da.Fill(dt);

注 - Excel でテーブルを使用してください!:

Excel には、データをテーブルのように動作させる "テーブル" 機能があります。これにより、いくつかの大きな利点が得られますが、すべての種類のクエリを実行できるわけではありません。

http://office.microsoft.com/en-gb/excel-help/overview-of-excel-tables-HA010048546.aspx

Excel の表形式データの場合、これが私のデフォルトです。最初にデータをクリックし、リボンのホーム セクションから [表としてフォーマット] を選択します。これにより、デフォルトでフィルタリングとソートが可能になり、テーブルとフィールドに名前でアクセスできるようになります (例: table[fieldname] )。これにより、列の集計関数 (max や average など) も可能になります。

于 2013-09-24T09:20:59.650 に答える
4

Excel で SQL を使用できます。うまく隠されているだけです。このチュートリアルを参照してください:

http://smallbusiness.chron.com/use-sql-statements-ms-excel-41193.html

于 2013-09-24T12:50:58.640 に答える
2

一度これを行う必要がある場合は、Charles の説明に従ってください。ただし、フィルターを動的にしたい場合は、Excel の数式とヘルパー列を使用してこれを行うこともできます。

データがシート DataSheet にあり、次の列の行 2 から始まると仮定します。

  • A:姓
  • B: ファーストネーム
  • C: 電話番号

このシートには 2 つのヘルパー列が必要です。

  • D2: =if(A2 = "", 1, 0)、これは、where 条件に対応するフィルター列です。
  • E2: =if(D2 <> 1, "", sumifs(D$2:D$1048576, A$2:A$1048576, "<"&A2) + sumifs(D$2:D2, A$2:A2, A2))、これは次の順序に対応します

これらの数式を、データがある限りコピーします。

結果を表示するシートに、次の列を作成します。

  • A: 行 2 の 1 から始まる一連の数字。これにより、取得できる行の総数が制限されます (続編の制限のようなものです)。
  • B2: =match(A2, DataSheet!$E$2:$E$1048576, 0)、これは対応するデータの行です
  • C2: =iferror(index(DataSheet!A$2:A$1048576, $B2), "")、これは実際のデータであるか、データが存在しない場合は空です

B2 と C2 の数式を下にコピーし、列 C を D と E にコピー アンド ペーストします。

于 2013-09-21T18:38:56.590 に答える
0

Expat ライブラリに対してコンパイルされたGDAL/OGRがある場合は、 XLSX ドライバーを使用して.xlsx ファイルを読み取り、コマンド プロンプトから SQL 式を実行できます。たとえば、スプレッドシートと同じディレクトリにあるosgeo4wシェルから、 ogrinfoユーティリティを使用します。

ogrinfo -dialect sqlite -sql "SELECT name, count(*) FROM sheet1 GROUP BY name" Book1.xlsx

でSQLiteクエリを実行しsheet1、クエリ結果を通常とは異なる形式で出力します。

INFO: Open of `Book1.xlsx'
      using driver `XLSX' successful.

Layer name: SELECT
Geometry: None
Feature Count: 36
Layer SRS WKT:
(unknown)
name: String (0.0)
count(*): Integer (0.0)
OGRFeature(SELECT):0
  name (String) = Red
  count(*) (Integer) = 849

OGRFeature(SELECT):1
  name (String) = Green
  count(*) (Integer) = 265
...

または、 ogr2ogrを使用して同じクエリを実行し、単純なCSVファイルを作成します。

$ ogr2ogr -f CSV out.csv -dialect sqlite \
          -sql "SELECT name, count(*) FROM sheet1 GROUP BY name" Book1.xlsx

$ cat out.csv
name,count(*)
Red,849
Green,265
...

古い .xls ファイルで同様のことを行うには、FreeXL ライブラリに対してビルドされたXLS ドライバーが必要になりますが、これはあまり一般的ではありません (たとえば、OSGeo4w からではありません)。

于 2016-10-13T04:05:21.607 に答える
-1

選択した言語/プラットフォームで、Excel 用のネイティブ DB ドライバーを試すことができます。Java の世界では、Excel シートを直接操作するための JDBC ドライバーを提供するhttp://code.google.com/p/sqlsheet/を試すことができます。同様に、他のプラットフォーム用の DB テクノロジのドライバーを入手できます。

ただし、これらのラッパー ライブラリが提供する機能の数では、すぐに壁にぶつかることを保証できます。より良い方法は、Apache HSSF/POI または同様のレベルのライブラリを使用することですが、より多くのコーディング作業が必要になります。

于 2013-09-14T05:16:34.393 に答える
-1

誤解されているかもしれませんが、これはまさにピボット テーブルの機能ではないでしょうか。テーブルまたはフィルター処理されたリストにデータがありますか? テーブルでない場合は、1 つにします (ctrl + l)。テーブル内の任意のセルをアクティブにして、ピボット テーブルを別のシートに挿入します。次に、列 lastname、firstname、phonenumber を行セクションに追加します。次に、フィルター セクションに電話番号を追加し、null 値を除外します。今すぐ通常のように並べ替えます。

于 2013-09-20T23:47:37.800 に答える
-2

Microsoft Access と LibreOffice Base は、スプレッドシートをソースとして開き、SQL クエリを実行できます。これは、あらゆる種類のクエリを実行する最も簡単な方法であり、マクロの実行やコードの記述の混乱を避けることができます。

Excelには、例のような多くの単純なクエリを実行するオートフィルターとデータの並べ替えもあります. これらの機能についてサポートが必要な場合は、私よりも Google のチュートリアルの方が適しています。

于 2013-09-20T00:52:30.617 に答える