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 null. Je pourrais le faire assez facilement avec SQL, mais je n'ai aucune idée de 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 D'excellent ne peut pas faire nativement. Comment puis-je exécuter une requête SQL comme celle-ci à partir D'Excel?

57
demandé sur TylerH 2013-09-14 09:08:46

11 réponses

Il y a beaucoup de bonnes façons d'y parvenir, ce que d'autres ont déjà suggéré. En suivant le "get Excel data via SQL track", voici quelques pointeurs.

  1. Excel a le "Assistant de connexion de données" qui vous permet d'importer ou de lier à partir d'une autre source de données ou même dans le même fichier Excel.

  2. Dans le cadre de Microsoft Office (et OS) sont deux fournisseurs d'intérêt: L'ancien "Microsoft.Jet.OLEDB", et le dernier "Microsoft.ACE.OLEDB". Recherchez lors de la configuration d'une connexion (par exemple avec L'Assistant de connexion de données).

  3. Une Fois connecté à un classeur Excel, une feuille de calcul ou plage est l'équivalent d'une table ou d'une vue. Le nom de la table d'une feuille de calcul est le nom de la feuille de calcul avec un signe dollar ( " $ " ) ajouté et entouré de crochets ("["et"]"); d'une plage, c'est simplement le nom de la plage. Pour spécifier une plage de cellules sans nom en tant que source d'enregistrement, ajoutez une notation de ligne/colonne Excel standard à la fin du nom de la feuille entre crochets.

  4. Le SQL natif sera (plus ou moins) le SQL de Microsoft Access. (Dans le passé, il s'appelait JET SQL; cependant Access SQL a évolué, et je crois que JET est une vieille technologie obsolète.)

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

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

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

  8. Il y a beaucoup beaucoup de nombreux livres et sites Web disponibles pour vous aider à travailler à travers les détails.

=== Plus de notes ===

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 qui peuvent ê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" à être utilisés comme noms de domaine. Ceci est fait en ajoutant le paramètre HDR= optionnel au 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êtes de colonne, vous devez spécifier HDR = No; le fournisseur nomme vos champs F1, F2, etc.

Une mise en garde concernant la spécification de feuilles de calcul: le fournisseur suppose que votre table de données commence par la cellule la plus haute, la plus Gauche et non vide de la feuille de calcul spécifiée. En d'autres termes, votre tableau de données peut commencer à la Ligne 3, Colonne C sans problème. Cependant, vous ne pouvez pas, par exemple, tapez un titre de feuille de calcul au-dessus et à gauche des données dans la cellule A1.

Une mise en garde concernant la spécification de plages: lorsque vous spécifiez une feuille de calcul en tant que source d'enregistrement, le fournisseur ajoute de nouveaux enregistrements sous les enregistrements existants dans la feuille de calcul lorsque 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 lorsque l'espace le permet. Toutefois, si vous effectuez une requête sur la plage d'origine, le jeu d'enregistrements résultant n'inclut pas la nouvelle les enregistrements en dehors de la plage.

Types de données (à essayer) pour CREATE TABLE: Short, Long, Single, Double, Currency, DateTime, Bit, Byte, GUID, BigBinary, LongBinary, VarBinary, LongText, VarChar, Decimal.

Connecter à la "vieille technologie" 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) et utilisez le type de base de données source Excel 8.0 Pour Microsoft Excel 8.0 (97), 9.0 (2000) et 10.0 (2002) classeur.

Connexion à "plus tard" 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 à http://www.connectionstrings.com/excel)

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

Connexion à Excel via ADODB via VBA détaillée à http://support.microsoft.com/kb/257819

Microsoft JET 4 détails à http://support.microsoft.com/kb/275561

43
répondu rskar 2013-09-24 14:48:05

Vous pouvez le faire nativement comme suit:

  1. Sélectionnez la table et utilisez Excel pour la Trier sur le nom de famille
  2. créez un critère de filtre avancé de 2 lignes par 1 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 des numéros de téléphone.
  3. Sélectionnez la table et utilisez le filtre avancé, copiez dans une plage, en utilisant la plage de critères dans E1: E2 et spécifiez où vous voulez copier le sortie à

Si vous voulez pour ce faire, je vous suggère d'utiliser l'enregistreur de Macro pour enregistrer les étapes ci-dessus et regarder le code.

9
répondu Charles Williams 2014-04-02 17:52:26

Tl;dr; Excel tout cela en natif utiliser filtres et ou tables

(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 de faire sans formules juste des filtres.

  1. cliquez n'importe où dans le données vous regardez
  2. accédez à des données sur la barre de ruban
  3. sélectionnez "Filtre" sur le moyen et ressemble à un entonnoir
    • vous aurez des flèches sur le côté serré de chaque cellule dans la première rangée de votre table maintenant
  4. cliquez sur la flèche du 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 sélectionnez un-z commande (option)

Avoir une pièce de théâtre autour.. quelques choses à noter:

  1. vous pouvez sélectionner les lignes filtrées et les coller ailleurs
  2. dans la barre d'état sur la gauche, vous verrez combien de lignes vous rencontrer critères de filtre sur le nombre total de lignes. (par exemple 308 des 313 enregistrements trouvés)
  3. , vous pouvez filtrer par couleur dans excel 2010 sur les paroisses
  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 par thèses aussi. (par exemple, comme les formules dans les autres réponses)

Faites-le avec des filtres sauf si vous allez le faire beaucoup ou si vous voulez automatiser l'importation de données quelque part ou quelque chose.. mais pour être complet:

Une option 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();

Un endroit pratique pour commencer est de jeter un oeil au schéma car il peut 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());
    }
}

