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

82

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

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

Vap0r
fuente
¿Quiere hacer esto en SQL mismo o desde dentro de una aplicación?
John Bingham
2
He investigado esto a fondo y he escrito los resultados en exceldevelopmentplatform.blogspot.com/2018/10/…
S Meaden

Respuestas:

70

Hay muchas formas excelentes de hacer esto, que otros ya han sugerido. Siguiendo con "obtener datos de Excel a través de la pista SQL", aquí hay algunos consejos.

  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 los sistemas operativos) hay dos proveedores de interés: el antiguo "Microsoft.Jet.OLEDB" y el último "Microsoft.ACE.OLEDB". Búsquelos al configurar una conexión (como con el Asistente de conexión de datos).

  3. Una vez conectado a un libro de Excel, una hoja de trabajo o un rango es el equivalente a 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 entre corchetes ("[" y "]"); de un rango, es simplemente el nombre del rango. Para especificar un rango de celdas sin nombre como fuente de registro, agregue la notación estándar de filas / columnas de Excel al final del nombre 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 una tecnología antigua en desuso).

  5. Ejemplo, leyendo una hoja de trabajo: SELECT * FROM [Sheet1$]

  6. Ejemplo, leyendo un rango: SELECT * FROM MyRange

  7. Ejemplo, leyendo un rango de celdas sin nombre: SELECT * FROM [Sheet1$A1:B10]

  8. Hay muchos libros y sitios web disponibles para ayudarlo a trabajar con 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 "desaparecerá" para usarse como nombres de campo. Esto se hace agregando el opcional HDR= settinga las Propiedades extendidas de la cadena de conexión. El valor predeterminado, que no necesita especificarse, es HDR=Yes. Si no tiene encabezados de columna, debe especificar HDR=No; el proveedor nombra sus campos F1, F2, etc.

