Separar texto y enlaces de un hipervínculo en OpenOffice

Separar texto y enlaces de un hipervínculo en OpenOffice

Tengo una lista de marcadores que se convierte en una hoja de cálculo de OpenOffice. Ahora quiero separar la URL del enlace (en azul a continuación) y su texto (en negro) por separado en dos columnas.

imagen

¿Existe algún método para lograr esto?

Respuesta1

La clave es utilizar la funcionalidad Importar texto en OpenOffice.org Calc.

Sin tener una copia de sus marcadores para ver el formato preciso utilizado, le proporcionaré instrucciones generales que quizás necesite modificar para ajustarse a su formato específico.

La forma más sencilla de realizar esta acción es abrir su lista de marcadores en un editor de texto y copiar el archivo completo al portapapeles.

Ahora cree una nueva hoja de cálculo en OpenOffice.org Calc.

En OpenOffice.org, presioneCtrl+Mayús+Vpara realizar unPegado especialacción. Después de especificar que desea importar el portapapeles como texto sin formato, se le presentará el cuadro de diálogo Importar texto:

Cuadro de diálogo Importar texto

En ese cuadro de diálogo, seleccione elSeparado porboton de radio. Dependiendo del formato exacto de los datos de origen, ajuste las casillas de verificación a continuaciónSeparado porpara separar correctamente la URL del enlace del texto. Si tiene algún desafío, puede ingresar diferentes caracteres en el campo de texto a la derecha delOtrocaja. Introducir una barra diagonal (/) en ese campo de texto encontrará todas las URL que comiencen conhttp://yhttps://y ponerlos en su propia columna.

Respuesta2

Como parece que falta una función directa para extraer elHipervínculodel texto, puede ser una solución rápida utilizar unmacroeso simplemente existe. Al final de la respuesta encontrará el código que define una función CELL_URL(SheetNumber,Row,Column)capaz de devolver el valor del hipervínculo. Después de eso, agregará esa macro y podrá usar la función CELL_URL(debajo de las instrucciones).

Solución simple.Siguiendo el ejemplo de tu imagen, en la celda B90puedes escribir =CELL_URL(1,ROW(A90),1). Esto escribirá en B90el enlace de la celda A90, de lo contrario no escribirá nada. En la celda C90puedes simplemente escribir =A90para tener solo el texto (sinHipervínculo). Entonces divides el texto yHipervínculo. Después, puede copiar estas celdas ( B90y C90) y pegarlas en todas sus columnas By C, o en todas las filas que necesite.
Tenga en cuenta que la Acolumna está fija en su ejemplo y para esto escribí =CELL_URL(...,1). Puede especificar un número diferente de columna si lo necesita, o puede llamar a esta función desde otrohoja.

Solución extendida.Dado que no estaba claro (para mí) si desea simplemente dividir el texto y el hipervínculo de las celdas pares (2,4,6...), o si desea aumentar las celdas impares (3,5,... ) contenidos próximos a los pares, te propongo el siguiente esquema que te dará en la Bcolumna el texto, en la Cdirección y en la Durl. Se completará una línea en la columna By Cla Dotra estará vacía. (Después de poder copiar y pegar el valor en otrohojay reordenar para omitir las líneas vacías, o puede agregar una ecuación más compleja como parámetro de la función directamente en otrohoja).

Supongo que estás trabajando el 1hojadecálculo, y el texto está en la columna Aque comienza en la fila 2, por lo que A2existe el primer caso. Si nocambiar los númerosde A2, por ejemplo a A20, de A3 a A21, de B2 a B20...

  • En la celda B2escribe =IF(D2="","",A2).
  • En la celda C2escribe=IF(D2="","",A3)
  • En la celda D2escribe=CELL_URL(1,ROW(A2),1)

Copia las tres celdas y pégalas donde necesites.
La lógica es: si puede extraer el enlace ( Destá lleno) escribe las otras columnas ( By C).

Cómo agregar la macro

Vaya a Tools->Macro->Organize Macros->Open/Libre Office Basicdesde la hoja en la que está trabajando, cree unnuevoMacro. Ponle un nombre que te guste. Verás que se abre una nueva ventana. Copia y pega el código.


la 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

Referencias:

Trabajando enlibreoficinaVersión: 4.2.8.2.

Respuesta3

No soy usuario de OpenOffice calc, pero en vista de las otras respuestas complicadas, intentaré dar una solución más sencilla (que incluso podría funcionar).

Si entendí correctamente, actualmente tiene una hoja de cálculo de una columna donde A1, A3, A5, etc. contienen texto con enlaces, y donde A2, A4, A6, etc. contienen texto simple.

Le gustaría construir una nueva hoja de cálculo como esta:

A1 , A2  
A3 , A4  
A5 , A6  
etc.

Mi idea es agregar una columna B1 con la fórmula =MOD(ROW();2), que propagas a toda la columna B. Esto te dará:

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

Ahora ordene (o filtre si la ordenación no funciona según sea necesario) por la columna B para agregar todas las columnas:

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

Ahora puede copiar y pegar la columna A donde B=1 en una nueva hoja de cálculo en la columna A, luego copiar y pegar en la nueva hoja de cálculo en la columna B la columna A de la hoja de cálculo anterior donde B=0.

Esto debería dar el resultado deseado (espero).

información relacionada