1

我给我的客户一个他们应该填充的模板,然后他们上传电子表格,我读取文件cfspreadsheet以便将数据复制到数据库表中。

挺容易。模板中只有一列。客户不能上传包含多于一列的工作表。这曾经奏效。

所以一列标题是ING_CAS,但是当我读入文件时,cfspreadsheet我得到COL_2, COL_3, ING_CAS. 因此,不仅空白单元格被读取,而且由于这个属性,它们也被赋予了默认名称headerrow="1"

我在这里不知所措。我一直在下载模板并选择无关的空白行和列并删除它们,但是一旦客户得到它,我就无法控制该文件。

我是否缺少一些奇怪的设置会cfspreadsheet忽略空白单元格?

<cfspreadsheet action="read" src="#theFile#" query="SpreadSheetData" headerrow="1">
<cfdump var="#SpreadSheetData#" />

我最终编写了一个辅助函数来去除 COL_(n) 列。

<cffunction name="CleanExcelQuery" access="public" returntype="query" output="false" hint="Strips out blank column headers picked up on read.">
    <cfargument name="SpreadSheetQuery" type="query" required="true" />

    <cfset var theColumnHeaders = SpreadSheetQuery.columnList>
    <cfset var theNewColumnHeaders = "">

    <cfloop list="#theColumnHeaders#" index="h">
        <cfif uCase(left(h,  4)) IS NOT "COL_">
            <cfset theNewColumnHeaders = ListAppend( theNewColumnHeaders,  h )>
        </cfif>
    </cfloop>

    <cfquery name="newSpreadSheetQuery" dbtype="query">
        Select #theNewColumnHeaders#
        From SpreadSheetQuery
    </cfquery>

    <cfreturn newSpreadSheetQuery />
</cffunction>
4

2 回答 2

1

cfspreadsheet仅省略完全空白的单元格:没有值或格式(例如当您选择一个单元格并使用“全部清除”时)。如果它拾取“额外”列,那是因为该列中的一个或多个单元格具有值或自定义单元格格式。这意味着它们并不是真正的“空白”。

如果您知道列位置,则可以使用该columns属性读取该列中的值。例如,要读取列C

   <cfspreadsheet action="read"
            src="c:/path/to/file.xls"
            columns="3"
            headerrow="1"
            query="qResult" />

但我不确定我理解为什么这是一个问题。如果您只需要一列,只需忽略代码中的其他列。您能否详细说明为什么这会导致问题?

于 2013-05-02T15:41:50.213 回答
0

如果您知道要始终读取哪些行,则可以使用以下命令:

<cfspreadsheet action="read" src="#path#" query="data" headerrow="1"  excludeHeaderRow = "true"   columns = "1-5"  >

上面的代码读取第 1 列到第 5 列。您还可以使用 Leigh 的解决方案来读取前 3 列,或者您可以执行类似columns=1,3,6(如果我没记错的话)从自定义范围读取

columns部分只读取您希望它读取的列而不跳动。我用它来读取来自我们客户的文件,通常我会得到一些不是“空白”的列,因为它们的格式。

您还可以查看 cfspreadsheet 的 Cf 文档,以查看“列”选项支持的其他条目。

于 2013-05-03T21:23:13.037 回答