如何在Excel表上运行SQL查询?

问题描述 投票:66回答:12

我正在尝试从排序A-Z的所有姓氏字段的另一个表创建一个子表,其中电话号码字段不为空。我可以使用SQL轻松完成这项工作,但我不知道如何在Excel中运行SQL查询。我很想将数据导入postgresql并在那里查询,但这似乎有点过分。

对于我正在尝试做的事情,SQL查询SELECT lastname, firstname, phonenumber WHERE phonenumber IS NOT NULL ORDER BY lastname可以解决问题。它似乎太简单了,不能成为Excel本身无法做到的事情。如何在Excel中运行这样的SQL查询?

sql excel filtering
12个回答
58
投票

有很多很好的方法可以完成这项工作,其他人已经提出过。下面是“通过SQL轨道获取Excel数据”,这里有一些指示。

  1. Excel具有“数据连接向导”,允许您从其他数据源或甚至在同一Excel文件中导入或链接。
  2. 作为Microsoft Office(和OS)的一部分,有两个感兴趣的提供者:旧的“Microsoft.Jet.OLEDB”和最新的“Microsoft.ACE.OLEDB”。在设置连接时查找它们(例如使用数据连接向导)。
  3. 连接到Excel工作簿后,工作表或范围相当于表或视图。工作表的表名是附加了美元符号(“$”)的工作表的名称,并用方括号括起来(“[”和“]”);一个范围,它只是范围的名称。要指定未命名的单元格范围作为记录源,请将标准Excel行/列表示法附加到方括号中的工作表名称末尾。
  4. 本机SQL将(或多或少)是Microsoft Access的SQL。 (在过去,它被称为JET SQL;但是Access SQL已经发展,我相信JET已被弃用旧技术。)
  5. 例如,读取工作表:SELECT * FROM [Sheet1 $]
  6. 例如,读取范围:SELECT * FROM MyRange
  7. 例如,读取未命名的单元格范围:SELECT * FROM [Sheet1 $ A1:B10]
  8. 有许多书籍和网站可以帮助您完成细节。

===附加说明===

默认情况下,假定Excel数据源的第一行包含可用作字段名称的列标题。如果不是这种情况,则必须关闭此设置,否则第一行数据将“消失”以用作字段名称。这是通过将可选的HDR =设置添加到连接字符串的扩展属性来完成的。默认值(不需要指定)是HDR = Yes。如果您没有列标题,则需要指定HDR =否;提供者为您的字段F1,F2等命名。

有关指定工作表的注意事项:提供程序假定您的数据表以指定工作表上最上面,最左侧的非空单元格开头。换句话说,您的数据表可以从第3行C列开始,没有问题。但是,例如,您不能在单元格A1中的数据的上方和左侧键入worksheeet标题。

关于指定范围的注意事项:当您将工作表指定为记录源时,提供程序会在空间允许的情况下在工作表中的现有记录下添加新记录。指定范围(命名或未命名)时,Jet还会在空间允许的范围内在现有记录下添加新记录。但是,如果您在原始范围上重新查询,则生成的记录集不包括该范围之外的新添加的记录。

CREATE TABLE的数据类型(值得尝试):短,长,单,双,货币,日期时间,位,字节,GUID,BigBinary,LongBinary,VarBinary,LongText,VarChar,Decimal。

连接到“旧技术”Excel(带有xls扩展名的文件):Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyFolder\MyWorkbook.xls;Extended Properties=Excel 8.0;。使用Microsoft Excel 5.0和7.0(95)工作簿的Excel 5.0源数据库类型,并使用Microsoft Excel 8.0(97),9.0(2000)和10.0(2002)工作簿的Excel 8.0源数据库类型。

连接到“最新”Excel(具有xlsx文件扩展名的文件):Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Excel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;"

将数据作为文本处理:IMEX设置将所有数据视为文本。 Provider = Microsoft.ACE.OLEDB.12.0; Data Source = Excel2007file.xlsx; Extended Properties =“Excel 12.0 Xml; HDR = YES; IMEX = 1”;

