Чтение листа 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? Вы можете попытаться увеличить максимальный размер кучи, если ваша среда справится с этим.