在 OpenOffice 中将文本和链接与超链接分离

在 OpenOffice 中将文本和链接与超链接分离

我有一个书签列表,已将其转换为 OpenOffice 电子表格。现在我想将链接 URL(下图中蓝色部分)及其文本(黑色部分)分别分成两列。

图像

有什么方法可以实现这一点吗?

答案1

关键是使用 OpenOffice.org Calc 中的文本导入功能。

如果您没有书签副本来查看所使用的精确格式,我将提供一般说明,您可能需要进行调整以符合您的特定格式。

执行此操作的最简单方法是在文本编辑器中打开书签列表,然后将整个文件复制到剪贴板。

现在在 OpenOffice.org Calc 中创建一个新的电子表格。

在 OpenOffice.org 中,按Ctrl+Shift+V执行特殊粘贴操作。指定要将剪贴板导入为未格式化的文本后,您将看到“文本导入”对话框:

文本导入对话框

在该对话框中,选择分隔单选按钮。根据源数据的确切格式,调整下面的复选框分隔正确地将链接 URL 与文本分开。如果您遇到任何困难,可以在右侧的文本字段中输入不同的字符其他复选框。输入斜杠 (/)将查找以 开头的所有 URLhttp://https://并将它们放入各自的列中。

答案2

因为它似乎缺少一个直接提取超级链接从文本来看,使用就是存在的。在答案的底部,您将找到定义CELL_URL(SheetNumber,Row,Column)能够返回超链接值的函数的代码。之后,您将添加该宏,您将能够使用该函数CELL_URL(在说明下方)。

简单的解决方案。按照图片中的示例,B90您可以在单元格中写入=CELL_URL(1,ROW(A90),1)。这将写入B90单元格的链接A90,否则将不写入任何内容。C90您可以在单元格中简单地写入=A90仅包含文本(不包含超级链接)因此,您拆分文本并超级链接。之后,您可以复制这些单元格(B90C90)并粘贴到所有列BC,或您需要的所有行。
请注意,A示例中的列是固定的,为此我写了=CELL_URL(...,1)。您可以根据需要指定不同的列号,或者您可以从另一个调用此函数床单

扩展解决方案。由于我不清楚您是否只想拆分偶数单元格(2、4、6...)的文本和超链接,或者是否想将奇数单元格(3、5、...)的内容提升到接近偶数单元格的位置,我建议使用以下模式,该模式将在列中提供B文本,在列中提供C地址,在D列中提供 url。列中将填充一行BCD另一行将为空。(之后,您可以复制并粘贴另一行中的值床单并重新排序以跳过空行,或者您可以直接在另一个函数中添加更复杂的方程作为函数的参数床单)。

我假设你是在 1 号工作床单计算,并且文本位于A从第 2 行开始的列中,因此A2存在第一种情况。如果不是移位数字例如从 A2 到 A20,从 A3 到 A21,从 B2 到 B20……

  • 在单元格中B2写入=IF(D2="","",A2)
  • 在单元格中C2写入=IF(D2="","",A3)
  • 在单元格中D2写入=CELL_URL(1,ROW(A2),1)

复制这三个单元格并粘贴到您需要的位置。
逻辑是:如果它能够提取链接(D已填充),它将写入其他列(BC)。

如何添加宏

Tools->Macro->Organize Macros->Open/Libre Office Basic您正在处理的工作表中,创建一个新的宏。给它起一个你喜欢的名字。你会看到一个新窗口打开。复制粘贴代码。


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

参考:

  • 内省细胞功能,在 openoffice 论坛上。
  • 其他回答在 StackOverflow 上。
  • 更远阅读关于专家交流。
  • 更远灵感从 Ubuntu 论坛开始编写您自己的宏。

致力于自由办公室版本:4.2.8.2。

答案3

我不是 OpenOffice calc 的用户,但考虑到其他复杂的答案,我将尝试提供一个更简单的解决方案(甚至可能有效)。

如果我理解正确的话,您当前有一个单列电子表格,其中 A1、A3、A5 等包含带有链接的文本,而 A2、A4、A6 等包含简单文本。

您想要构建一个如下的新电子表格:

A1 , A2  
A3 , A4  
A5 , A6  
etc.

我的想法是添加一个带有公式的 B1 列=MOD(ROW();2),然后将其传播到整个 B 列。这将为您提供:

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

现在按 B 列进行排序(如果排序无法按需要进行,则进行过滤)以将所有列聚合在一起:

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

您现在可以将 B=1 的 A 列复制粘贴到 A 列的新电子表格中,然后将 B=0 的旧电子表格中的 A 列复制粘贴到 B 列的新电子表格中。

这应该会产生预期的结果(我希望)。

相关内容