(更多细节在http://www.connectionstrings.com/excel

有关http://msdn.microsoft.com/en-US/library/ms141683(v=sql.90).aspxhttp://support.microsoft.com/kb/316934的更多信息

通过ADODB通过Vazxswpoi详细介绍的VBA连接到Excel

有关http://support.microsoft.com/kb/257819的Microsoft JET 4详细信息


-1
投票

我建议你看一下MySQL QueryStorm,它本质上允许你将任何csv文件(很容易从excel创建)加载到数据库中,一旦你有了,你可以使用你想要的任何SQL命令。

值得一看。


-1
投票

如果您使用针对Expat库编译的http://code.google.com/p/sqlsheet/,则可以使用csv storage engine读取.xlsx文件,并从命令提示符运行SQL表达式。例如,从与电子表格相同的目录中的GDAL/OGR shell,使用XLSX driver实用程序:

osgeo4w

将在ogrinfo上运行ogrinfo -dialect sqlite -sql "SELECT name, count(*) FROM sheet1 GROUP BY name" Book1.xlsx 查询,并以不寻常的形式输出查询结果:

SQLite

或者使用sheet1运行相同的查询来制作一个简单的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 ... 文件:

ogr2ogr

要与较旧的.xls文件类似,您需要针对FreeXL库构建的CSV,这并不常见(例如,不是来自OSGeo4w)。


8
投票

您可以如下原生:

  1. 选择表并使用Excel在姓氏上对其进行排序
  2. 创建一个2行乘1列高级过滤条件,例如在E1和E2中,其中E1为空,E2包含公式http://support.microsoft.com/kb/275561,其中C6是电话号码列的第一个数据单元。
  3. 选择表并使用高级过滤器,使用E1:E2中的条件范围复制到范围,并指定要将输出复制到的位置

如果您想以编程方式执行此操作,我建议您使用宏记录器记录上述步骤并查看代码。


5
投票

TL;博士; Excel完成所有这些 - 使用=C6=""和/或filters

(Qazxswpoi)

您可以通过oledb连接以编程方式打开Excel,并在工作表中的表上执行SQL。

但你可以做任何你要做的事情,没有公式只是过滤器。

  1. 单击您正在查看的数据中的任何位置
  2. 转到功能区栏上的数据
  3. 选择“过滤”它的中间,看起来像一个漏斗 你现在在桌子的第一行的每个单元格的紧手侧都有箭头
  4. 单击电话号码上的箭头并取消选择空格(最后一个选项)
  5. 单击姓氏上的箭头并选择a-z排序(顶部选项)

玩一玩......有些事要注意:

  1. 您可以选择已过滤的行并将其粘贴到其他位置
  2. 在左侧的状态栏中,您将看到有多少行符合总行数中的筛选条件。 (例如,找到313条记录中的308条)
  3. 你可以在病房的excel 2010中按颜色过滤
  4. 有时我创建计算列,提供状态或清理版本的数据,然后您可以过滤或排序。 (例如像其他答案中的公式一样)

使用过滤器,除非你要做很多事情,或者你想在某处或某些地方自动导入数据......但为了完整性:

一个c#选项:

tables

一个方便的起点是看一下架构,因为可能会有比你想象的更多:

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

然后当你想查询工作表时:

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

注 - 在Excel中使用表格!:

Excel具有“表格”功能,使数据的行为更像一个表格...这给你带来了很多好处,但不会让你做任何类型的查询。

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

对于excel中的表格数据,这是我的默认值。我要做的第一件事是点击数据,然后从功能区的主页部分选择“格式为表格”。这为您提供了过滤和默认排序,并允许您按名称访问表和字段(例如table [fieldname]),这也允许列上的聚合函数,例如最高和平均


4
投票

您可以在Excel中使用SQL。它只是隐藏得很好。看本教程:

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


2
投票

如果您只需按照Charles的描述执行此操作,但也可以使用Excel公式和帮助列进行此操作,以防您想要使过滤器动态化。

让我们假设您的数据在工作表DataSheet上,并从以下列的第2行开始:

  • A:姓氏
  • B:名字
  • C:电话号码

此工作表上需要两个辅助列。

就数据而言,复制这些公式。

在应显示结果的工作表上,创建以下列。

  • 答:第2行中以1开头的数字序列,这限制了您可以获得的总行数(类似于续集中的限制)
  • B2:=if(A2 = "", 1, 0),这是相应数据的行
  • C2:=if(D2 <> 1, "", sumifs(D$2:D$1048576, A$2:A$1048576, "<"&A2) + sumifs(D$2:D2, A$2:A2, A2)),这是实际数据,如果没有数据则为空

复制B2和C2中的公式,并将C列复制粘贴到D和E.


2
投票

我可能会建议尝试使用=match(A2, DataSheet!$E$2:$E$1048576, 0) - 它是Excel的插件,这使得在Excel中使用SQL非常方便。

此外,它是免费增值。如果你不关心自动完成,错误波浪等,你可以免费使用它。只需下载并安装,您就可以在Excel中获得SQL支持。

免责声明:我是作者。


-1
投票

您可以在您选择的语言/平台中试用Excel的本机DB驱动程序。在Java世界中,您可以尝试使用=iferror(index(DataSheet!A$2:A$1048576, $B2), ""),它提供了一个JDBC驱动程序,可以直接使用Excel工作表。同样,您可以为其他平台获取数据库技术的驱动程序。

但是,我可以保证您很快就会遇到这些包装器库提供的​​功能数量。更好的方法是使用Apache HSSF / POI或类似级别的库,但需要更多编码工作。


-1
投票

Microsoft Access和LibreOffice Base可以打开电子表格作为源并在其上运行SQL查询。这将是运行各种查询的最简单方法,并避免运行宏或编写代码。

Excel还具有自动过滤器和数据排序功能,可以完成许多简单查询,例如您的示例。如果您需要有关这些功能的帮助,Google可能是比我更好的教程来源。


-1
投票

我可能误解了我,但这不正是数据透视表的作用吗?您是拥有表格中的数据还是只有过滤后的列表?如果它不是一个表(ctrl + l),那么只需激活表中的任何单元格并在另一个工作表上插入一个数据透视表。然后将列lastname,firstname,phonenumber添加到rows部分。然后将电话号码添加到过滤器部分并过滤掉空值。现在排序正常。

© www.soinside.com 2019 - 2024. All rights reserved.