Чтение листа Excel (93-97) с более чем 65536 строками с использованием cfspreadsheet

Привет мне приходится иметь дело с данными, которые являются более 65536 строк. и, следовательно, он входит в 2 разных листа Excel, которые называются "Детали" и "Детали_1".

В основном происходит загрузка листов Excel и использование "cfspreadsheet" для "чтения" этих данных. После прочтения это вставляется в таблицу SQL.

Я использую компонент-функцию, чтобы прочитать эти 1/2 листа. Идея в том, что cfif Query recordcount () из "cfspreadsheet" более 65533, а затем прочитайте второй лист. Затем используйте QoQ и UNION ALL для создания комбинированного запроса (в большинстве случаев это всего 1 лист, но в некоторых случаях это более 2 листов).

В течение некоторого времени все работало нормально. затем вдруг он перестал работать. Я не уверен, что неправильно / ошибка проникла в него, что вызывает его остановку. ниже мой код

<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.

б) Я поместил обработку ошибок, чтобы поймать конкретные ошибки, такие как "База данных"

c) Когда я уменьшаю количество строк ниже 65536 или удаляю Лист с большим числом строк, это работает.

Как я уже говорил ранее, это был код, который работал и внезапно оборвался. **

1 ответ

Возможно, проблема связана с размером кучи JVM? Вы можете попытаться увеличить максимальный размер кучи, если ваша среда справится с этим.

Другие вопросы по тегам