在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数据”,下面是一些指针。

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

  2. 作为Microsoft Office(和OS)的一部分,有两个感兴趣的提供者:旧的“Microsoft.Jet.OLEDB”和最新的“Microsoft.ACE.OLEDB”。 在build立连接时(例如使用数据连接向导)查找它们。

  3. 一旦连接到Excel工作簿,工作表或范围就等同于表或视图。 工作表的表名是附有美元符号(“$”)的工作表的名称,并用方括号(“[”和“]”)括起来; 范围,它只是范围的名称。 若要指定单元格的未命名范围作为您的logging源,请将标准Excel行/列表示法附加到方括号中表格名称的末尾。

  4. 本地SQL将(或多或less)成为Microsoft Access的SQL。 (过去,它被称为JET SQL,但是Access SQL已经发展了,我相信JET是旧技术。

  5. 例如,读取工作表:SELECT * FROM [Sheet1 $]

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

  7. 例如,读取一个未命名的单元格范围:SELECT * FROM [Sheet1 $ A1:B10]

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

===进一步的注意事项===

默认情况下,假定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

你可以做到这一点原生如下:

  1. select表格并使用Excel将其sorting在Last Name上
  2. 在E1和E2中创build一个2行乘1列高级过滤条件,其中E1为空,E2包含公式=C6=""其中C6是电话号码列的第一个数据单元格。
  3. 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。

  1. 点击您正在查看的数据中的任意位置
  2. 去function栏上的数据
  3. select“过滤”它的中间,看起来像一个漏斗
    • 您现在将在表格第一行的每个单元格的紧边上有箭头
  4. 单击电话号码上的箭头并取消select空白 (最后一个选项)
  5. 单击姓氏上的箭头并selectzsorting (顶部选项)

有一个游戏..有些事情要注意:

  1. 您可以select已过滤的行并粘贴到其他位置
  2. 在左侧的状态栏中,您将看到有多less行满足您在总行数中筛选条件。 (例如find313个logging中的308个)
  3. 你可以在Excel 2010的病房中按颜色过滤
  4. 有时候我会创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)。