Ensuite, lorsque vous voulez interroger une feuille:

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

Remarque - Utilisez des tableaux dans excel!:

Excel a des fonctionnalités "tables" qui font les données se comportent plus 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 valeur par défaut.. la première chose que je fais est de cliquer dans les données, puis sélectionnez "format en tant que table" 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 les champs par nom (par exemple table [fieldname]) cela permet également d'agréger des fonctions sur des colonnes, par exemple max et average

6
répondu gordatron 2013-09-24 09:38:07

Vous Pouvez utiliser SQL dans Excel. Il est seulement bien caché. Voir ce tutoriel:

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

3
répondu Piotr Kołaczkowski 2013-09-24 12:50:58

Si vous devez le faire une fois, suivez simplement les descriptions de Charles, mais il est également possible de le faire avec des formules Excel et des colonnes d'aide au cas où vous souhaiteriez rendre le filtre dynamique.

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

  • A: lastname
  • B: prénom
  • C: Numéro de téléphone

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

  • D2: =if(A2 = "", 1, 0), c'est 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)), ceci correspond à l'ordre de

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

Sur la feuille qui doit 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), c'est la ligne de données correspondante
  • C2: =iferror(index(DataSheet!A$2:A$1048576, $B2), ""), c'est le données réelles ou vides si aucune donnée n'existe

Copiez les formules dans B2 et C2 et copiez-passé la colonne C à D et E.

2
répondu unique2 2013-09-21 18:38:56

Vous pouvez expérimenter avec le pilote DB natif pour Excel dans la langue / plate-forme de votre choix. Dans Java world, vous pouvez essayer avec http://code.google.com/p/sqlsheet / {[2] } qui fournit un pilote JDBC pour travailler directement avec des feuilles Excel. De même, vous pouvez obtenir des pilotes pour la technologie DB pour d'autres plates-formes.

Cependant, je peux garantir que vous allez bientôt frapper un mur avec le nombre de fonctionnalités que ces bibliothèques wrapper fournissent. Une meilleure façon sera D'utiliser Apache HSSF / POI ou niveau de bibliothèque similaire, mais il faudra plus d'effort de codage.

0
répondu Akhilesh Singh 2013-09-14 05:16:34

Microsoft Access et LibreOffice Base peuvent ouvrir une feuille de calcul en tant que source et exécuter des requêtes sql dessus. Ce serait le moyen le plus facile pour exécuter toutes sortes de requêtes, et d'éviter le gâchis de l'exécution de macros ou de l'écriture de code.

Excel a également des filtres automatiques et le tri des données qui accompliront beaucoup de requêtes simples comme votre exemple. Si vous avez besoin d'aide avec ces fonctionnalités, Google serait une meilleure source pour les tutoriels que moi.

0
répondu jbo5112 2013-09-20 00:52:30

Je pourrais me méprendre, mais n'est-ce pas exactement ce que fait un tableau croisé dynamique? Avez-vous les données dans une table ou juste une liste filtrée? Si ce n'est pas une table, faites-en une (ctrl+l) si c'est le cas, activez simplement n'importe quelle cellule du tableau et insérez un tableau croisé dynamique sur une autre feuille. Ajoutez ensuite les colonnes lastname, firstname, phonenumber à la section rows. Ensuite, ajoutez le numéro de téléphone à la section de filtre et filtrez les valeurs null. Maintenant Trier comme d'habitude.

0
répondu Holmes IV 2013-09-20 23:47:37

Je vous suggère de jeter un oeil au moteur de stockage MySQL csv qui vous permet essentiellement de charger n'importe quel fichier csv (facilement créé à partir d'excel) dans la base de données, une fois que vous avez cela, vous pouvez utiliser n'importe quelle commande SQL que vous voulez.

Ça vaut le coup d'y jeter un oeil.

0
répondu Juan Antonio Gomez Moriano 2013-09-24 01:44:06

Pourrais - je suggérer de donner QueryStorm un essai-c'est un plugin pour Excel qui le rend très pratique à utiliser SQL dans Excel.

Aussi, c'est freemium. Si vous ne vous souciez pas de la saisie semi-automatique, des erreurs, etc., vous pouvez l'utiliser gratuitement. Il suffit de télécharger et d'installer, et vous avez le support SQL dans Excel.

Avertissement: je suis l'auteur.

0
répondu anakic 2017-12-12 14:19:36

Si vous avez GDAL / OGR compilé avec la bibliothèque contre L'Expat, vous pouvez utiliser le pilote XLSX pour lire .fichiers xlsx, et exécuter des expressions SQL à partir d'une invite de commande. Par exemple, à partir d'un shell osgeo4w dans le même répertoire que la feuille de calcul, utilisez ogrinfo utilitaire:

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

Exécutera une requête SQLite sur sheet1, et affichera le résultat de la requête sous une forme inhabituelle:

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
...

Ou exécutez la même requête en utilisant ogr2ogr pour faire un simple CSV fichier:

$ 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
...

Faire de même avec les anciens .fichiers xls, vous auriez besoin du pilote XLS , construit sur la bibliothèque FreeXL, ce qui n'est pas vraiment commun (par exemple pas de OSGeo4w).

-1
répondu Mike T 2016-10-13 04:05:21