web-dev-qa-db-fra.com

Comment exécuter une requête SQL sur une table Excel?

J'essaie de créer une sous-table à partir d'une autre table de tous les champs de nom de famille triés de A à Z qui ont un champ de numéro de téléphone qui n'est pas nul. Je pourrais le faire assez facilement avec SQL, mais je ne sais pas comment exécuter une requête SQL dans Excel. Je suis tenté d'importer les données dans postgresql et de les interroger là-bas, mais cela semble un peu excessif. 

Pour ce que j'essaie de faire, la requête SQL SELECT lastname, firstname, phonenumber WHERE phonenumber IS NOT NULL ORDER BY lastname ferait l'affaire. Cela semble trop simple pour que ce soit quelque chose qu'Excel ne puisse pas faire en natif. Comment puis-je exécuter une requête SQL comme celle-ci à partir d'Excel?

63
Vap0r

Il existe de nombreuses manières de procéder, que d'autres ont déjà suggérées. En suivant le "Obtenir des données Excel via une piste SQL", voici quelques pointeurs.

  1. Excel dispose de "l'Assistant de connexion de données" qui vous permet d'importer ou de créer un lien depuis une autre source de données ou même au sein du même fichier Excel.

  2. Dans le cadre de Microsoft Office (et du système d’exploitation), il existe deux fournisseurs d’intérêt: l’ancien "Microsoft.Jet.OLEDB" et le dernier "Microsoft.ACE.OLEDB". Recherchez-les lors de la configuration d'une connexion (comme avec l'Assistant Connexion de données).

  3. Une fois connecté à un classeur Excel, une feuille de calcul ou une plage est l’équivalent d’une table ou d’une vue. Le nom de table d'une feuille de calcul est le nom de la feuille de calcul avec un signe dollar ("$") ajouté à celle-ci et entouré de crochets ("[" et "]"); d'une plage, c'est simplement le nom de la plage. Pour spécifier une plage de cellules non nommée comme source d’enregistrement, ajoutez entre les crochets la notation standard ligne/colonne Excel à la fin du nom de la feuille.

  4. Le SQL natif sera (plus ou moins) le SQL de Microsoft Access. (Dans le passé, cela s'appelait JET SQL; cependant, Access SQL a évolué et je pense que JET est obsolète, ancien technicien.)

  5. Exemple, lecture d'une feuille de calcul: SELECT * FROM [Sheet1 $]

  6. Exemple, lecture d'une plage: SELECT * FROM MyRange

  7. Exemple, lecture d'une plage de cellules sans nom: SELECT * FROM [Sheet1 $ A1: B10]

  8. Il existe de nombreux livres et sites Web disponibles pour vous aider à résoudre ces problèmes.

=== Notes complémentaires ===

Par défaut, il est supposé que la première ligne de votre source de données Excel contient des en-têtes de colonne pouvant être utilisés comme noms de champs. Si ce n'est pas le cas, vous devez désactiver ce paramètre ou votre première ligne de données "disparaît" pour être utilisée comme nom de champ. Pour ce faire, vous ajoutez le paramètre optionnel HDR = aux propriétés étendues de la chaîne de connexion. La valeur par défaut, qui n'a pas besoin d'être spécifiée, est HDR = Yes. Si vous n'avez pas d'en-tête de colonne, vous devez spécifier HDR = No; le fournisseur nomme vos champs F1, F2, etc.

Avertissement concernant la spécification des feuilles de calcul: le fournisseur suppose que votre tableau de données commence par la cellule supérieure, la plus à gauche et non vide de la feuille de calcul spécifiée. En d'autres termes, votre table de données peut commencer à la rangée 3, colonne C sans problème. Toutefois, vous ne pouvez pas, par exemple, saisir un titre de feuille de travail au-dessus et à gauche des données de la cellule A1.

Avertissement concernant la spécification de plages: lorsque vous spécifiez une feuille de calcul comme source d'enregistrements, le fournisseur ajoute de nouveaux enregistrements en dessous des enregistrements existants dans la feuille de travail, dans la mesure où l'espace le permet. Lorsque vous spécifiez une plage (nommée ou non), Jet ajoute également de nouveaux enregistrements en dessous des enregistrements existants dans la plage, dans la mesure où l'espace le permet. Toutefois, si vous effectuez une nouvelle recherche sur la plage d'origine, le jeu d'enregistrements résultant n'inclut pas les enregistrements nouvellement ajoutés en dehors de la plage.

Types de données (à essayer) pour CREATE TABLE: Court, Long, Simple, Double, Monnaie, DateTime, Bit, Octet, GUID, BigBinary, LongBinary, VarBinary, LongText, VarChar, Decimal.

Connexion à "old tech" Excel (fichiers avec l'extension xls): Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyFolder\MyWorkbook.xls;Extended Properties=Excel 8.0;. Utilisez le type de base de données source Excel 5.0 pour les classeurs Microsoft Excel 5.0 et 7.0 (95), ainsi que le type de base de données source Excel 8.0 pour les classeurs Microsoft Excel 8.0 (97), 9.0 (2000) et 10.0 (2002).

Connexion à la "dernière" Excel (fichiers avec l’extension de fichier xlsx): Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Excel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;"

Traitement des données en tant que texte: le paramètre IMEX traite toutes les données en tant que texte. Fournisseur = Microsoft.ACE.OLEDB.12.0; Source de données = Excel2007file.xlsx; Propriétés étendues = "Excel 12.0 Xml; HDR = OUI; IMEX = 1";

(Plus de détails sur http://www.connectionstrings.com/Excel )

Plus d'informations sur http://msdn.Microsoft.com/en-US/library/ms141683(v=sql.90).aspx et sur http://support.Microsoft.com/kb/ 316934

Connexion à Excel via ADODB via VBA, voir http://support.Microsoft.com/kb/257819

Les détails de Microsoft JET 4 sur http://support.Microsoft.com/kb/275561

49
rskar

Vous pouvez le faire nativement comme suit:

  1. Sélectionnez le tableau et utilisez Excel pour le trier par nom
  2. Créez un critère de filtre avancé de 2 lignes par colonne, par exemple, dans E1 et E2, où E1 est vide et E2 contient la formule =C6="" Où C6 est la première cellule de données de la colonne de numéros de téléphone.
  3. Sélectionnez le tableau et utilisez le filtre avancé, copiez-le dans une plage en utilisant La plage de critères dans E1: E2 et spécifiez l'emplacement de copie de la sortie

Si vous voulez le faire par programme, je vous suggère d’utiliser le Macro Recorder pour enregistrer les étapes ci-dessus et consulter le code.

8
Charles Williams

tl; dr; Excel fait tout cela nativement - utilisez filtres et tableaux 

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

Vous pouvez ouvrir Excel par programme via une connexion oledb et exécuter SQL sur les tables de la feuille de calcul.

Mais vous pouvez faire tout ce que vous demandez, sans utiliser de formules, mais uniquement des filtres.

  1. cliquez n'importe où dans les données que vous regardez
  2. aller aux données sur le ruban
  3. sélectionnez "Filtrer" son ​​à peu près au milieu et ressemble à un entonnoir
    • vous aurez maintenant des flèches sur le côté serré de chaque cellule de la première rangée de votre tableau
  4. cliquez sur la flèche sur le numéro de téléphone et désélectionnez les blancs (dernière option)
  5. cliquez sur la flèche sur le nom de famille et sélectionnez une commande a-z (option du haut)

avoir un jeu .. quelques choses à noter:

  1. vous pouvez sélectionner les lignes filtrées et les coller ailleurs
  2. dans la barre d'état à gauche, vous verrez combien de lignes répondent à vos critères de filtrage par rapport au nombre total de lignes. (par exemple, 308 sur 313 enregistrements trouvés)
  3. vous pouvez filtrer par couleur dans Excel 2010 dans les services
  4. Parfois, je crée des colonnes calculées qui donnent des statuts ou des versions nettoyées de données que vous pouvez ensuite filtrer ou trier en fonction de ces thèses. (par exemple, comme les formules dans les autres réponses)

Faites-le avec des filtres à moins que vous ne le fassiez souvent ou que vous souhaitiez automatiser l'importation de données quelque part ou quelque chose d'autre .. mais pour être complet:

Option A 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();

pour commencer, jetez un coup d’œil au schéma, car il pourrait y en avoir plus que vous ne le pensez:

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

puis quand vous voulez interroger une feuille:

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

NOTE - Utilisez les tableaux dans Excel !:

Excel possède des fonctionnalités de "tables" qui permettent aux données de se comporter davantage comme une table. Cela vous donne de grands avantages, mais ne vous permettra pas de faire tous les types de requêtes. 

http://office.Microsoft.com/en-gb/Excel-help/overview- of-Excel-tables-HA010048546.aspx

Pour les données tabulaires dans Excel, c’est ma configuration par défaut. La première chose à faire est de cliquer sur les données, puis de sélectionner "formater sous forme de tableau" dans la section "Accueil" du ruban. Cela vous donne le filtrage et le tri par défaut et vous permet d'accéder à la table et aux champs par leur nom (par exemple, table [nom du champ]). Cela permet également d'agréger des fonctions sur des colonnes, par exemple. max et moyenne

5
user359135

Vous pouvez utiliser SQL dans Excel. Ce n'est que bien caché ... Voir ce tutoriel:

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

3
Piotr Kołaczkowski

Si vous devez le faire une fois, suivez simplement les descriptions de Charles, mais vous pouvez également le faire avec des formules Excel et des colonnes auxiliaires au cas où vous souhaiteriez dynamiser le filtre.

Supposons que vos données se trouvent sur la feuille DataSheet et commence à la ligne 2 des colonnes suivantes:

  • A: nom de famille
  • B: prénom
  • C: numéro de téléphone

Vous avez besoin de deux colonnes d'assistance sur cette feuille.

  • D2: =if(A2 = "", 1, 0), il s'agit de la colonne de filtre correspondant à votre condition where.
  • E2: =if(D2 <> 1, "", sumifs(D$2:D$1048576, A$2:A$1048576, "<"&A2) + sumifs(D$2:D2, A$2:A2, A2)), cela correspond à la commande par

Copiez ces formules dans la mesure où vos données disparaissent.

Sur la feuille qui devrait afficher votre résultat, créez les colonnes suivantes.

  • A: Une séquence de nombres commençant par 1 dans la ligne 2, cela limite le nombre total de lignes que vous pouvez obtenir (un peu comme une limite dans la suite)
  • B2: =match(A2, DataSheet!$E$2:$E$1048576, 0), il s’agit de la ligne des données correspondantes
  • C2: =iferror(index(DataSheet!A$2:A$1048576, $B2), ""), il s’agit des données réelles ou vide si aucune donnée n’existe

Copiez les formules dans B2 et C2 et copiez la colonne C vers D et E.

2
unique2

Si vous souhaitez exécuter SQL sur des données combinées provenant de plusieurs feuilles Excel ou de plusieurs fichiers Excel, vous pouvez utiliser le service cloud appelé Rockset . Rockset vous fournit une interface SQL pouvant combiner des données Excel, Pdf ou txt/xml/json/csv.

1
dhruba

Puis-je suggérer de donner QueryStorm a try - c'est un plugin pour Excel qui facilite l'utilisation de SQL dans Excel.

En outre, c'est freemium. Si vous ne vous souciez pas de l'auto-complétion, des erreurs d'erreur, etc., vous pouvez l'utiliser gratuitement. Il suffit de télécharger et d'installer, et vous avez un support SQL dans Excel.

Disclaimer: je suis l'auteur.

0
anakic