Calc: Exibir a largura de várias colunas?

Existe alguma forma simples de exibir a largura de todas as colunas de um range ou uma seleção de colunas.

Preciso adaptar varios campos de um banco de dados em uma folha sulfite. Ai se eu soubesse o tamanho de todas as minhas colunas ficaria mais facil ir ajustando para ver o que eu consigo trazer de informações em uma única folha sulfite.

Você pode intentar com menu Arquivo - Visualizar impressão, ativando Margens.
imagen
LibreOffice 7.1.8.1 com Windows 7.

Infelizmente como sugerido acima não exibe o valor da coluna.

Estou usando uma macro em python, não é muito prático mas exibe o valor em cm das celulas selecionadas

def test(*args):
    import string

    doc = XSCRIPTCONTEXT.getDocument()
    mySheet = doc.CurrentController.getActiveSheet()

    oSelection = doc.getCurrentSelection()
    oArea = oSelection.getRangeAddress()
    first_col = oArea.StartColumn
    last_col = oArea.EndColumn

    lst_letters = list(string.ascii_uppercase)
    for i in range(first_col, last_col+1):
        tag = f'''{lst_letters[i]}:{lst_letters[i]}'''

        oCol = mySheet[tag].getColumns()

        col_w = oCol.Width
        value_cm = col_w/1000

        str_value = str(value_cm).replace('.', ',') #pt-br notation
        final = f'''{lst_letters[i]}\t{str_value}'''
        print(final)

resultado da macro acima quando seleciono da coluna A até M:

A 0,3
B 1,402
C 6,84
D 3,05
E 2,265
F 1,977
G 0,669
H 2,63
I 0,73
J 2,529
K 2,529
L 2,529
M 1,011

Limpe o intervalo de impressão, será mostrado um pontilhado, que identifica o tamanho da pagina, conforme tamanho selecionada na impressora. Pode-se guiar por esta informação na construção da planilha.

Caso não esteja visível, digite qualquer coisa em uma célula e vá menu Exibir / Quebra de página e volte para Normal.

Pergunta similar em inglês.

Quero compreender. Se precisar da largura total das colunas num intervalo, penso que uma macro é suficiente.

Para que precisa de uma fórmula?

Ola Mauricio @elmau , a necessidade não é minha, só imaginei, que se uma Função desse esta informação, não haveria a necessidade de acionar macro para saber os valores.

Vale…

Bem, uma função é uma macro, uma macro especial que retorna um valor, mas continua a ser uma macro.

Sim, mas ela é atualizada automaticamente, sem necessidade de aciona-la.

Outra forma simples de visualizar as medidas. Aqui elas são jogadas dentro do próprio intervalo o qual você deseja obter as medidas.
.
Vendo também o tópico em inglês que Leroy postou, basicamente fiz semelhante.
.

Sub ObterLarguraDasColunas()
	rem Obtem planilha ativa
	oSheet = ThisComponent.CurrentController.getActiveSheet()
	rem Obtem intervalo
	oRange = oSheet.getCellRangeByName("A1:F1")
	rem Obtem as colunas do intervalo
	oCol = oRange.Columns
	
	rem Obtem a largura de cada coluna do intervalo e insere na própria coluna(intervalo)
	For i = 0 To oCol.Count-1
		iColWidth = oCol.getByIndex(i).Width
		oRange.getCellByPosition(i, 0).String = iColWidth
	Next i
	
End Sub

Olá @FelipeAle, aproveitando a sua MACRO, poderia converter em uma FUNÇÃO, que dá a largura da célula, assim seria dinâmica, o que acha !!!

Tentei, mas não consegui …

1 Like

Me diz se seria algo parecido com isso?
.

