У меня есть список закладок, который преобразуется в электронную таблицу OpenOffice. Теперь я хочу разделить URL ссылки (синим цветом ниже) и ее текст (черным цветом) на две колонки.
Есть ли способ достичь этого?
У меня есть список закладок, который преобразуется в электронную таблицу OpenOffice. Теперь я хочу разделить URL ссылки (синим цветом ниже) и ее текст (черным цветом) на две колонки.
Есть ли способ достичь этого?
Ключ заключается в использовании функции импорта текста в OpenOffice.org Calc.
Не имея копии ваших закладок, чтобы увидеть точное используемое форматирование, я предоставлю общие инструкции, которые вам, возможно, придется настроить, чтобы соответствовать вашему конкретному форматированию.
Самый простой способ выполнить это действие - открыть список закладок в текстовом редакторе и скопировать весь файл в буфер обмена.
Теперь создайте новую электронную таблицу в OpenOffice.org Calc.
В OpenOffice.org нажмите Ctrl+Shift+V, чтобы выполнить специальное действие Вставить . После указания того, что вы хотите импортировать буфер обмена как неформатированный текст, вы увидите диалоговое окно «Импорт текста»:
В этом диалоговом окне установите переключатель « Разделено на ». В зависимости от точного форматирования исходных данных, установите флажки ниже , отделенный правильно отделить ссылку URL из текста. Если у вас есть какие-либо проблемы, вы можете ввести разные символы в текстовое поле справа от флажка Другое . Если вы введете косую черту (/) в это текстовое поле, то найдете все URL-адреса, начинающиеся с http:// и https://, и поместите их в собственный столбец.
Поскольку кажется, что отсутствует прямая функция для извлечения гиперссылки из текста, может быть быстрым решением использовать макрос, который только что существует. В нижней части ответа вы найдете код, который определяет функцию CELL_URL(SheetNumber,Row,Column)
способную возвращать значение гиперссылки. После этого вы добавите этот макрос и сможете использовать функцию CELL_URL
(ниже инструкции).
Простое решение Следуя примеру вашей картинки, в ячейке B90
вы можете написать =CELL_URL(1,ROW(A90),1)
. Это напишет в B90
ссылку на ячейку A90
, иначе ничего не напишет. В ячейке C90
вы можете просто написать =A90
чтобы иметь только текст (без гиперссылки). Таким образом, вы разделяете текст и гиперссылку . После того, как вы сможете скопировать эти ячейки (B90
и C90
) и вставить их во все столбцы B
и C
или во все нужные вам строки.
Обратите внимание, что столбец A
исправлен в вашем примере, и для этого я написал =CELL_URL(...,1)
. При необходимости вы можете указать другой номер столбца или вызвать эту функцию с другого листа .
Расширенное решение. Поскольку было неясно (для меня), хотите ли вы просто разделить текст и гиперссылку на четные ячейки (2,4,6 ...), или если вы хотите вместо этого поднять нечетные ячейки (3,5, ...) ) содержимое близко к четным, я предлагаю следующую схему, которая даст вам в столбце B
текст, в C
адрес и в D
адрес URL. Одна строка будет заполнена в столбцах B
, C
и D
, другая будет пустой. (После того, как вы сможете скопировать, вставьте значение на другом листе и измените порядок, чтобы пропустить пустые строки, или вы можете добавить более сложное уравнение в качестве параметра функции непосредственно на другом листе ).
Я предполагаю, что вы работаете над первым листом calc, и текст находится в столбце A
начиная со строки 2, так что в A2
есть первый случай. Если не сдвинуть числа с А2, например на А20, с А3 на А21, с В2 на В20 ...
B2
напишите =IF(D2="","",A2)
. C2
напишите =IF(D2="","",A3)
D2
напишите =CELL_URL(1,ROW(A2),1)
Скопируйте три ячейки и вставьте туда, где вам нужно.
Логика такова: если он может извлечь ссылку (D
заполнен), он записывает другие столбцы (B
и C
).
Как добавить макрос
Перейдите в
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
Рекомендации:
Работа над Libreoffice Версия: 4.2.8.2.
Я не пользователь 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.
Теперь вы можете скопировать и вставить столбец A, где B = 1, в новую электронную таблицу в столбце A, а затем скопировать и вставить в новую электронную таблицу в столбце B столбец A из старой электронной таблицы, где B = 0.
Это должно дать желаемый результат (я надеюсь).