Separando texto e links de um hiperlink no OpenOffice

Separando texto e links de um hiperlink no OpenOffice

Eu tenho uma lista de favoritos que é convertida em uma planilha do OpenOffice. Agora quero separar o URL do link (em azul abaixo) e seu texto (em preto) separadamente em duas colunas.

imagem

Existe algum método para conseguir isso?

Responder1

A chave é usar a funcionalidade de importação de texto no OpenOffice.org Calc.

Sem ter uma cópia dos seus favoritos para ver a formatação precisa usada, fornecerei instruções gerais que você pode precisar ajustar para se adequar à sua formatação específica.

A maneira mais fácil de realizar esta ação é abrir sua lista de favoritos em um editor de texto e copiar o arquivo inteiro para a área de transferência.

Agora crie uma nova planilha no OpenOffice.org Calc.

No OpenOffice.org, pressioneCtrl+Shift+Vpara realizar umColar especialAção. Depois de especificar que deseja importar a área de transferência como texto não formatado, será apresentada a caixa de diálogo Importação de texto:

Caixa de diálogo Importar texto

Nessa caixa de diálogo, selecione oSeparado porbotao de radio. Dependendo da formatação exata dos dados de origem, ajuste as caixas de seleção abaixoSeparado porpara separar adequadamente o URL do link do texto. Se você tiver algum desafio, poderá inserir caracteres diferentes no campo de texto à direita doOutrocaixa de seleção. Inserindo uma barra (/) nesse campo de texto encontrará todos os URLs que começam comhttp://ehttps://e coloque-os em sua própria coluna.

Responder2

Como parece que falta uma função direta para extrair ohiperlinkdo texto, pode ser uma solução rápida usar ummacroisso simplesmente existe. No final da resposta você encontrará o código que define uma função CELL_URL(SheetNumber,Row,Column)capaz de retornar o valor do hiperlink. Depois disso você adicionará aquela macro e poderá usar a função CELL_URL(abaixo das instruções).

Solução simples.Seguindo o exemplo da sua foto, na célula B90você pode escrever =CELL_URL(1,ROW(A90),1). Isso vai escrever no B90link da célula A90, senão não vai escrever nada. Na célula C90você pode simplesmente escrever =A90para ter apenas o texto (semhiperlink). Então você divide o texto ehiperlink. Depois você pode copiar essas células ( B90e C90) e colar em todas as suas colunas Be C, ou em todas as linhas que você precisa.
Observe que a Acoluna está fixa no seu exemplo e para isso escrevi =CELL_URL(...,1). Você pode especificar um número diferente da coluna, se necessário, ou pode chamar esta função de outrofolha.

Solução estendida.Como não estava claro (para mim) se você deseja simplesmente dividir o texto e o hiperlink das células pares (2,4,6...), ou se deseja aumentar as células ímpares (3,5,... ) conteúdos próximos dos pares, proponho o seguinte esquema que lhe dará na Bcoluna o texto, na o Cendereço e naquela Da url. Uma linha será preenchida na coluna e Buma estará vazia. (Depois de copiar, cole o valor em outroCDfolhae reordene para pular as linhas vazias, ou você pode adicionar uma equação mais complexa como parâmetro da função diretamente em outrofolha).

Presumo que você esteja trabalhando no primeirofolhadecálculo, e o texto está na coluna Acomeçando na linha 2 para que aí A2esteja o primeiro caso. Se nãomudar os númerosde A2, por exemplo para A20, de A3 para A21, de B2 para B20...

  • Na célula B2escreva =IF(D2="","",A2).
  • Na célula C2escreva=IF(D2="","",A3)
  • Na célula D2escreva=CELL_URL(1,ROW(A2),1)

Copie as três células e cole onde precisar.
A lógica é: se conseguir extrair o link ( Destá preenchido) ele escreve as demais colunas ( Be C).

Como adicionar a macro

Vá para Tools->Macro->Organize Macros->Open/Libre Office Basica planilha em que você está trabalhando, crie umnovoMacro. Dê um nome que você goste. Você verá uma nova janela se abrindo. Copie e cole o código.


