尽管任务简单而极简,但它打破了我的头脑。
有一个 XLS 文件,其中有一个包含 160000 多行不同数字的表格。
需要:
- 查找所有单元格为空的所有行;
- 在每条这样的线上方/下方画一条线;
- 删除整个空行。
事实证明,有必要从这样的文件:
制作这样的文档:
更新
问题自行解决了。感谢您的时间。没有什么比爱心人士的支持更能激发灵感了。
在编写宏时,使用了以下资源:
特别是 OpenOffice BASIC 指南的特定页面:
该解决方案标志着@JohnSUN同志的答案。
生成的宏代码:
REM ***** BASIC *****
Sub Main
Dim oDoc As Object
Dim oSheet As Object
Dim oCellRange As Object
Dim oCursor As Object
Dim lRowCnt As Long
Dim lColCnt As Long
Dim lRowCur As Long
Dim bEmptyRow As Boolean
Dim oBorder As Object
Dim BLine As New com.sun.star.table.BorderLine
' устанавливаем ширину рисуемой линии
BLine.OuterLineWidth = 60
' устанавливаем цвет рисуемой линии
BLine.Color = RGB(0, 0, 0)
' текущий документ
oDoc = ThisComponent
' активная страница
oSheet = oDoc.getCurrentController.activeSheet
' определяем количество колонок по первой строке
lColCnt = 0
While oSheet.getCellByPosition(lColCnt, 0).type <> com.sun.star.table.CellContentType.EMPTY
lColCnt = lColCnt + 1
Wend
' определяем количество строк
oCursor = oSheet.createCursor
oCursor.gotoEndOfUsedArea(True)
lRowCnt = Curs.Rows.Count
' устанавливаем текущую строку
lRowCur = 1
' основной цикл макроса
while lRowCur < lRowCnt
' проверяем пустая ли текущая строка
bEmptyRow = true
For cColCur = 0 to lColCnt-1
If oSheet.getCellByPosition(cColCur, lRowCur).Type <> com.sun.star.table.CellContentType.EMPTY Then bEmptyRow = false
Next cColCur
If bEmptyRow Then
' если найдена пустая строка
' выделяем строку выше
oCellRange = oSheet.getCellRangeByPosition(0, lRowCur-1, lColCnt-1, lRowCur-1)
' рисуем линию по нижнему бортику ячеек
oBorder = oCellRange.TableBorder
oBorder.BottomLine = BLine
oCellRange.TableBorder = oBorder
' удяляем одну строку
oSheet.rows.removeByIndex(lRowCur, 1)
' количество строк уменьшилось на одно после удаления
lRowCnt = lRowCnt - 1
Else
' если найдена не пустая строка
' инкремент индекса текущей строки
lRowCur = lRowCur + 1
End If
Wend
' дальнейшие строки кода выполняют не входившие в условия задачи действия,
' а именно рисуют внешнюю рамку
oCellRange = oSheet.getCellRangeByPosition(0, 0, lColCnt-1, lRowCnt-1)
oBorder = oCellRange.TableBorder
oBorder.BottomLine = BLine
oBorder.TopLine = BLine
oBorder.LeftLine = BLine
oBorder.RightLine = BLine
oCellRange.TableBorder = oBorder
End Sub


其实,“亲手做”这个想法也不错。如果您知道一些使用表格的技巧,那么它确实比编写宏要快。
例如,您可以使用此处的第四种方法
必须在要删除的行下划线有点棘手,但这可以通过过滤器轻松解决。
由于这个问题是关于宏的,所以代码可能是这样的: