当前位置: 首页 > 知识库问答 >
问题:

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

傅明知
2023-03-14

我试图从另一个表中创建一个子表,其中所有的姓氏字段排序为A-Z,其中有一个电话号码字段不是null。我可以用SQL很容易做到这一点,但是我不知道如何在Excel中运行SQL查询。我很想将数据导入postgresql,然后在那里查询,但这似乎有点过分。

对于我正在尝试做的事情,SQL查询SELECT lastname, firstname, phonenumber WHERE phonenenumber is not NULL ORDER BY lastname可以做到这一点。这似乎太简单了,因为它是Excel本地无法完成的事情。如何在Excel中运行这样的SQL查询?

共有3个答案

熊嘉茂
2023-03-14

您可以这样做:

  1. 选择表格并使用Excel按姓氏对其进行排序

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

微生毅
2023-03-14

tl; dr; Excel在本机上执行所有这些操作-使用筛选器和或表格

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

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

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

  • 单击您正在查看的数据中的任何位置
  • 转到功能区栏上的数据
  • 选择过滤器,它大约在中间,看起来像一个漏斗
    • 现在,您将在表的第一行的每个单元格的紧边上有箭头

    在附近玩一玩。。需要注意的一些事项:

    1. 您可以选择筛选的行并将其粘贴到其他位置
    2. 在左侧的状态栏中,您将看到有多少行符合您的筛选条件(例如,在313条记录中找到308条)
    3. 你可以在excel2010中按颜色过滤
    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中的表格数据,这是我的默认设置。。我要做的第一件事是单击数据,然后从功能区的“主页”部分选择“格式为表”。默认情况下,这将为您提供筛选和排序功能,并允许您按名称访问表和字段(例如表[fieldname])。这还允许对列执行聚合函数,例如max和average

薛霄
2023-03-14

有许多好方法可以做到这一点,其他人已经提出了建议。在“通过SQL轨道获取Excel数据”之后,这里有一些指针。

>

  • Excel具有数据连接向导,允许您从另一个数据源甚至在同一个Excel文件中导入或链接。

    作为微软Office(和操作系统)的一部分,有两个令人感兴趣的提供商:旧的“Microsoft.Jet.OLEDB”和最新的“Microsoft.ACE.OLEDB”。设置连接时查找它们(例如使用数据连接向导)。

    一旦连接到Excel工作簿,工作表或区域就相当于表或视图。工作表的表名是工作表的名称,后面附加了一个美元符号($),并用方括号(“[”和“]”)包围;对于一个范围,它只是该范围的名称。要指定未命名的单元格区域作为记录源,请在方括号中的工作表名称末尾附加标准Excel行/列表示法。

    本机SQL将(或多或少)成为Microsoft Access的SQL。(在过去,它被称为jetsql;然而accesssql已经发展起来,我相信JET是不受欢迎的老技术。)

    例如,读取工作表:SELECT*from[Sheet1$]

    例如,读取范围:SELECT*FROM MyRange

    例如,读取未命名的单元格区域:SELECT*OF[Sheet1$A1: B10]

    有许多许多书籍和网站可以帮助你通过细节工作。

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

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

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

    数据类型(值得一试)为创建表:短,长,单,双,货币,日期时间,位,字节,GUID,BigB二进制,长二进制,VarB二进制,LongText,VarChar,十进制

    连接到“旧技术”Excel(扩展名为xls的文件):Provider=Microsoft。喷气式飞机OLEDB。4.0;数据源=C:\MyFolder\MyWorkbook。xls;扩展属性=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文件扩展名的文件):提供商=微软。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    将数据视为文本:IMEX设置将所有数据视为文本。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    (详情请参阅http://www.connectionstrings.com/excel)

    更多信息请访问http://msdn.microsoft.com/en-US/library/ms141683(v=sql.90)。aspx和athttp://support.microsoft.com/kb/316934

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

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

  •  类似资料:
    • 问题内容: 我要做的就是在excel工作表上使用标准范围(例如,命名范围,甚至A1:F100),并在其中运行一些sql查询,然后返回一个记录集,我可以在VBA代码中逐步执行该记录集,甚至只是粘贴到同一工作簿中的其他工作表中。 使用ADODB是一个想法,但是如何设置连接字符串以指向当前工作簿中的某个范围? 我知道在使用Microsoft查询向导之前,这并不理想,但是可以使用。我似乎无法使它仅引用其他

    • 问题内容: 我知道statement.cancel()可用于取消正在运行的SQL查询,但是我想知道的是,我将如何在另一个线程中保持该语句对象。 用例: 我请求启动一个运行语句的线程。 然后从一个单独的请求(另一个线程),我可能想取消此线程。 我将如何在这个 新请求中 获得声明以在其中调用cancel方法。 在某些情况下,我可能要运行多个语句。 附加信息,它是一个Web应用程序,使用spring框架

    • 问题内容: 有没有一种方法可以显示执行查询时Django正在运行的SQL? 问题答案: 请参阅文档FAQ:“如何查看Django正在运行的原始SQL查询? ” 包含SQL查询的列表: 查询集还具有包含要执行的查询的属性: 请注意,查询的输出不是有效的SQL,因为: “ Django实际上从未插值参数:它将查询和参数分别发送到数据库适配器,后者执行适当的操作。” 来自Django错误报告#17741

    • 问题内容: 所以我的数据库中有两个表,它们都看起来像这样: 通讯:(已拨打电话) 移动: 我想做的是找到最接近给定“通信”时间戳的“移动”时间戳。基本上,我想找到一个人打电话时可能去过的地方。 目前,我这样做是: 输出将是: 我将呼叫者的和设置到的位置,然后他们拨打了电话。因此,这将找到一个呼叫者的可能位置。 在这种情况下,打电话到,并且他的移动数据表明他的位置在。这样一来,它就会显示在他可能的位

    • 问题内容: [TABLE]是具有超过7亿行的Oracle数据库表。运行6个小时后,我取消了SQL执行。 是否有任何SQL提示可以提高性能?或任何其他解决方案来加快速度? 编辑: 此查询将运行一次,然后再也不会运行。 问题答案: 首先,它是一次性查询还是循环查询?如果只需要执行一次,则可能要考虑以并行模式运行查询。无论如何,您都将不得不扫描所有行,您可以使用ROWID(自己动手做并行性)范围自己划分

    • 并编写下面的查询,它是只在我的master上运行,还是将所有10个节点都用作worker? 如果不是,我必须做什么才能让我的Spark Sql使用完整的集群?