我正在尝试从排序A-Z的所有姓氏字段的另一个表创建一个子表,其中电话号码字段不为空。我可以使用SQL轻松完成这项工作,但我不知道如何在Excel中运行SQL查询。我很想将数据导入postgresql并在那里查询,但这似乎有点过分。
对于我正在尝试做的事情,SQL查询SELECT lastname, firstname, phonenumber WHERE phonenumber IS NOT NULL ORDER BY lastname
可以解决问题。它似乎太简单了,不能成为Excel本身无法做到的事情。如何在Excel中运行这样的SQL查询?
有很多很好的方法可以完成这项工作,其他人已经提出过。下面是“通过SQL轨道获取Excel数据”,这里有一些指示。
===附加说明===
默认情况下,假定Excel数据源的第一行包含可用作字段名称的列标题。如果不是这种情况,则必须关闭此设置,否则第一行数据将“消失”以用作字段名称。这是通过将可选的HDR =设置添加到连接字符串的扩展属性来完成的。默认值(不需要指定)是HDR = Yes。如果您没有列标题,则需要指定HDR =否;提供者为您的字段F1,F2等命名。
有关指定工作表的注意事项:提供程序假定您的数据表以指定工作表上最上面,最左侧的非空单元格开头。换句话说,您的数据表可以从第3行C列开始,没有问题。但是,例如,您不能在单元格A1中的数据的上方和左侧键入worksheeet标题。
关于指定范围的注意事项:当您将工作表指定为记录源时,提供程序会在空间允许的情况下在工作表中的现有记录下添加新记录。指定范围(命名或未命名)时,Jet还会在空间允许的范围内在现有记录下添加新记录。但是,如果您在原始范围上重新查询,则生成的记录集不包括该范围之外的新添加的记录。
CREATE TABLE的数据类型(值得尝试):短,长,单,双,货币,日期时间,位,字节,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).aspx和http://support.microsoft.com/kb/316934的更多信息
通过ADODB通过Vazxswpoi详细介绍的VBA连接到Excel
有关http://support.microsoft.com/kb/257819的Microsoft JET 4详细信息
我建议你看一下MySQL QueryStorm,它本质上允许你将任何csv文件(很容易从excel创建)加载到数据库中,一旦你有了,你可以使用你想要的任何SQL命令。
值得一看。
如果您使用针对Expat库编译的http://code.google.com/p/sqlsheet/,则可以使用csv storage engine读取.xlsx文件,并从命令提示符运行SQL表达式。例如,从与电子表格相同的目录中的GDAL/OGR shell,使用XLSX driver实用程序:
osgeo4w
将在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
要与较旧的.xls文件类似,您需要针对FreeXL库构建的CSV,这并不常见(例如,不是来自OSGeo4w)。
您可以如下原生:
如果您想以编程方式执行此操作,我建议您使用宏记录器记录上述步骤并查看代码。
TL;博士; Excel完成所有这些 - 使用=C6=""
和/或filters
(Qazxswpoi)
您可以通过oledb连接以编程方式打开Excel,并在工作表中的表上执行SQL。
但你可以做任何你要做的事情,没有公式只是过滤器。
玩一玩......有些事要注意:
使用过滤器,除非你要做很多事情,或者你想在某处或某些地方自动导入数据......但为了完整性:
一个c#选项:
tables
一个方便的起点是看一下架构,因为可能会有比你想象的更多:
http://office.microsoft.com/en-gb/excel-help/filter-data-in-an-excel-table-HA102840028.aspx
然后当你想查询工作表时:
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();
注 - 在Excel中使用表格!:
Excel具有“表格”功能,使数据的行为更像一个表格...这给你带来了很多好处,但不会让你做任何类型的查询。
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());
}
}
对于excel中的表格数据,这是我的默认值。我要做的第一件事是点击数据,然后从功能区的主页部分选择“格式为表格”。这为您提供了过滤和默认排序,并允许您按名称访问表和字段(例如table [fieldname]),这也允许列上的聚合函数,例如最高和平均
您可以在Excel中使用SQL。它只是隐藏得很好。看本教程:
OleDbDataAdapter da = new OleDbDataAdapter("select * from [" + sheet + "]", ExcelFile);
dt = new DataTable();
da.Fill(dt);
如果您只需按照Charles的描述执行此操作,但也可以使用Excel公式和帮助列进行此操作,以防您想要使过滤器动态化。
让我们假设您的数据在工作表DataSheet上,并从以下列的第2行开始:
此工作表上需要两个辅助列。
就数据而言,复制这些公式。
在应显示结果的工作表上,创建以下列。
=if(A2 = "", 1, 0)
,这是相应数据的行=if(D2 <> 1, "", sumifs(D$2:D$1048576, A$2:A$1048576, "<"&A2) + sumifs(D$2:D2, A$2:A2, A2))
,这是实际数据,如果没有数据则为空复制B2和C2中的公式,并将C列复制粘贴到D和E.
我可能会建议尝试使用=match(A2, DataSheet!$E$2:$E$1048576, 0)
- 它是Excel的插件,这使得在Excel中使用SQL非常方便。
此外,它是免费增值。如果你不关心自动完成,错误波浪等,你可以免费使用它。只需下载并安装,您就可以在Excel中获得SQL支持。
免责声明:我是作者。
您可以在您选择的语言/平台中试用Excel的本机DB驱动程序。在Java世界中,您可以尝试使用=iferror(index(DataSheet!A$2:A$1048576, $B2), "")
,它提供了一个JDBC驱动程序,可以直接使用Excel工作表。同样,您可以为其他平台获取数据库技术的驱动程序。
但是,我可以保证您很快就会遇到这些包装器库提供的功能数量。更好的方法是使用Apache HSSF / POI或类似级别的库,但需要更多编码工作。
Microsoft Access和LibreOffice Base可以打开电子表格作为源并在其上运行SQL查询。这将是运行各种查询的最简单方法,并避免运行宏或编写代码。
Excel还具有自动过滤器和数据排序功能,可以完成许多简单查询,例如您的示例。如果您需要有关这些功能的帮助,Google可能是比我更好的教程来源。
我可能误解了我,但这不正是数据透视表的作用吗?您是拥有表格中的数据还是只有过滤后的列表?如果它不是一个表(ctrl + l),那么只需激活表中的任何单元格并在另一个工作表上插入一个数据透视表。然后将列lastname,firstname,phonenumber添加到rows部分。然后将电话号码添加到过滤器部分并过滤掉空值。现在排序正常。