【问题标题】:CFspreadsheet loopingCF电子表格循环
【发布时间】:2014-10-19 03:33:02
【问题描述】:

我有一个关于 cfspreadsheet 的问题......所以我正在使用 cfspreadshseet 创建 Excel 电子表格以用于报告目的。我的页面允许用户从数据库中选择要包含在报告中的任何列。所以这里是一个例子:

电子表格可能如下所示:

名字---姓氏---组织---地址---城市---州---邮编---关注

Joe Smith 样本 12 主要 denver co 80513 关注点在这里

我的问题是,如果 Joe 有超过 1 个问题,我会得到多行包含 joe 的信息...有没有办法可以循环关注问题并且只有 1 行供 joe 使用?

谢谢,

史蒂夫

【问题讨论】:

  • cfoutput 的 group 属性似乎适合这种情况。
  • 所以我有一个获取报告数据的 cfquery,您是否建议我使用 cfoutput 对其进行分组然后写入电子表格?
  • 这就是我的建议。

标签: excel coldfusion coldfusion-10 cfspreadsheet


【解决方案1】:

使用 cfoutput 的“组”功能非常适合此任务。只是为了排除另一种可能性,您还可以在数据库查询中生成列表。

例如,MySQL 有GROUP_CONCAT 函数。我不知道你的表的结构,但假设你有两个表UserUserConcern,你可以使用GROUP_CONCAT 这样将“关注”值连接成一个字符串:

SQLFiddle

SELECT
     u.UserID
     , u.FirstName
     , ... other columns
     , GROUP_CONCAT( uc.Concern ) AS ConcernList
FROM UserTable u INNER JOIN UserConcern uc
         ON uc.UserID = u.UserID
GROUP BY 
     u.UserID
     , u.FirstName
     , ... other columns

对于 SQL Server,标准技巧是使用 XML 路径:

SQLFiddle

SELECT
     u.UserID
     , u.FirstName
     , ... other columns
     , STUFF( ( SELECT ',' + uc.Concern
                FROM  UserConcern uc
                WHERE uc.UserID = u.UserID
                ORDER BY uc.Concern
                FOR XML PATH('')
               ) 
              , 1, 1, ''
          ) AS ConcernList
FROM UserTable u
GROUP BY 
     u.UserID
     , u.FirstName
     , ... other columns

然后像往常一样简单地生成电子表格。

【讨论】:

  • Leigh,我得到了这个工作,我选择了这个方法,因为我有大约 4 个这样的表可以包含在我的报告中,所以通过查询来做是一个不错的选择。感谢您的回复。
【解决方案2】:

您需要一个唯一的行 ID 才能最安全地执行此操作,使用 lastname 或其他内容的外部组可能会导致冲突。 UserID 是一个占位符变量。确保将其替换为准确的 ID 名称。当然,其中一些变量名只是猜测而已。

<cfoutput query ="thequery" group="UserID">
  <cfset cList="">
  <cfoutput group="concern">
    <cfset cList=ListAppend(cList,Concern)>
  </cfoutput>
  <cfset temp = spreadsheetAddRow(my_spreadsheet,"'#fn#','#ln#',...,'#cList#'">
</cfoutput>

【讨论】:

  • +1。请注意,“组”要求查询结果以相同的方式排序,否则将无法正常工作。因此,如果您按“UserID”分组,请务必在您的数据库查询中使用ORDER BY UserID
【解决方案3】:

假设您希望每条评论有单独的行,这样的事情会起作用:

<cfset current_id = "">
<cfloop query = "my_query">
    <cfset next_id = user_id>
    <!--- or whatever else forms the primary key --->
    <cfif next_id neq current_id>
        <cfset current_id = next_id>
        <cfset SpreadsheetAddRow(my_spreadsheet, "#first_name#,#last_name#,etc, #comment#">
    <cfelse>
        <cfset SpreadsheetAddRow(my_spreadsheet, ",,#comment#">
    </cfif>
</cfloop>

这是基于提供的信息。如果你有一个唯一的 ID,组属性会更好。

【讨论】:

  • 我希望在 excel 电子表格的一个单元格中列出关注点...所以在上面的示例中,Joe 将在 excel 电子表格中有一行,但如果 Joe 有多个关注点,它们将像关注1、关注2、关注3一样在一个单元格中列出
  • 查看 cfqueryparam 的回答以了解 listAppend 的使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 2022-01-09
  • 2017-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多