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?
Respuestas:
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.
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.
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).
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.
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).
Ejemplo, leyendo una hoja de trabajo:
SELECT * FROM [Sheet1$]
Ejemplo, leyendo un rango:
SELECT * FROM MyRange
Ejemplo, leyendo un rango de celdas sin nombre:
SELECT * FROM [Sheet1$A1:B10]
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= setting
a las Propiedades extendidas de la cadena de conexión. El valor predeterminado, que no necesita especificarse, esHDR=Yes
. Si no tiene encabezados de columna, debe especificarHDR=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
fuente
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.
jugar ... algunas cosas a tener en cuenta:
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 #:
un lugar útil para comenzar es echar un vistazo al esquema, ya que puede haber más de lo que cree:
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
using System.Data.OleDb;
using System.Data;
Puede hacer esto de forma nativa de la siguiente manera:
=C6=""
donde C6 es la primera celda de datos de la columna del número de teléfono.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.
fuente
Usted puede utilizar SQL en Excel. Solo está bien escondido. Vea este tutorial:
http://smallbusiness.chron.com/use-sql-statements-ms-excel-41193.html
fuente
¿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.
fuente
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:
Necesita dos columnas auxiliares en esta hoja.
=if(A2 = "", 1, 0)
esta es la columna de filtro, correspondiente a su condición where=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 porCopie estas fórmulas hasta donde lleguen sus datos.
En la hoja que debería mostrar su resultado, cree las siguientes columnas.
=match(A2, DataSheet!$E$2:$E$1048576, 0)
esta es la fila de los datos correspondientes=iferror(index(DataSheet!A$2:A$1048576, $B2), "")
estos son los datos reales o están vacíos si no existen datosCopie las fórmulas en B2 y C2 y copie la columna C a D y E.
fuente
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.
fuente
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.
fuente
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.
fuente
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
sheet1
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 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).
fuente
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.
fuente