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数据",这里有一些指示.
Excel具有"数据连接向导",允许您从其他数据源或甚至在同一Excel文件中导入或链接.
作为Microsoft Office(和OS)的一部分,有两个感兴趣的提供者:旧的"Microsoft.Jet.OLEDB"和最新的"Microsoft.ACE.OLEDB".在设置连接时查找它们(例如使用数据连接向导).
连接到Excel工作簿后,工作表或范围相当于表或视图.工作表的表名是附加了美元符号("$")的工作表的名称,并用方括号括起来("["和"]"); 一个范围,它只是范围的名称.要指定未命名的单元格范围作为记录源,请将标准Excel行/列表示法附加到方括号中的工作表名称末尾.
本机SQL将(或多或少)是Microsoft Access的SQL.(在过去,它被称为JET SQL;但是Access SQL已经发展,我相信JET已被弃用旧技术.)
例如,读取工作表:SELECT*FROM [Sheet1 $]
例如,读取范围:SELECT*FROM MyRange
例如,读取未命名的单元格范围:SELECT*FROM [Sheet1 $ A1:B10]
有许多书籍和网站可以帮助您完成细节.
===附加说明===
默认情况下,假定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
您可以如下原生:
=C6=""
,其中C6是电话号码列的第一个数据单元.如果您想以编程方式执行此操作,我建议您使用宏记录器记录上述步骤并查看代码.
小智 7
TL;博士; Excel本地完成所有这些 - 使用过滤器和/或表
(http://office.microsoft.com/en-gb/excel-help/filter-data-in-an-excel-table-HA102840028.aspx)
您可以通过oledb连接以编程方式打开Excel,并在工作表中的表上执行SQL.
但你可以做任何你要做的事情,没有公式只是过滤器.
玩一玩......有些事要注意:
使用过滤器,除非你要做很多事情,或者你想在某个地方或某些地方自动导入数据......但为了完整性:
一个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
我可以建议尝试一下QueryStorm - 它是 Excel 的插件,可以非常方便地在 Excel 中使用 SQL。
此外,它是免费增值服务。如果你不关心自动完成、错误曲线等,你可以免费使用它。只需下载并安装,您就可以在 Excel 中获得 SQL 支持。
免责声明:我是作者。
小智 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)
归档时间: |
|
查看次数: |
345633 次 |
最近记录: |