1

我正在做以下查询。查询的第一个转储显示整个 Excel 工作表,第二个转储显示第二个查询的结果。

我正在对 excel 表进行验证检查,以确保系统中没有更多的斗牛犬品种,并且我需要能够告诉用户 excel 表上的哪一行有斗牛犬。

如何让第一行的行号出现在第二行?因此用户可以在 Excel 工作表上进行更改。我是否必须在 Excel 文档首次上传到服务器时对其进行编辑并为其添加行号列?可能有更好的方法来实现这一点。

  <cffunction name="validateExcelSheet" access="public" output="yes" returnType="void" 
hint="check dogs">

    <cfspreadsheet
    action="read"
    src="#SESSION.theFile#"
    headerrow= "1"
    excludeHeaderRow = "true"
    query = "allData"
    rows = "1-#lastRow#" />


<cfscript>    
 pitBullcheck = new Query(
        sql ="SELECT * FROM allData where breed like 'Pit%' ",
        dbtype = "query",
        allData = allData);
        pitBullresult = pitBullcheck.execute().getResult();
   </cfscript>

</cffunction>

这是一个基于标签的版本cfquery

<cfquery name="pitBullresult" dbtype="query">
SELECT *
FROM allData
WHERE breed LIKE 'Pit'
</cfquery>
4

1 回答 1

2

cfspreadsheet 无法做到这一点。CFSpreadsheet 仅返回单元格值。它不提供电子表格中包含这些值的物理行号。


此外,要记住的其他一点是 CFSpreadsheet 仅返回“逻辑”(即填充的)行/单元格。这与您在 Excel 中看到的“物理”行号1,2,3,...和列标题不同。A,B.C....由于用户可以在电子表格中的任何位置输入值,因此逻辑和物理并不总是一回事。

例如,创建一个空白电子表格。A2然后在单元格和中输入值 A25。现在运行上面的代码。虽然您可能期望生成的查询包含二十五 (25) 条记录,但它只包含两 (2) 条记录,因为只填充了两个单元格。

   query
   Row  | COL_1
    1   | Value in cell A2 (physical row 2)
    2   | Value in cell 25 (physical row 25)

我认为你可以用 cfspreadsheet 做的最好的事情是循环查询并在结果中显示相对行号,即query.currentRow. 如果填充的数据总是从前几行开始,这对您的目的来说可能已经足够了。如果没有,它可能会变得有点混乱......

也就是说,从技术上讲,您可以获得真实的物理行号。但是,它需要低得多的代码,老实说……看起来工作量很大,但收获很少。

于 2014-02-17T03:16:55.620 回答