更快的单元格输入值 LibreOffice Vba
Posted
技术标签:
【中文标题】更快的单元格输入值 LibreOffice Vba【英文标题】:Faster Cell input values LibreOffice Vba 【发布时间】:2016-01-22 09:33:52 【问题描述】:我正在尝试使用宏将 txt 文件中的数据(cca.70*25*15 单元格)复制到 libre office 电子表格中。现在我正在使用此代码访问单元格:
Example:
Dim CellValue As Object
CellValue = ThisComponent.Sheets(1).getCellByPosition(i, j)
CellValue.String = "Whatever data i get from txt"
通过运行上述代码,如果文本文件有 (70*25*15) 个单元格条目,则需要 2 分 18 秒将所有数据从文本文件复制到电子表格。有没有更好的方法来访问细胞并加快进程?
【问题讨论】:
而不是逐个单元格地获取信息。你能把整个范围读入一个数组然后处理吗?在 LibreOffice 上不是 100%,但在 MS Excel 中我会这样做 这就是问题所在......在 Excel 中这将非常快速和简单,但我需要使用 libre office 来完成这项特定任务,而且它比应该的要复杂得多......跨度> 在任何操作前插入 ThisComponent.lockControllers 行,在所有分配结束后插入 ThisComponent.unlockControllers 行后尝试执行代码。 【参考方案1】:您可以将实现XCellRangeData
的对象的DataArray
设置为数组数组。
例子:
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
编辑:
更复杂的例子:
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
【讨论】:
嘿!感谢您的帮助,但我真的不明白您的解决方案是什么....您会制作一组对象,然后只写入单元格?您将如何访问特定单元格? 我的示例将一个包含 9 个元素的数组写入活动计算文档第二张表的范围A1:C3
(9 个单元格)中。它一步一步完成,比一个单元一个单元更快。
哦……我完全误解了。我现在明白了....会尝试并报告:)
我创建了一个数组“Dim aDataArray(40,1800) As String”,因为这是所需的最大大小,我什至通过将值一一打印到单元格中来测试该数组......它花了5 分钟,但是当我尝试以您的方式运行它时它包含所有数据,它会抛出异常 com.star.una.Exception 并带有 meassage : 。 *(仅点)
这里我们必须使用数组数组,而不是二维数组。 Dim aDataArray(40,1800) As String
应该是什么? 40行1800列?这个数组将在Excel
。以上是关于更快的单元格输入值 LibreOffice Vba的主要内容,如果未能解决你的问题,请参考以下文章
如何将单元格而不是单元格的值传递给 LibreOffice 函数?