在Excel表上运行SQL
我不知道我是否在问正确的问题,但是我对excel没有太多的经验。 我试图从所有姓氏字段sorting从一个电话号码字段不是空的另一个表的子表。 我可以很容易地用SQL做这个,但是我不知道如何在excel中去做。 我试图导入到postgresql,只是在那里查询,但似乎有点过分。 我会很感激的答复,但我真的只是希望指出正确的方向,因为我确信我正在复杂化。 谢谢!
对于我想要做的,SQL查询SELECT lastname, firstname, phonenumber WHERE phonenumber IS NOT NULL ORDER BY lastname
would do the trick。 希望这解释了我想要做的。 这似乎太简单,因为它是excel本身无法做到的。
有很多好的方法可以完成,其他人已经提出了。 沿着“通过SQL轨道获取Excel数据”,下面是一些指针。
-
Excel有“数据连接向导”,它允许您导入或链接从另一个数据源,甚至在同一个Excel文件。
-
作为Microsoft Office(和OS)的一部分,有两个感兴趣的提供者:旧的“Microsoft.Jet.OLEDB”和最新的“Microsoft.ACE.OLEDB”。 在build立连接时(例如使用数据连接向导)查找它们。
-
一旦连接到Excel工作簿,工作表或范围就等同于表或视图。 工作表的表名是附有美元符号(“$”)的工作表的名称,并用方括号(“[”和“]”)括起来; 范围,它只是范围的名称。 若要指定单元格的未命名范围作为您的logging源,请将标准Excel行/列表示法附加到方括号中表格名称的末尾。
-
本地SQL将(或多或less)成为Microsoft Access的SQL。 (过去,它被称为JET SQL,但是Access SQL已经发展了,我相信JET是旧技术。
-
例如,读取工作表:SELECT * FROM [Sheet1 $]
-
例如,读取范围:SELECT * FROM MyRange
-
例如,读取一个未命名的单元格范围:SELECT * FROM [Sheet1 $ A1:B10]
-
有许多许多书籍和网站可以帮助你通过细节工作。
===进一步的注意事项===
默认情况下,假定Excel数据源的第一行包含可用作字段名称的列标题。 如果不是这种情况,则必须closures此设置,或者将第一行数据“消失”作为字段名称使用。 这是通过将可选的HDR =设置添加到连接string的扩展属性来完成的。 不需要指定的默认值是HDR =是。 如果您没有列标题,则需要指定HDR = No; 提供者将您的字段F1,F2等命名
有关指定工作表的警告:提供程序假定您的数据表以指定工作表上最上面的,最左边的非空白单元格开始。 换句话说,您的数据表可以从第3行,C列开始,没有任何问题。 但是,例如,您不能在单元格A1中的数据左侧键入上面的worksheeet标题。
关于指定范围的警告:当您指定一个工作表作为您的logging源时,提供程序会在空间允许的情况下在工作表的现有logging下添加新logging。 当您指定范围(命名或未命名)时,Jet还会在空间允许的范围内的现有logging下添加新logging。 但是,如果您重新查询原始范围,则生成的logging集不包括范围之外的新添加的logging。
数据types(值得一试)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源数据库types,并为Microsoft Excel 8.0(97),9.0(2000)和10.0(2002)工作簿使用Excel 8.0源数据库types。
连接到“最新的”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
通过ADBA通过VBA连接到Excel详细http://support.microsoft.com/kb/257819
微软JET 4详细信息在http://support.microsoft.com/kb/275561
你可以做到这一点原生如下:
- select表格并使用Excel将其sorting在Last Name上
- 在E1和E2中创build一个2行乘1列高级过滤条件,其中E1为空,E2包含公式
=C6=""
其中C6是电话号码列的第一个数据单元格。 - select表格并使用高级筛选器,使用E1:E2中的标准范围复制到一个范围,并指定要将输出复制到的位置
如果你想以编程的方式做到这一点,我build议你使用macros录像机logging上述步骤,并看看代码。
TL;博士; Excel本身就完成了所有这些工作 – 使用filter和/或表格
( http://office.microsoft.com/en-gb/excel-help/filter-data-in-an-excel-table-HA102840028.aspx )
您可以通过oledb连接以编程方式打开excel,并在工作表内的表上执行SQL。
但是,你可以做任何你要做的事情,没有公式只是filter。
- 点击您正在查看的数据中的任意位置
- 去function栏上的数据
- select“过滤”它的中间,看起来像一个漏斗
- 您现在将在表格第一行的每个单元格的紧边上有箭头
- 单击电话号码上的箭头并取消select空白 (最后一个选项)
- 单击姓氏上的箭头并selectzsorting (顶部选项)
有一个游戏..有些事情要注意:
- 您可以select已过滤的行并粘贴到其他位置
- 在左侧的状态栏中,您将看到有多less行满足您在总行数中筛选条件。 (例如find313个logging中的308个)
- 你可以在Excel 2010的病房中按颜色过滤
- 有时候我会创build计算列给出状态或清理版本的数据,然后您可以过滤或按论文sorting。 (例如像其他答案中的公式)
做它filter,除非你打算做很多,或者你想自动导入数据的地方或东西..但为了完整性:
一个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具有“表”function,使数据performance得更像一张桌子..这给你一些很大的好处,但不会让你做任何types的查询。
http://office.microsoft.com/en-gb/excel-help/overview-of-excel-tables-HA010048546.aspx
对于excel中的表格数据,这是我的默认值..我做的第一件事是点击数据,然后从function区的主页部分select“格式为表格”。 这给你过滤和默认sorting,并允许您按名称(例如表[fieldname])访问表和字段,这也允许在列上的聚合函数,如最大和平均
您可以在Excel中使用SQL。 它只是很好的隐藏。 看到这个教程:
http://smallbusiness.chron.com/use-sql-statements-ms-excel-41193.html
如果您需要按照Charles的说明执行此操作,但也可以使用Excel公式和帮助列来完成此操作,以防您想使filter变为dynamic。
让我们假设您的数据在DataSheet表中,并从以下列的第2行开始:
- A:姓氏
- 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))
对应的顺序是
只要你的数据去掉了这些公式。
在应显示结果的表格上,创build以下列。
- 答:在第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.
我build议你看看MySQL的csv存储引擎 ,它基本上允许你加载任何csv文件(很容易从excel创build)到数据库中,一旦你有了,你可以使用任何你想要的SQL命令。
值得一看。
可能我build议给QueryStorm一个尝试 – 这是Excel的插件,使得在Excel中使用SQL非常方便。 免责声明:我是作者。
您可以在您select的语言/平台上使用Excel的本机数据库驱动程序进行试验。 在Java世界中,您可以尝试http://code.google.com/p/sqlsheet/ ,它提供了一个用于直接使用Excel工作表的JDBC驱动程序。 同样,您可以获得其他平台的数据库技术的驱动程序。
不过,我可以保证你很快就会用这些包装器库提供的function数量来达到目的。 更好的方法是使用Apache HSSF / POI或相似级别的库,但是需要更多的编码工作。
Microsoft Access和LibreOffice Base可以打开电子表格作为源并在其上运行SQL查询。 这将是运行各种查询最简单的方法,并避免运行macros或编写代码的混乱。
Excel也有自动filter和数据sorting,将完成很多简单的查询,如你的例子。 如果你需要这些function的帮助,谷歌将比我更好的教程来源。
我可能会误解我,但是这不正是一个数据透视表呢? 你有一个表中的数据或只是一个过滤列表? 如果它不是一个表(ctrl + l),那么只要激活表中的任何单元格,并在另一个表上插入一个数据透视表。 然后将行的姓氏,名字,电话号码添加到行部分。 然后将电话号码添加到filter部分,并过滤出空值。 现在像正常sorting。
如果您使用针对Expat库编译的GDAL / OGR ,则可以使用XLSX驱动程序读取.xlsx文件,并从命令提示符运行SQLexpression式。 例如,从与电子表格相同目录的osgeo4w shell中,使用ogrinfo实用程序:
ogrinfo -dialect sqlite -sql "SELECT name, count(*) FROM sheet1 GROUP BY name" Book1.xlsx
将在sheet1
上运行SQLite查询,并以不寻常的forms输出查询结果:
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运行相同的查询来创build一个简单的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文件类似的操作,您需要XLS驱动程序 ,它是针对FreeXL库构build的,而这并不常见(例如,不适用于OSGeo4w)。