2013-08-15 2 views
0

안녕하세요 저는 65536 개가 넘는 행의 데이터를 처리해야합니다. 따라서 "세부 정보"및 "세부 사항 1"이라는 2 개의 다른 Excel 시트가 제공됩니다.cfspreadsheet를 사용하여 65536 개가 넘는 행이있는 Excel (93-97) 시트 읽기

기본적으로 Excel 시트를 업로드하고 "cfspreadsheet"를 사용하여이 데이터를 읽습니다. 일단 읽으면 SQL 테이블에 삽입됩니다.

저는이 1/2 시트를 읽는 데 component-function을 사용하고 있습니다. cfifreadsheet의 recordcount()가 65533 이상인 cfif가 두 번째 시트도 읽습니다. 그런 다음 QoQ 및 UNION ALL을 사용하여 결합 된 쿼리를 만듭니다 (대개의 경우 한 시트 만 있지만 경우에 따라 두 시트 이상입니다).

얼마 동안은 정상적으로 작동했습니다. 갑자기 그 일이 멈췄다. 내가 잘못했거나 오류가 생겨서 그걸 멈추게 만들었다 고 확신 할 수 없다. 다음은 내 코드는 다음 내가했을

<cftry> 
     <cfset fileEXCL = "#ExpandPath('../folder')#/#arguments.xclfile#" />     

     <!---when there e 2 Sheets --->  
     <!---get info from sheet1 as a "query1"--->   
     <cfspreadsheet action="read" src="#fileEXCL#" sheet="1" query="Query1" headerrow="1" /> 
     <!--- recordcount for "sheet1" as "count1"--->     
     <cfset count1 =#Query1.recordcount#> 
     <!--- case when excel has more than 65533 rows      
      ;THIS IMPLIES THAT THERE 2 SHEETS)---> 
     <cfif count1 gt 65533> 
     <!--- take info from sheet 2 as a "query2" and count as "count2"---> 
       <cfspreadsheet action="read" src="#fileEXCL#" sheet="2" query="Query2" headerrow="1" /> 

       <cfset count2 =#Query2.recordcount#> 
       <!---club both query's using QoQ and call it "excelQuery"---> 
       <cfquery dbtype="query" name="excelQuery"> 
        SELECT * FROM Query1 
        UNION ALL 
        SELECT * FROM Query2 
       </cfquery> 
       <!---total record count for "sheet1" & "sheet2"---> 
       <cfset rowCount =#excelQuery.recordcount#>    
     <cfelse>     
       <!---this case there is just 1 query "Query1" ;rename it "excelQuery"---> 
       <cfquery dbtype="query" name="excelQuery"> 
        SELECT * FROM Query1 
       </cfquery> 
       <!--- recordcount for "sheet1"---> 
       <cfset rowCount =#excelQuery.recordcount#> 
     </cfif> 

     <cflog file="Collections" application="yes" text="#Session.user_info.uname# logged in. Data file #fileEXCL# read. Recordcount:#rowCount#" type="Information"> 

     <cfset ins =insertUserLog("#Session.user_name#","#Session.user_code#","file #fileEXCL# read. ","Recordcount:#rowCount#","")> 

    <cfcatch type="any" >   
     <cflog file="Collections" application="yes" text="Error in reading Data file #fileEXCL#." type="Error"> 
     <cfset ins =insertUserLog("#Session.user_name#","#Session.user_code#","error file","failed","#cfcatch.Message#")> 
     <cfreturn 1> 
    </cfcatch> 
</cftry> 

** 입니다 : - 가) 개별 쿼리의 Query1을 각 시트의 QUERY2 덤프 시도! 아직도 그 이상의 65536 개 행을 경우 IE의 페이지가 중단 시트를 모두 읽을 수 없습니다 1, 2

나는 그가 같은 "데이터베이스"

같은 특정 오류를 잡는 오류 처리 t에 놓여있다

B) c) 65536 미만의 행 수를 줄이거 나 많은 수의 행이있는 시트를 제거하면 작동합니다.

내가 이전에 말했던 것처럼 그것은 일하고 있었고, 갑자기 kaput를 참았다. **

+3

pls가 "중지됨"으로 정량화 할 수 있습니까? 그렇다면 오류가 있습니까? 잘못된 결과가 나옵니까? 분명히 아무 것도하지 않는 것입니까? 또한, 어떤 문제 해결을 수행 했습니까? 이것은 특정 질문을하는 것보다 "내 코드를 수정"하는 것 같아 보입니다. –

+0

코드 검토 (http://codereview.stackexchange.com/)에이 코드를 게시하면 몇 가지 관련되지 않은이 문제를 관찰 할 수 있습니다. –

+0

나는 acodrdingly 완료했습니다 – Fransis

답변

4

아마도이 문제는 JVM의 힙 크기와 관련이 있습니까? 환경에서 처리 할 수있는 최대 힙 크기를 늘려보십시오.