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

时间:2013-09-14 05:08:46

标签: sql excel filtering

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

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

13 个答案:

答案 0 :(得分:54)

有很多很好的方法可以完成这项工作,其他人已经提出过这样的建议。继“通过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. 有许多书籍和网站可以帮助您完成细节。

  9. ===进一步说明===

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

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

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

    CREATE TABLE的数据类型(值得一试):Short,Long,Single,Double,Currency,DateTime,Bit,Byte,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通过http://support.microsoft.com/kb/257819

    详细说明的VBA连接到Excel

    {J} 4详细信息http://support.microsoft.com/kb/275561

答案 1 :(得分:8)

您可以按照以下原则进行本地操作:

  1. 选择表并使用Excel对姓氏进行排序
  2. 创建一个2行1列高级过滤条件,比如说 E1和E2,其中E1为空,E2包含公式=C6="" 其中C6是电话号码栏的第一个数据单元。
  3. 选择表并使用高级过滤器,复制到范围,使用 E1:E2中的条件范围,并指定要复制的位置 输出到
  4. 如果您想以编程方式执行此操作,我建议您使用宏记录器记录上述步骤并查看代码。

答案 2 :(得分:5)

<强> TL;博士; Excel本机完成所有这些操作 - 使用filters和/ tables

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

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

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

  1. 点击您正在查看的数据中的任意位置
  2. 转到功能区栏上的数据
  3. 选择“过滤”关于中间,看起来像一个漏斗
    • 现在你桌子的第一行中每个单元格的右侧都有箭头
  4. 点击电话号码上的箭头,取消选择空白(最后一个选项)
  5. 点击姓氏上的箭头,选择a-z订购(顶部选项)
  6. 玩游戏......有些事情需要注意:

    1. 您可以选择已过滤的行并将其粘贴到其他地方
    2. 在左侧的状态栏中,您将看到有多少行符合总行数中的过滤条件。 (例如找到313条记录中的308条)
    3. 您可以在病房中的excel 2010中按颜色进行过滤
    4. 有时我会创建计算列,这些列可以提供状态或已清理的数据版本,然后您可以对这些数据进行过滤或排序。 (例如,像其他答案中的公式)
    5. 使用过滤器,除非你要做很多事情,或者你想在某处或某些地方自动导入数据......但为了完整性:

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

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

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

      然后当您要查询工作表时:

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

      注意 - 在Excel中使用表格!:

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

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

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:2)

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

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

  • A:姓氏
  • B:名字
  • C:phonenumber

此表上需要两个辅助列。

  • D2:=if(A2 = "", 1, 0),这是过滤列,对应于您的where条件
  • E2:=if(D2 <> 1, "", sumifs(D$2:D$1048576, A$2:A$1048576, "<"&A2) + sumifs(D$2:D2, A$2:A2, A2)),这对应于
  • 的顺序

根据您的数据复制这些公式。

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

  • A:第2行中以1开头的数字序列,这限制了您可以获得的总行数(类似于续集中的限制)
  • B2:=match(A2, DataSheet!$E$2:$E$1048576, 0),这是相应数据的行
  • C2:=iferror(index(DataSheet!A$2:A$1048576, $B2), ""),这是实际数据,如果没有数据,则为空

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

答案 5 :(得分:2)

我可能会建议尝试QueryStorm - 它是Excel的一个插件,这使得在Excel中使用SQL非常方便。

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

免责声明:我是作者。

答案 6 :(得分:0)

如果要对来自多个Excel工作表或来自多个Excel文件的合并数据运行SQL,则可以使用名为Rockset的云服务。 Rockset为您提供了一个SQL界面,该界面可以合并来自Excel,PDF或txt / xml / json / csv的数据。

答案 7 :(得分:0)

我找到了一个很好的示例,您可以在其中像对待表一样对待工作表。 enter image description here

video link

答案 8 :(得分:-1)

您可以在您选择的语言/平台中试用Excel的本机数据库驱动程序。在Java世界中,您可以尝试使用http://code.google.com/p/sqlsheet/,它提供了一个JDBC驱动程序,可以直接使用Excel工作表。同样,您可以为其他平台获取数据库技术的驱动程序。

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

答案 9 :(得分:-1)

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

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

答案 10 :(得分:-1)

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

答案 11 :(得分:-1)

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

值得一看。

答案 12 :(得分:-1)

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

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

将在sheet1上运行SQLite查询,并以不寻常的形式输出查询结果:

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运行相同的查询来制作简单的CSV文件:

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

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