A macro

REM  *****  BASIC  *****
REM ################### RETURNING STRING #################################################
Function CELL_NOTE(vSheet,lRowIndex&,iColIndex%)
'calls: getSheetCell
REM returns annotation text
Dim v
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      CELL_NOTE = v.Annotation.getText.getString
   else
      CELL_NOTE = v
   endif
End Function
Function CELL_URL(vSheet,lRowIndex&,iColIndex%,optional n%)
'calls: getSheetCell
REM returns URL of Nth text-hyperlink from a cell, default N=1)
Dim v
   If isMissing(n) then n= 1
   If n < 1 then
      CELL_URL = Null
      exit function
   endif
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      if v.Textfields.Count >= n  then 
         CELL_URL = v.getTextfields.getByIndex(n -1).URL 
      else
         Cell_URL = Null
      endif
   else
      CELL_URL = v
   endif
End Function
Function CELL_FORMULA(vSheet,lRowIndex&,iColIndex%)
'calls: getSheetCell
REM return unlocalized (English) formula
Dim v
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      CELL_FORMULA = v.getFormula()
   else
      CELL_FORMULA = v
   endif
End Function
Function CELL_STYLE(vSheet,lRowIndex&,iColIndex%,optional bLocalized)
'calls: getSheetCell
REM return name of cell-style, optionally localized
Dim v,s$,bLocal as Boolean
   if not isMissing(bLocalized) then bLocal=cBool(bLocalized)
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      if bLocal then
         s = thisComponent.StyleFamilies("CellStyles").getByName(v.CellStyle).DisplayName
      else
         s = v.CellStyle
      endif
      CELL_STYLE = s
   else
      CELL_STYLE = v
   endif
End Function
Function CELL_LINE(vSheet,lRowIndex&,iColIndex%,optional n)
'calls: getSheetCell
REM Split by line breaks, missing or zero line number returns whole string.
REM =CELL_LINE(SHEET(),1,1,2) -> second line of A1 in this sheet
Dim v,s$,a(),i%
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      s = v.getString
      if not isMissing(n) then i = cInt(n)
      if i > 0 then
         a() = Split(s,chr(10))
         If (i <= uBound(a())+1)then
            CELL_LINE = a(i -1)
         else
            CELL_LINE = NULL
         endif
      else
         CELL_LINE = s
      endif
   else
      CELL_LINE = v
   endif
end Function

REM ################### RETURNING NUMBER #################################################
Function CELL_ISHORIZONTALPAGEBREAK(vSheet,lRowIndex&,iColIndex%)
'calls: getSheetCell
Dim v
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      CELL_ISHORIZONTALPAGEBREAK = Abs(cINT(v.Rows.getByIndex(0).IsStartOfNewPage))
   else
      CELL_ISHORIZONTALPAGEBREAK = v
   endif
End Function
Function CELL_ISVERTICALPAGEBREAK(vSheet,lRowIndex&,iColIndex%)
'calls: getSheetCell
Dim v
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      CELL_ISVERTICALPAGEBREAK = Abs(cINT(v.Columns.getByIndex(0).IsStartOfNewPage))
   else
      CELL_ISVERTICALPAGEBREAK = v
   endif
End Function
Function CELL_CHARCOLOR(vSheet,lRowIndex&,iColIndex%)
'calls: getSheetCell
REM returns color code as number
Dim v
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      CELL_CHARCOLOR = v.CharColor
   else
      CELL_CHARCOLOR = v
   endif
End Function
Function CELL_BACKCOLOR(vSheet,lRowIndex&,iColIndex%)
'calls: getSheetCell
REM returns color code as number
Dim v
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      CELL_BACKCOLOR = v.CellBackColor
   else
      CELL_BACKCOLOR = v
   endif
End Function
Function CELL_VISIBLE(vSheet,lRowIndex&,iColIndex%)
'calls: getSheetCell
REM returns visibility state as number 0|1
Dim v
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      CELL_VISIBLE = Abs(v.Rows.isVisible)
   else
      CELL_VISIBLE = v
   endif
