¿Cómo ejecutar una consulta SQL en una tabla de Excel?


Estoy tratando de crear una sub-tabla de otra tabla de todos los campos de apellido ordenados A-Z que tienen un campo de número de teléfono que no es null. Podría hacer esto bastante fácil con SQL, pero no tengo idea de cómo ejecutar una consulta SQL dentro de Excel. Estoy tentado a importar los datos en postgresql y simplemente consultarlos allí, pero eso parece un poco excesivo.

Para lo que estoy tratando de hacer, la consulta SQL SELECT lastname, firstname, phonenumber WHERE phonenumber IS NOT NULL ORDER BY lastname haría el truco. Parece demasiado simple para que sea algo que sobresalga no puedo hacerlo de forma nativa. ¿Cómo puedo ejecutar una consulta SQL como esta desde Excel?

Author: TylerH, 2013-09-14

11 answers

Hay muchas buenas maneras de hacer esto, que otros ya han sugerido. Siguiendo a lo largo de la "obtener datos de Excel a través de la pista SQL", aquí hay algunos punteros.

  1. Excel tiene el "Asistente de conexión de datos" que le permite importar o vincular desde otra fuente de datos o incluso dentro del mismo archivo de Excel.

  2. Como parte de Microsoft Office (y OS) son dos proveedores de interés: el viejo "Microsoft.Jet.OLEDB", y el último "Microsoft.AS.OLEDB". Buscar cuando se configura una conexión (por ejemplo, con el Asistente de conexión de datos).

  3. Una vez conectado a un libro de Excel, una hoja de trabajo o rango es el equivalente de una tabla o vista. El nombre de la tabla de una hoja de trabajo es el nombre de la hoja de trabajo con un signo de dólar ("$") adjunto y rodeado de corchetes ("[" y "]"); de un rango, es simplemente el nombre del rango. Para especificar un rango de celdas sin nombre como su recordsource, agregue la notación de fila/columna estándar de Excel a el nombre del final de la hoja entre corchetes.

  4. El SQL nativo será (más o menos) el SQL de Microsoft Access. (En el pasado, se llamaba JET SQL; sin embargo Access SQL ha evolucionado, y creo que JET es tecnología antigua en desuso.)

  5. Ejemplo, leyendo una hoja de trabajo: SELECCIONE * DE [Sheet1$]

  6. Ejemplo, leyendo un rango: SELECCIONE * DE myRange

  7. Ejemplo, leyendo un rango de celdas sin nombre: SELECCIONE * DESDE [Sheet1 A A1: B10]

  8. Hay muchos muchos muchos libros y sitios web disponibles para ayudarle a trabajar a través de los detalles.

= = = Notas adicionales = = =

De forma predeterminada, se asume que la primera fila de su fuente de datos de Excel contiene encabezados de columna que se pueden usar como nombres de campo. Si este no es el caso, debe desactivar esta configuración, o su primera fila de datos "desaparece" para ser utilizado como nombres de campo. Esto se hace agregando el ajuste HDR = opcional al Propiedades extendidas de la cadena de conexión. El valor predeterminado, que no es necesario especificar, es HDR=Yes. Si no tiene encabezados de columna, debe especificar HDR = No; el proveedor nombra sus campos F1, F2, etc.

Una advertencia sobre la especificación de hojas de trabajo: El proveedor asume que su tabla de datos comienza con la celda superior, izquierda y no en blanco en la hoja de trabajo especificada. En otras palabras, su tabla de datos puede comenzar en la fila 3, Columna C sin problema. Sin embargo, no se puede, por ejemplo, escriba un título de hoja de trabajo arriba y a la izquierda de los datos en la celda A1.

Una advertencia sobre la especificación de rangos: Cuando especifica una hoja de trabajo como su fuente de registros, el proveedor agrega nuevos registros debajo de los registros existentes en la hoja de trabajo según lo permita el espacio. Cuando se especifica un rango (con nombre o sin nombre), Jet también agrega nuevos registros debajo de los registros existentes en el rango según lo permita el espacio. Sin embargo, si solicita en el rango original, el conjunto de registros resultante no incluye el registros fuera del rango.

Tipos de datos (vale la pena intentarlo) para CREAR TABLA: Corto, Largo, Simple, Doble, Moneda, DateTime, Bit, Byte, GUID, BigBinary, LongBinary, VarBinary, LongText, VarChar, Decimal.