Advertencia sobre la especificación de hojas de trabajo: el proveedor asume que su tabla de datos comienza con la celda superior, más a la izquierda y que no está en blanco en la hoja de trabajo especificada. En otras palabras, su tabla de datos puede comenzar en la Fila 3, Columna C sin ningún problema. Sin embargo, no puede, por ejemplo, escribir el título de una 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 especifica un rango (con 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 vuelve a consultar el rango original, el conjunto de registros resultante no incluye los registros recién agregados fuera del rango.

Los tipos de datos (vale la pena probar) para C REATE TABLE: Short, Long, Single, Double, Currency, DateTime, Bit, Byte, GUID, BigBinary, LongBinary, VarBinary, LongText, VarChar, Decimal.

Conexión a la "vieja" tecnología de Excel (archivos con la 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 los libros de trabajo de Microsoft Excel 8.0 (97), 9.0 (2000) y 10.0 (2002).

Conexión al "último" 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;"

Tratar los datos como texto: la configuración IMEX trata todos los datos como texto. Provider=Microsoft.ACE.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

Conexión a Excel a través de ADODB a través de VBA detallada en http://support.microsoft.com/kb/257819

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

rskar
fuente
4
La conexión de datos requiere un nombre de archivo, que es un obstáculo cuando la tarea es consultar el archivo actual. Además, una consulta no se puede usar de la misma manera que una fórmula, solo se puede usar una consulta fija para completar un rango; y no se actualiza automáticamente. Por lo tanto, es inutilizable consultar el archivo actual y no se puede usar como reemplazo directo de fórmulas.
ivan_pozdeev
2
@ivan_pozdeev Acabo de confirmarme mediante Excel 2010 que se puede consultar el archivo actual; No sé si las ediciones posteriores de Excel / Office hacen que esto ya no sea posible. Estoy de acuerdo en que crear tablas autorreferenciales a través del Asistente de conexión de datos es complicado, en gran parte porque la conexión se realiza utilizando la ruta completa al libro de trabajo, por lo que cambiar el nombre / copiar / mover el libro de trabajo lo rompería o confundiría los resultados. Sin embargo, para los libros de trabajo donde el uso de VBA no es un problema, las consultas autorreferenciales son muy manejables.
rskar
@ivan_pozdeev También estaría de acuerdo en que Excel no está optimizado para actualizar automáticamente las tablas autorreferenciales; la presunción son siempre datos de fuentes externas. Las actualizaciones automáticas son posibles a través de la pestaña Uso de Propiedades de conexión (como en la recarga después de tantos minutos), y con VBA uno podría aprovechar los eventos de recálculo. Aún así, no creo que haya sobrevendido esto como un reemplazo directo de las fórmulas.
rskar
2
"Hay muchas formas excelentes de hacer esto", si eso no pasa por alto los principales defectos que todas estas formas "finas" tienen para el caso de uso solicitado (que es lo que impide su uso generalizado), no sé cuál es.
ivan_pozdeev
8

tl; dr; Excel hace todo esto de forma nativa: use filtros o tablas

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

Puede abrir Excel mediante programación 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 los datos que está mirando
  2. ir a datos en la barra de cinta
  3. seleccione "Filtro", se trata de la mitad y parece un embudo
    • ahora tendrá flechas en el lado apretado de cada celda en la primera fila de su tabla
  4. haga clic en la flecha del número de teléfono y anule la selección de los espacios en blanco (última opción)
  5. haga clic en la flecha sobre el apellido y seleccione orden az (opción superior)

jugar ... algunas cosas a tener en cuenta:

  1. puede seleccionar las filas filtradas y pegarlas en otro lugar
  2. en la barra de estado de la izquierda, verá cuántas filas cumplen 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)

HAZLO con filtros a menos que lo vayas a hacer mucho o quieras 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 cree:

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 - ¡Utilice tablas en Excel !:

Excel tiene una funcionalidad de "tablas" que hace que los datos se comporten más como una tabla ... esto le brinda grandes beneficios pero no le permitirá hacer todo tipo de consultas.

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

Para datos tabulares en Excel, este es mi valor predeterminado. Lo primero que hago es hacer clic en los datos y luego seleccionar "formatear como tabla" en la sección de inicio de la cinta. esto le brinda filtrado y clasificación por defecto y le permite acceder a la tabla y los campos por nombre (por ejemplo, tabla [nombre de campo]) esto también permite funciones agregadas en columnas, por ejemplo, máximo y promedio


fuente
si desea reducir las columnas, personalmente copiaría las filas filtradas en una nueva hoja y eliminaría las columnas que no necesitaba. Podrías esconderlos, pero rara vez vale la pena.
1
using System.Data.OleDb; using System.Data;
1
Filtro todos los días y c # para acceder a las hojas de cálculo algunas veces a la semana. cuando se usa c #, tiende a ser importar los datos a una base de datos para jugar realmente con ellos ... para consultar sus filtros o sql una vez que los datos están en el servidor sql, no vale la pena hacerlo en el nivel intermedio de SQL para sobresalir.
7

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, digamos en 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 del 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 la salida

Si desea hacer esto mediante programación, le sugiero que use la Grabadora de macros para grabar los pasos anteriores y mirar el código.

Charles Williams
fuente
8
Pregunta especifica SQL.
S Meaden
4

Usted puede utilizar SQL en Excel. Solo está bien escondido. Vea este tutorial:

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

Piotr Kołaczkowski
fuente
2
Parece que está usando SQL para seleccionar datos para importarlos a Excel, sin embargo, ¿no ejecutar consultas en la hoja de cálculo actual?
Rup
Solo necesita crear un nombre para cada tabla en Excel (en el administrador de nombres) o simplemente seleccionar la tabla y escribir el nombre en el cuadro donde se muestra la dirección de la celda. Luego, puede usarlo para consultar la hoja de trabajo. En la consulta, tiene la dirección completa de la hoja, por lo que en caso de que mueva la hoja de cálculo a otra parte de su disco, la consulta no funcionará
Petrik
3

¿Podría sugerirle que pruebe QueryStorm ? Es un complemento para Excel que hace que sea muy conveniente usar SQL en Excel.

Además, es freemium. Si no le importa el autocompletado, los 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.

anakic
fuente
1
Desafortunadamente, aunque es una gran herramienta, ahora parece ser solo de pago, excepto por una prueba de 30 días.
Marc
2

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

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

  • A: apellido
  • B: nombre
  • 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 por

Copie estas fórmulas hasta donde lleguen sus datos.

En la hoja que debería mostrar su resultado, cree las siguientes columnas.

  • R: Una secuencia de números que comienza con 1 en la fila 2, esto limita el número total de filas que puede obtener (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), "")estos son los datos reales o están vacíos si no existen datos

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

único2
fuente
-1

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

Sin embargo, puedo garantizar que pronto chocará contra la pared con la cantidad de características que brindan estas bibliotecas contenedoras. La mejor manera será usar Apache HSSF / POI o un nivel similar de biblioteca, pero necesitará más esfuerzo de codificación.

Akhilesh Singh
fuente
-1

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, conviértala en una (ctrl + l) si lo es, entonces simplemente active cualquier celda de la tabla e inserte una tabla dinámica en otra hoja. Luego agregue las columnas apellido, nombre, número de teléfono a la sección de filas. Luego, agregue el número de teléfono a la sección de filtro y filtre los valores nulos. Ahora ordena como de costumbre.

Holmes IV
fuente
-1

Le sugiero que eche un vistazo al motor de almacenamiento csv de MySQL que esencialmente le permite cargar cualquier archivo csv (creado fácilmente 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.

Juan Antonio Gómez Moriano
fuente
-1

Si tiene GDAL / OGR compilado con la biblioteca Expat, puede usar el controlador XLSX para leer archivos .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, use la utilidad ogrinfo :

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

ejecutará una consulta SQLite y generará el sheet1resultado 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 hacer 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 algo similar con archivos .xls más antiguos, necesitaría el controlador XLS , construido contra la biblioteca FreeXL, que no es realmente común (por ejemplo, no de OSGeo4w).

Mike T
fuente
-2

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 desorden de ejecutar macros o escribir código.

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

jbo5112
fuente