Function MedirIntervalo()
rem Define variáveis
Dim oSelection As Object
Dim oCol As Object, oRow As Object
Dim iColWidth As Double, iRowHeight As Double
Dim i As Long, j As Long, K As Long
	
	rem Obtem intervalo selecionado do documento atual
	oSelection = ThisComponent.getCurrentSelection()
	
	rem Insere as medidas da célula no respectivo intervalo com base no tipo selecionado
	rem e na unidade de medida pt-br (centímetros)
	Select Case oSelection.getImplementationName()
		Case "ScCellObj"
			For i = 0 To oSelection.Columns.Count-1
				For j = 0 To oSelection.Rows.Count-1
					iColWidth = oSelection.Columns.getByIndex(i).Width
					iRowHeight = oSelection.Rows.getByIndex(j).Height
					oSelection.getCellByPosition(i, j).String = "Largura: " & iColWidth/1000 & "cm" & Chr$(10) & "Altura: " & iRowHeight/1000 & "cm"
				Next j
			Next i
		Case "ScCellRangeObj"
			For i = 0 To oSelection.Columns.Count-1
				For j = 0 To oSelection.Rows.Count-1
					iColWidth = oSelection.Columns.getByIndex(i).Width
					iRowHeight = oSelection.Rows.getByIndex(j).Height
					oSelection.getCellByPosition(i, j).String = "Largura: " & iColWidth/1000 & "cm" & Chr$(10) & "Altura: " & iRowHeight/1000 & "cm"
				Next j
			Next i
		Case "ScCellRangesObj"
			For k = 0 To oSelection.Count-1
				oCol = oSelection.getByIndex(k).Columns
				oRow = oSelection.getByIndex(k).Rows
				For i = 0 To oCol.Count-1
					For j = 0 To oRow.Count-1
						iColWidth = oCol.getByIndex(i).Width
						iRowHeight = oRow.getByIndex(j).Height
						oSelection.getByIndex(k).getCellByPosition(i, j).String = "Largura: " & iColWidth/1000 & "cm" & Chr$(10) & "Altura: " & iRowHeight/1000 & "cm"
					Next j
				Next i
			Next k
	End Select

End Function

.
AskFuncaoMedirCelula.ods (32,3,KB)

Quase, tinha imaginado algo como a função =AGORA(), ela se atualiza com F9.

Por exemplo, na célula ficaria digitado: =COLUMNWIDTH(), então qualquer calculo novo que eu faça, é atualizada a informação, não dependendo de acionar a Functon.


Visivelmente mostraria o valor da largura.

Entendi. Vou tentar fazer.
.
Ainda tenho um pouco de dificuldade em trabalhar com eventos de maneira automatizada.

Quase isso:

Function ColumnWidth()
	ColumnWidth = ThisComponent.getCurrentSelection().Columns.Width / 1000
End Function

Function RowsHeight()
	RowsHeight = ThisComponent.getCurrentSelection().Rows.Height / 1000
End Function

Só falta recalcular automático.


Alo @elmau , tem alguma dica ???

Confesso que está difícil encontrar o API adequado para fazer isso.
.
Li no livro do Andrew Pitoniak, mas não consegui fazer algo satisfatório.
.
Também o utilizei o gravador de macros e depois tentei vincular ao Evento da Planilha Fórmulas Calculadas, porém, também não consegui resultado.
.
Tentei usar o ModifyListener com exemplo do livro de Noelson Duarte, mas também não tive sucesso algum.
.
No fim, segui mais ou menos as orientações deste tópico para ficar mais simples aplicar as funções:

.
AskFuncaoMedirCelula.ods (14,5,KB)
.
Fiquei frustrado mas tentei. hahaha

1 Like

Botão de acionamento, com algum erro !!!

Python:

def main():
    doc = XSCRIPTCONTEXT.getDocument()
    selection = doc.CurrentSelection

    width = 0
    for col in selection.Columns:
        width += col.Width / 1000

    print(width)

    return

Basic

Sub Main
	selection = ThisComponent.CurrentSelection
	
	width = 0
	For Each col In selection.Columns
		width = width + col.width / 1000
	Next
	
	MsgBox width
	
End Sub
2 Likes