Conexión a Excel "old tech" (archivos con extensión xls): Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyFolder\MyWorkbook.xls;Extended Properties=Excel 8.0;. Utilice el tipo de base de datos de origen de Excel 5.0 para los libros de trabajo de Microsoft Excel 5.0 y 7.0 (95) y utilice el tipo de base de datos de origen de Excel 8.0 para Microsoft Excel 8.0 (97), 9.0 (2000) y 10.0 (2002) libro.

Conexión a" latest " Excel (archivos con la extensión de archivo xlsx): Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Excel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;"

Tratamiento de datos como texto: la configuración IMEX trata todos los datos como texto. Proveedor = Microsoft.AS.OLEDB.12.0; Data Source = Excel2007file.xlsx; Extended Properties = "Excel 12.0 Xml; HDR = YES; IMEX=1";

(Más detalles en http://www.connectionstrings.com/excel)

Más información en http://msdn.microsoft.com/en-US/library/ms141683(v=sql.90).aspx, y en http://support.microsoft.com/kb/316934

Conectarse a Excel a través de ADODB a través de VBA detallado en http://support.microsoft.com/kb/257819

Microsoft JET 4 detalles en http://support.microsoft.com/kb/275561

 43
Author: rskar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-24 14:48:05

Puede hacer esto de forma nativa de la siguiente manera:

  1. Seleccione la tabla y use Excel para ordenarla por Apellido
  2. Cree un criterio de filtro avanzado de 2 filas por 1 columna, por ejemplo E1 y E2, donde E1 está vacío y E2 contiene la fórmula =C6="" donde C6 es la primera celda de datos de la columna número de teléfono.
  3. Seleccione la tabla y use el filtro avanzado, copie a un rango, usando el rango de criterios en E1:E2 y especifique dónde desea copiar el salida a

Si quieres haga esto programáticamente Le sugiero que use el Grabador de macro para grabar los pasos anteriores y mirar el código.

 9
Author: Charles Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-02 17:52:26

Tl; dr; Excel hace todo esto de forma nativa-use filtros y o tablas

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

Puede abrir excel programáticamente a través de una conexión oledb y ejecutar SQL en las tablas dentro de la hoja de trabajo.

Pero puede hacer todo lo que está pidiendo hacer sin fórmulas solo filtros.

  1. haga clic en cualquier lugar dentro de la datos usted está mirando
  2. ir a datos en la barra de cinta
  3. seleccione "Filtro" está alrededor del medio y parece un embudo
    • tendrás flechas en el lado apretado de cada celda en la primera fila de tu mesa ahora
  4. haga clic en la flecha en el número de teléfono y deseleccione espacios en blanco (última opción)
  5. haga clic en la flecha en el apellido y seleccione a-z ordenando (opción superior)

Tener una obra alrededor.. algunas cosas a tener en cuenta:

  1. puede seleccionar las filas filtradas y empastarlas en otro lugar
  2. en la barra de estado de la izquierda verá cuántas filas cumplen con los criterios de filtrado del número total de filas. (por ejemplo, 308 de 313 registros encontrados)
  3. puede filtrar por color en excel 2010 en salas
  4. A veces creo columnas calculadas que dan estados o versiones limpias de datos que luego puede filtrar u ordenar por tesis también. (por ejemplo, como las fórmulas en las otras respuestas)

HÁGALO con filtros a menos que vaya a hacerlo mucho o desee automatizar la importación de datos en algún lugar o algo.. pero para completar:

Una opción de 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 lugar útil para comenzar es echar un vistazo al esquema, ya que puede haber más de lo que piensa:

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

Luego, cuando desee consultar una hoja:

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

NOTA-Usar tablas en excel!:

Excel tiene la funcionalidad "tablas" que hacen los datos se comportan más como una tabla.. esto le da algunos grandes beneficios, pero no va a dejar que usted haga todo tipo de consulta.

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

Para los datos tabulares en excel este es mi valor predeterminado.. lo primero que hago es hacer clic en los datos y luego seleccionar "formato como tabla" de la sección inicio en la cinta. esto le permite filtrar y ordenar por defecto y le permite acceder a la tabla y los campos por nombre (e. g. table [fieldname]) esto también permite funciones agregadas en columnas e. g. max y average

 6
Author: gordatron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-24 09:38:07

Usted puede usar SQL en Excel. Solo está bien escondido. Ver este tutorial:

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

 3
Author: Piotr Kołaczkowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-24 12:50:58

Si necesita hacer esto una vez, simplemente siga las descripciones de Charles, pero también es posible hacer esto con fórmulas de Excel y columnas auxiliares en caso de que desee hacer que el filtro sea dinámico.

Supongamos que sus datos están en la hoja de datos de la hoja y comienzan en la fila 2 de las siguientes columnas:

  • A: apellido
  • B: firstname
  • C: número de teléfono

Necesita dos columnas auxiliares en esta hoja.

  • D2: =if(A2 = "", 1, 0), esta es la columna de filtro, correspondiente a su condición where
  • E2: =if(D2 <> 1, "", sumifs(D$2:D$1048576, A$2:A$1048576, "<"&A2) + sumifs(D$2:D2, A$2:A2, A2)), esto corresponde al orden de

Copie estas fórmulas en lo que respecta a sus datos.

En la hoja que debe mostrar su resultado, cree las siguientes columnas.

  • A: Una secuencia de números que comienzan con 1 en la fila 2, esto limita el número total de filas que puede obtener (tipo como un límite en la secuela)
  • B2: =match(A2, DataSheet!$E$2:$E$1048576, 0), esta es la fila de los datos correspondientes
  • C2: =iferror(index(DataSheet!A$2:A$1048576, $B2), ""), este es el datos reales o vacíos si no existen datos

Copie las fórmulas en B2 y C2 y copie la columna C a D y E.

 2
Author: unique2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-21 18:38:56

Puede experimentar con el controlador de base de datos nativo para Excel en el idioma/plataforma de su elección. En Java world, puedes probar con http://code.google.com/p/sqlsheet / que proporciona un controlador JDBC para trabajar directamente con hojas de Excel. Del mismo modo, puede obtener controladores para la tecnología DB para otras plataformas.

Sin embargo, puedo garantizar que pronto se topará con una pared con el número de características que proporcionan estas bibliotecas de envoltura. Mejor manera será utilizar Apache HSSF / POI o nivel similar de biblioteca, pero necesitará más esfuerzo de codificación.

 0
Author: Akhilesh Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-14 05:16:34

Microsoft Access y LibreOffice Base pueden abrir una hoja de cálculo como fuente y ejecutar consultas sql en ella. Esa sería la forma más fácil de ejecutar todo tipo de consultas, y evitar el lío de ejecutar macros o escribir código.

Excel también tiene autofiltros y clasificación de datos que lograrán muchas consultas simples como su ejemplo. Si necesita ayuda con esas características, Google sería una mejor fuente de tutoriales que yo.

 0
Author: jbo5112,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-20 00:52:30

Puede que me esté malinterpretando, pero ¿no es esto exactamente lo que hace una tabla dinámica? ¿Tiene los datos en una tabla o simplemente en una lista filtrada? Si no es una tabla, hágala una (ctrl + l) si lo es, simplemente active cualquier celda de la tabla e inserte una tabla dinámica en otra hoja. Luego Agregue las columnas lastname, firstname, phonenumber a la sección rows. Luego Agregue el número de teléfono a la sección filtrar y filtre los valores nulos. Ahora ordenar como normal.

 0
Author: Holmes IV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-20 23:47:37

Le sugiero que eche un vistazo al motor de almacenamiento csv de MySQL que esencialmente le permite cargar cualquier archivo csv (fácilmente creado desde excel) en la base de datos, una vez que lo tenga, puede usar cualquier comando SQL que desee.

Vale la pena echarle un vistazo.

 0
Author: Juan Antonio Gomez Moriano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-24 01:44:06

Podría sugerirle que pruebe QueryStorm: es un complemento para Excel que hace que sea muy conveniente usar SQL en Excel.

También, es freemium. Si no le importa autocompletar, garabatos de error, etc., puede usarlo de forma gratuita. Simplemente descargue e instale, y tendrá soporte SQL en Excel.

Descargo de responsabilidad: Soy el autor.

 0
Author: anakic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-12 14:19:36

Si tiene GDAL/OGR compilado con la biblioteca against the Expat, puede usar el controlador XLSX para leer .xlsx, y ejecutar expresiones SQL desde un símbolo del sistema. Por ejemplo, desde un shell osgeo4w en el mismo directorio que la hoja de cálculo, utilice ogrinfo utilidad:

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

Ejecutará una consulta SQLite en sheet1, y generará el resultado de la consulta en una forma inusual:

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

O ejecute la misma consulta usando ogr2ogr para crear un archivo CSV simple:

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

Para hacer similar con mayor.archivos xls, necesitará el controlador XLS , construido contra la biblioteca FreeXL, que no es realmente común (por ejemplo, no desde OSGeo4W).

 -1
Author: Mike T,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-13 04:05:21