96

我正在尝试从另一个表中创建一个子表,该表包含按 AZ 排序的所有姓氏字段,其中电话号码字段不为空。我可以用 SQL 很容易地做到这一点,但我不知道如何在 Excel 中运行 SQL 查询。我很想将数据导入 postgresql 并在那里查询,但这似乎有点过分。

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

4

10 回答 10

76

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

  1. Excel 具有“数据连接向导”,它允许您从另一个数据源或什至在同一个 Excel 文件中导入或链接。

  2. 作为 Microsoft Office(和操作系统)的一部分,有两个感兴趣的提供程序:旧的“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= setting到连接字符串的扩展属性来完成的。不需要指定的默认值是HDR=Yes. 如果没有列标题,则需要指定HDR=No; 提供商将您的字段命名为 F1、F2 等。

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

关于指定范围的注意事项:当您将工作表指定为记录源时,如果空间允许,提供程序会在工作表中现有记录的下方添加新记录。当您指定一个范围(已命名或未命名)时,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

通过 VBA 通过 ADODB 连接到 Excel,详见http://support.microsoft.com/kb/257819

Microsoft JET 4 详细信息位于http://support.microsoft.com/kb/275561

于 2013-09-24T14:48:05.670 回答
7

您可以按如下方式本机执行此操作:

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

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

于 2013-09-17T18:47:07.830 回答
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 ordering(顶部选项)

玩一玩..一些注意事项:

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

一个方便的起点是查看架构,因为那里可能比您想象的要多:

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] )这还允许对列进行聚合函数,例如 max 和 average

于 2013-09-24T09:20:59.650 回答
5

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

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

免责声明:我是作者。

于 2017-06-13T14:05:59.767 回答
4

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

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

于 2013-09-24T12:50:58.640 回答
2

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

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

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

您需要此工作表上的两个帮助列。

  • 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)),这对应于 order by

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

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

  • 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。

于 2013-09-21T18:38:56.590 回答
0

如果您使用 Expat 库编译了GDAL/OGR ,则可以使用XLSX 驱动程序读取 .xlsx 文件,并从命令提示符运行 SQL 表达式。例如,从与电子表格在同一目录中的osgeo4w shell 中,使用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运行相同的查询来创建一个简单的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 驱动程序,这并不常见(例如,不是来自 OSGeo4w)。

于 2016-10-13T04:05:21.607 回答
-1

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

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

于 2013-09-14T05:16:34.393 回答
-1

我可能会误解我,但这不正是数据透视表的作用吗?您是否有表格中的数据或只是过滤列表中的数据?如果它不是表格,则将其设为一个(ctrl+l),然后只需激活表格中的任何单元格并在另一张表上插入数据透视表。然后将列姓氏、名字、电话号码添加到行部分。然后将电话号码添加到过滤器部分并过滤掉空值。现在像往常一样排序。

于 2013-09-20T23:47:37.800 回答
-2

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

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

于 2013-09-20T00:52:30.617 回答