2016-01-22 2 views
1

Я пытаюсь скопировать данные (около 70 * 25 * 15 ячеек) из txt-файла в таблицу либров с макросом. Сейчас им экранная клетку с этим кодом:Быстрые значения ввода соты LibreOffice Vba

Example: 
Dim CellValue As Object 

CellValue = ThisComponent.Sheets(1).getCellByPosition(i, j) 
CellValue.String = "Whatever data i get from txt" 

Выполнив выше код и, если текстовый файл уже (70 * 25 * 15) записи клеток, она должна 2min и 18 секунд, чтобы скопировать все данные из текстового файла в таблицу. Есть ли лучший способ ускорить работу и ускорить процесс?

+0

Вместо того, чтобы получать информацию о клетке на клеточной основе. Можете ли вы прочитать весь диапазон в массиве и затем обработать? Не 100% на LibreOffice, но это то, что я буду делать в MS Excel – 99moorem

+0

В этом проблема ... в excell это было бы очень быстро и просто, но мне нужно использовать офис libre для этой конкретной задачи, и это намного сложнее, чем нужно be .... –

+0

Попробуйте выполнить свой код после того, как вы вставляете строку ThisComponent.lockControllers перед любым действием и \t ThisComponent.unlockControllers после окончания всех назначений. – Epaminondas

ответ

2

Вы можете установить DataArray объекта, который реализует XCellRangeData, из массива массивов.

Пример:

Sub Test() 

    aDataArray = array(array("A1", "B1", "C1"), array("A2", 2.2, 2.3), array("A3", 3.2, 3.3)) 

    oDoc = ThisComponent 

    oSheet = oDoc.getSheets().getByIndex(1) 

    oRange = oSheet.getCellRangeByName("A1:C3") 

    'xray oRange 

    oRange.setDataArray(aDataArray) 

End Sub 

https://www.openoffice.org/api/docs/common/ref/com/sun/star/sheet/XCellRangeData.html#setDataArray

Edit:

Более сложный пример:

Sub Test() 

    lRowCount = 1800 
    lColCount = 40 

    dim aDataArray() as variant 
    dim aColumnArray() as variant 

    redim aDataArray(lRowCount-1) 'the main array is for rows; 0-based so count-1 

    for lRow = lbound(aDataArray) to ubound(aDataArray) 

    redim aColumnArray(lColCount-1) 'this array is for column data 

    for lCol = lbound(aColumnArray) to ubound(aColumnArray) 
    'create some sample data 
    select case lCol 
    case 1 
     aColumnArray(lCol) = CInt(int((10 * rnd()) + 1) 'integer in column 2 
    case 2 
     aColumnArray(lCol) = CDbl(1000 * rnd()) 'double in column 3, later formatted as currency  
    case 3 
     aColumnArray(lCol) = CDbl(date + int(365*rnd())) 'date in column 4, must be double in the array, will be later formatted as date 
    case 4 
     aColumnArray(lCol) = CInt(lRow mod 2 = 0) 'boolean in column 5, must be integer in the array, will be later formatted as booleann 
    case else 
     aColumnArray(lCol) = "r" & lRow & "c" & lCol 'all other columns string 
    end select 
    next 
    aDataArray(lRow) = aColumnArray 
    next 

    oDoc = ThisComponent 

    oSheet = oDoc.getSheets().getByIndex(0) 

    lStartRow = 1 
    lStartCol = 0 
    'make sure, the size of the range will exactly match the array size 
    oRange = oSheet.getCellRangeByPosition(lStartCol, lStartRow, lStartCol+lColCount-1, lStartRow+lRowCount-1) 

    oRange.setDataArray(aDataArray) 'now the data is in the sheet 

    'this code is for formatting 
    oLocale = new com.sun.star.lang.Locale 'create empty locale 

    oNumberFormats = thiscomponent.getNumberFormats() 'get NumberFormats from Calc 

    'format column 3 as currency 
    oRange = oSheet.getCellRangeByPosition(2, lStartRow, 2, lStartRow+lRowCount-1) 
    lCurrencyFormat = oNumberFormats.getStandardFormat(com.sun.star.util.NumberFormat.CURRENCY, oLocale) 
    oRange.NumberFormat = lCurrencyFormat 

    'format column 4 as date 
    oRange = oSheet.getCellRangeByPosition(3, lStartRow, 3, lStartRow+lRowCount-1) 
    lFormat = oNumberFormats.getStandardFormat(com.sun.star.util.NumberFormat.DATE, oLocale) 
    oRange.NumberFormat = lFormat 

    'format column 5 as boolean 
    oRange = oSheet.getCellRangeByPosition(4, lStartRow, 4, lStartRow+lRowCount-1) 
    lFormat = oNumberFormats.getStandardFormat(com.sun.star.util.NumberFormat.LOGICAL, oLocale) 
    oRange.NumberFormat = lFormat 

End Sub 
+0

эй! Спасибо за помощь, но я действительно не понимаю, что ваше решение ... вы бы сделали массив объектов, а затем просто записывали в ячейки? как бы вы справились с конкретной ячейкой? –

+0

В моем примере записывается массив массивов с 9 элементами в диапазон «A1: C3» (9 ячеек) второго листа активного документа Calc. Он делает это за один шаг, который быстрее, чем делает его ячейкой по ячейке. –

+0

Оххх ... я тотально не понял. Я получаю это сейчас .... попробую его и отчитаюсь :) –

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