我给我的客户端一个他们应该填充的模板,然后他们上传电子表格,我用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>
答案 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文档,了解“列”选项支持的其他条目。