2013-05-02 58 views
1

我給我的客戶端模板,他們應該填充,然後他們上傳電子表格,我讀cfspreadsheet的文件,以便將數據複製到數據庫表。ColdFusion 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> 
+0

你能告訴我們你的'cfspreadsheet'代碼嗎?我相信它應該默認忽略空單元格,否則每次都會讀取整個空白電子表格。你確定這些單元格是空白的並且沒有填充一些「隱形」字符。當您選擇空白行和列然後刪除時,它是否按預期工作? – 2013-05-02 15:37:46

+0

聽起來像你的xls(x)有單元組合並居中,它將ing_cas放入col_3。嘗試使用A1中的ing_cas和A2中的數據重新生成模板並上傳新的電子表格。 – Travis 2013-05-02 15:39:45

+0

您是否嘗試過將「髒」電子表格中的值複製到新文件中,保存併發布?我遇到了一個問題,即客戶在查看範圍外出現了一些奇怪的字符,並且炸燬了電子表格。 – steve 2013-05-02 15:39:50

回答

1

cfspreadsheet只是省略了是完全空白單元格:沒有價值或格式(當您選擇一個單元格,使用「全部清除」,如)。如果它正在拾取「額外」列,那是因爲該列中的一個或多個單元格具有值或自定義單元格格式。這意味着他們並不是真的「空白」。

如果您知道列位置,則可以使用columns屬性僅對只讀只讀取該列中的值。例如,讀取列C

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

但我不知道我理解爲什麼這是一個問題。如果您只需要一列,只需忽略代碼中的其他列即可。你能詳細說明爲什麼這會導致問題嗎?

+0

我的直接解決方法是忽略所有內容,但只有我需要的一列。但是,當管理員用戶執行相同的功能並且我們允許擁有多個列時,問題就會恢復。 所有這些數據都被存儲在一個垂直表格中,所以我們基本上會把它們放在電子表格中的任何列標題。 是的,我同意我知道清除所有實際清理電子表格,但不幸的是,我們的用戶不是技術精明,並試圖向他們解釋這個過程並不是世界上最簡單的事情。 – 2013-05-02 15:55:10

+0

如果您擁有不同級別的用戶訪問權限,我假設有涉及的登錄/會話。您應該能夠使用會話變量來應用不同的規則,具體取決於用戶是否具有「管理員」權限。 RE:*不幸的是,我們的用戶並不是那些精通技術的人*是的,我並不是建議您讓用戶清除細胞。我只是舉了一個「空白」單元格在Excel中表示的例子。 – Leigh 2013-05-02 16:22:48

+0

是的,這是我如何確定我是否允許您有多個列...會話範圍內的角色和權限。但是管理員用戶現在正在上傳空白欄。看到我上面的評論...這個數據被存儲在一個垂直表,無論列頭cfspreadsheet找到插入到垂直表,因此COL_1,COL_2 COL_3 .... – 2013-05-02 16:30:08

0

如果你知道你要在任何時候讀取,你可以使用該行:

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

上面的代碼通過5.讀取列1也可以使用Leigh的解決方案讀取第一個3列或你可以做一些像columns=1,3,6(如果我沒有記錯的話)從定製範圍中讀取

columns部分只讀你希望它不需要跳轉的列。我用它來讀取來自我們客戶的文件,通常我會得到一些由於其格式而不是「空白」的列。

您還可以查看cffreadsheet的cf文檔,以查看'column'選項支持的其他條目。

+0

我可能是錯的,但我得到的印象行數和列位置可能會有所不同。如果是這樣的話,那麼'列'和'行'都會出來,因爲它顯然需要提前知道範圍。如果「允許」頭名稱存儲在數據庫表中,那麼使用「列」可能是一種可能性。但是,如果沒有什麼是固定的,那麼他們目前的解決方案可能會達到最佳狀態 – Leigh 2013-05-06 17:52:16