在 OpenOffice 中將文字和連結與超連結分開

在 OpenOffice 中將文字和連結與超連結分開

我有一個書籤列表,已轉換為 OpenOffice 電子表格。現在我想將連結 URL(下面的藍色)及其文字(黑色)分別分成兩列。

影像

有什麼方法可以實現這一點嗎?

答案1

關鍵是使用 OpenOffice.org Calc 中的文字匯入功能。

如果沒有書籤副本來查看所使用的精確格式,我將提供您可能需要調整以符合您的特定格式的一般說明。

執行此操作的最簡單方法是在文字編輯器中開啟書籤列表,然後將整個文件複製到剪貼簿。

現在在 OpenOffice.org Calc 中建立一個新的電子表格。

在 OpenOffice.org 中,按Ctrl+Shift+V執行一個特殊貼上行動。指定要將剪貼簿匯入為無格式文字後,您將看到「文字匯入」對話方塊:

文字導入對話框

在該對話框中,選擇分隔為單選按鈕。根據來源資料的具體格式,調整下面的複選框分隔為正確地將連結 URL 與文字分開。如果您有任何困難,您可以在右側的文字欄位中輸入不同的字符其他複選框。輸入正斜線 (/) 進入該文字欄位將找到所有以http://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。欄內填滿一行BC欄內D空一行。 (複製後,將值貼到另一個床單並重新排序以跳過空行,或者您可以直接在另一個函數中添加更複雜的方程式作為函數的參數床單)。

我假設你在一號工作床單計算,且文字位於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

參考:

致力於自由辦公室版本: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 列中的新電子表格。

這應該會給出期望的結果(我希望)。

相關內容