0

我不明白这个代码片段。当我尝试另一个 excel 文件时,它无法正确编译。为什么程序员使用 F,它指的是列还是行?

string strProvider;
        if (dbFilePath.LastIndexOf("xlsx") > -1)
            strProvider = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + dbFilePath + @";Extended Properties=""Excel 12.0 Xml;HDR=YES"";";
        else
            strProvider = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""" + dbFilePath + @""";Persist Security Info=False;Extended Properties=""Excel 8.0;""";

        string strQuery = "SELECT  " +
                            "F9 AS EmpNbr,  " +
                            "F10 AS ACCTSTATUS, " +
                            "F1  AS PROJECTEDAGE, " +
                            "F14 AS UPDBALDUE, " +
                            "F15 AS AMTCURRENT, " +
                            "F16 AS AMT30DAY, " +
                            "F17 AS AMT60DAY, " +
                            "F18 AS AMT90DAY, " +
                            "F19 AS AMT120DAY, " +
                            "F20 AS AMT150DAY, " +
                            "F21 AS AMT180DAY " +
                           "FROM [Sheet1$A8:V] " +
                           "WHERE F9 IS NOT NULL AND " +
                           "(F17 > 0 OR F18 > 0 OR F19 > 0 OR F20 > 0 OR F21 > 0) " +
                           "  AND Trim(F10) <> 'RETURN MAIL/LEFT COMPANY' " +
                           "  AND Trim(Left(F1,3)) IN ('60','90','120','150','180') " +
                           "ORDER BY F9 ";
4

4 回答 4

2

F1, F2, F3 etc只是生成的列标题,而不是单元格引用。即使在您拥有的连接字符串中,如果第一行为空白,则提供程序将自动生成从toHDR=YES的列名。为什么选择 FI 不知道,只是列序号(从 1 开始),并且名称带有前缀,因此不能与数字混淆。F1F(n)n

如果您重新将数据集视为数据库而不是电子表格,那么在查询中引用特定行是没有意义的,例如,如果您想象一个小表

ID | A  |  B  |  C  |
-------------------
 1 | x  |  y  |  z  |
 2 | d  |  e  |  f  |
 3 | j  |  k  |  l  |

然后从 SQL 而不是 excel 的角度考虑,以下查询仅获取第一行是没有意义的,因为A1= X:

SELECT A, B, C
FROM Sheet1
WHERE A1 = 'x';

您将不得不像这样使用列:

SELECT A, B, C
FROM Sheet1
WHERE ID = 1
AND A = 'x';
于 2013-06-25T17:18:38.663 回答
1

F9、F10 等是单元格,F(或任何其他字母/组合)是列指示符,9(或任何其他数字)是行索引。

于 2013-06-25T16:44:28.677 回答
0

这段代码在这里所做的是创建与数据库的 OLEDB 连接,并对数据库执行查询。一开始它正在检查数据库是另一个excel表。如果是,则使用此连接类型:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + dbFilePath + @";Extended Properties=""Excel 12.0 Xml;HDR=YES"

否则它使用这个:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""" + dbFilePath + @""";Persist Security Info=False;Extended Properties="

正如我的猜测,它可能期望任何其他类型的数据库都是基于 Access 的。

于 2013-06-25T16:49:36.780 回答
0

Jet 和 ACE 是 OLEDB 提供程序,允许您在 Excel 电子表格和 MS Office 中的其他数据上使用 SQL 语法。所以,是的,它们是被别名的单元格引用。由于您拥有电子表格,因此您可以查看单元格并查看数据是什么。例如,我怀疑单元格F9包含员工编号。

在 Excel 电子表格中,列是从Athrough枚举的Z,然后是AAthroughAZ等,行是从1上枚举的。因此单元格引用F9在 columnF和 row处协调9


因为“FROM”范围Sheet1$A8:V是相对的,您可能必须相应地调整选择。第 17 行是什么?是F17员工号吗?


也许将查询更改为

string strQuery = "SELECT * FROM [Sheet1$A8:V]"

并从那里开始。

于 2013-06-25T16:53:17.697 回答