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

Vap*_*p0r 70 sql excel filtering

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

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

rsk*_*kar 59

有很多很好的方法可以完成这项工作,其他人已经提出过.下面是"通过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 extention) 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).aspx,并访问http://support.microsoft.com/kb/316934

通过ADBAB通过VBA连接到Excel,详情请访问http://support.microsoft.com/kb/257819

有关Microsoft JET 4的详细信息,请访问http://support.microsoft.com/kb/275561

  • 数据连接需要一个文件名,当任务要查询当前文件时,该文件名是一个显示停止符。而且,查询不能像公式一样使用,只能使用固定查询来填充范围;并且不会自动更新。**因此,无法查询当前文件,也无法用作公式的直接替代方式。** (3认同)
  • @ivan_pozdeev我刚刚使用Excel 2010确认可以查询当前文件。我不知道更高版本的Excel / Office是否使这不再可能。我同意通过数据连接向导创建自引用表很麻烦-很大程度上是因为使用工作簿的完整路径建立了连接,因此重命名/复制/移动工作簿会导致破坏它或使结果混乱。但是,对于使用VBA不是问题的工作簿,自引用查询非常易于管理。 (2认同)
  • “有很多很好的方法可以完成这项工作” –如果这不能掩盖所有这些“好的”方式在请求的用例中确实存在的主要缺陷(这是防止其广泛使用的原因),我不知道这是什么。 (2认同)

Cha*_*ams 8

您可以如下原生:

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

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

  • 问题指定SQL. (4认同)

小智 7

TL;博士; Excel本地完成所有这些 - 使用过滤器和/或

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

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

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

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

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

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

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

一个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();
Run Code Online (Sandbox Code Playgroud)

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

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

注 - 在Excel中使用表格!:

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

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

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


ana*_*kic 5

我可以建议尝试一下QueryStorm - 它是 Excel 的插件,可以非常方便地在 Excel 中使用 SQL。

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

免责声明:我是作者。

  • 不幸的是,虽然它是一个很棒的工具,但现在似乎只需要付费,除了 30 天的试用期。 (2认同)

小智 5

这里接受的答案是旧技术,不应尝试。

回到撰写此问题时,Power Query 并不是一个众所周知的选项,并且除非您使用最新版本的 Office 并将其作为单独的加载项安装,否则该选项不可用。

现在,Power Query 包含在 Excel 中并默认用于获取数据。这是正确的做法。它简单、快速、有效。

这是 Power Query 中问题的答案。如果您需要复制此内容的帮助,请搜索“Power Query 入门”。一旦开始使用 Power Query,您就会发现这是非常基本的,并且可以使用高级编辑器轻松完成:

let
    Source = Excel.CurrentWorkbook(){[Name="Names"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"lastname", type text}, {"firstname", type text}, {"phonenumber", type text}}),
    #"Filtered Rows" = Table.SelectRows(#"Changed Type", each ([phonenumber] <> null)),
    #"Removed Other Columns" = Table.SelectColumns(#"Filtered Rows",{"lastname", "firstname", "phonenumber"}),
    #"Sorted Rows" = Table.Sort(#"Removed Other Columns",{{"lastname", Order.Ascending}})
in
    #"Sorted Rows"
Run Code Online (Sandbox Code Playgroud)

  • 我不想学习复杂的新语言,即使它更好。我已经了解 SQL。 (3认同)