ColdFusion CFSpreadsheet读取空单元格

时间:2013-05-02 15:24:13

标签: excel coldfusion coldfusion-10 cfspreadsheet

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

非常简单。模板中只有一列。客户端无法上载包含多个列的工作表。这曾经有用。

因此,一列标题为ING_CAS,但当我使用cfspreadsheet读取文件时,我得到COL_2COL_3ING_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>

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分: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文档,了解“列”选项支持的其他条目。