End Function
Function CELL_LOCKED(vSheet,lRowIndex&,iColIndex%)
'calls: getSheetCell
REM returns locked state as number 0|1
Dim v
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      CELL_LOCKED = Abs(v.CellProtection.isLocked)
   else
      CELL_LOCKED = v
   endif
End Function
Function CELL_NumberFormat(vSheet,lRowIndex&,iColIndex%)
'calls: getSheetCell
REM returns the number format index
Dim v
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      CELL_NumberFormat = v.NumberFormat
   else
      CELL_NumberFormat = v
   endif
End Function
Function CELL_NumberFormatType(vSheet,lRowIndex&,iColIndex%)
'calls: getSheetCell
REM return a numeric com.sun.star.util.NumberFormat which describes a format category
Dim v,lNF&
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      lNF = v.NumberFormat
      CELL_NumberFormatType = ThisComponent.getNumberFormats.getByKey(lNF).Type
   else
      CELL_NumberFormatType = v
   endif
End Function

'################### HELPERS FOR ABOVE CELL FUNCTIONS #########################################
Function getSheet(byVal vSheet)
REM Helper for sheet functions. Get cell from sheet's name or position; cell's row-position; cell's col-position
on error goto exitErr
   select case varType(vSheet)
   case is = 8
      if thisComponent.sheets.hasbyName(vSheet) then
         getSheet = thisComponent.sheets.getByName(vSheet)
      else
         getSheet = NULL
      endif
   case 2 to 5
      vSheet = cInt(vSheet)
      'Wow! Calc has sheets with no name at index < 0,
      ' so NOT isNull(oSheet), if vSheet <= lbound(sheets) = CRASH!
      'http://www.openoffice.org/issues/show_bug.cgi?id=58796
      if(vSheet <= thisComponent.getSheets.getCount)AND(vSheet > 0) then
         getSheet = thisComponent.sheets.getByIndex(vSheet -1)
      else
         getSheet = NULL
      endif
   end select
exit function
exitErr:
getSheet = NULL
End Function

Function getSheetCell(byVal vSheet,byVal lRowIndex&,byVal iColIndex%)
dim oSheet
'   print vartype(vsheet)
   oSheet = getSheet(vSheet)
   if varType(oSheet) <>9 then
      getSheetCell = NULL
   elseif (lRowIndex > oSheet.rows.count)OR(lRowIndex < 1) then
      getSheetCell = NULL
   elseif (iColIndex > oSheet.columns.count)OR(iColIndex < 1) then
      getSheetCell = NULL
   else
      getSheetCell = oSheet.getCellByPosition(iColIndex -1,lRowIndex -1)
   endif
End Function

Referências:

Trabalhando emLibreofficeVersão: 4.2.8.2.

Responder3

Não sou usuário do OpenOffice calc, mas tendo em vista as outras respostas complicadas, tentarei dar uma solução mais simples (que pode até funcionar).

Se bem entendi, atualmente você tem uma planilha de uma coluna onde A1, A3, A5 etc. contêm texto com links e onde A2, A4, A6 etc.

Você gostaria de construir uma nova planilha como esta:

A1 , A2  
A3 , A4  
A5 , A6  
etc.

Minha ideia é adicionar uma coluna B1 com a fórmula =MOD(ROW();2), que você propaga para toda a coluna B. Isso lhe dará:

A1 , 1
A2 , 0
A3 , 1
A4 , 0
etc.

Agora classifique (ou filtre se a classificação não funcionar conforme necessário) pela coluna B para agregar todas as colunas:

A1 , 1
A3 , 1
etc.
A2 , 0
A4 , 0
etc.

Agora você pode copiar e colar a coluna A onde B=1 em uma nova planilha na coluna A e, em seguida, copiar e colar na nova planilha na coluna B a coluna A da planilha antiga onde B=0.

Isso deve dar o resultado desejado (espero).

informação relacionada