2016-05-23 4 views
0

Привет там коллег разработчиков,Progress 4GL - экспорт большой объем данных в Excel

Я пытаюсь экспортировать большое количество данных в Excel с помощью Progress 4GL. Мы говорим о ± 5500 записей и ± 170 столбцов. Проблема в том, что это слишком много для обработки Excel, и возникает следующая ошибка: Excel error. Я могу продолжить, и он экспортирует все данные, но процедура не является точно презентабельной с ошибкой прямо посередине.

Я использую следующий код, чтобы экспортировать все данные из разных файлов CSV в один файл Excel с отдельной таблицей для каждого файла CSV:

/* Initialize Excel file & add new workbook */ 
    CREATE "Excel.Application" vchExcel. 
    vchExcel:SheetsInNewWorkbook = NUM-ENTRIES(ipcSheets,','). 
    vchExcel:WorkBooks:ADD(). 
    ASSIGN vchWorkBook = vchExcel:WorkBooks:Item(1). 

    /* Import each file's data into a new sheet of the workbook */ 
    Sheet: 
    DO iTab = 1 TO NUM-ENTRIES(ipcFiles) ON ERROR UNDO, RETRY Sheet: 
     /* Import CSV data into Excel */ 
     ASSIGN cConnection  = SUBSTITUTE("TEXT;" + gvcExportPath + "csv_files\" + "&1",ENTRY(iTab,ipcFiles)) 
      vchWorkSheet  = vchExcel:Sheets:ITEM(iTab) 
      vchWorkSheet:NAME = ENTRY(iTab,ipcSheets) 
      lResult   = vchWorkSheet:QueryTables:ADD(cConnection,vchWorkSheet:cells(1,1)). 

     ASSIGN 
      vchQueryTable = vchWorkSheet:QueryTables(1) 
      vchQueryTable:FieldNames = TRUE 
      vchQueryTable:RowNumbers = FALSE 
      vchQueryTable:FillAdjacentFormulas = FALSE 
      vchQueryTable:PreserveFormatting = FALSE 
      vchQueryTable:RefreshOnFileOpen = FALSE 
      vchQueryTable:RefreshStyle = 1 
      vchQueryTable:SavePassword = FALSE 
      vchQueryTable:SaveData = TRUE 
      vchQueryTable:AdjustColumnWidth = TRUE 
      vchQueryTable:RefreshPeriod = 0 
      vchQueryTable:TextFilePromptOnRefresh = FALSE 
      vchQueryTable:TextFilePlatform = 437 
      vchQueryTable:TextFileStartRow = 1 
      vchQueryTable:TextFileParseType = 1 
      vchQueryTable:TextFileTextQualifier = 1 
      vchQueryTable:TextFileConsecutiveDelimiter = TRUE 
      vchQueryTable:TextFileTabDelimiter = TRUE 
      vchQueryTable:TextFileSemicolonDelimiter = TRUE 
      vchQueryTable:TextFileCommaDelimiter = FALSE 
      vchQueryTable:TextFileSpaceDelimiter = FALSE 
      vchQueryTable:TextFileTrailingMinusNumbers = TRUE 
      lResult = vchQueryTable:REFRESH 
      vchQueryTable:BackgroundQuery = FALSE. 


     /* Catch all errors */ 
     CATCH eAnyError AS Progress.Lang.ERROR: 
      RUN disp_mesg(INPUT SUBSTITUTE("ERROR! -> &1",eAnyError:GetMessage(1))). 
      RUN adnew_log(INPUT SUBSTITUTE("ERROR OCCURRED!")). 
      RUN adnew_log(INPUT SUBSTITUTE("=> &1: &2",eAnyError:GetMessageNum(1),eAnyError:GetMessage(1))). 
     END CATCH. 
    END. 

    /* Save & close */ 
    vchExcel:Visible = FALSE. 
    vchExcel:DisplayAlerts = FALSE. 
    vchWorkBook:SaveAs(gvcExportPath + ipcName + '.xlsx',,,,,,). 
    vchWorkBook:CLOSE(). 

    /* Release All Objects */ 
    RELEASE OBJECT vchQueryTable NO-ERROR. 
    RELEASE OBJECT vchWorkSheet NO-ERROR. 
    RELEASE OBJECT vchWorkBook NO-ERROR. 
    vchExcel:QUIT(). /* Quit Excel */ 
    RELEASE OBJECT vchExcel NO-ERROR. 

ли кто-нибудь из вас знает, как решить эту проблему и получить желаемый результат? Заранее спасибо!

+0

Длинный снимок, но вы создаете по крайней мере один новый ресурс (vchWorkSheet - возможно, также vchQueryTable) для каждой итерации, но только удаляете его один раз в самом конце процедуры. Возможно, это (или что-то еще) создает утечку памяти. Похоже, что ошибка связана только с потреблением памяти. Попробуйте запустить его и взглянуть на график памяти диспетчера задач одновременно. – Jensd

ответ

0

Зачем контролировать XL от прогресса?

Если XL является обязательным шагом ... Я бы предпочел сделать это так ... вызовите XL с макро-файлом, чтобы открыть CSV и сохранить в формате XL. Если это необходимо интегрировать в бизнес-процесс ... Я бы просто открыл XL с макро-файлом сразу после генерации CSV.

Смежные вопросы