Официальная возможность получить лицензионный софт бесплатно.
Giveaway of the Day
Это не реклама!

Щелкните для получения прогноза по Биробиджану


Показаны сообщения с ярлыком libre office. Показать все сообщения
Показаны сообщения с ярлыком libre office. Показать все сообщения

пятница, 27 октября 2023 г.

LibreOffice не показывает изображения в документах Word

Столкнулся со странностью. Перебирал архивы документов и был сильно удивлен, что вот это чудо 

вдруг перестало показывать внедренные картинки. Например: 


Лечится, оказывается, просто: в меню вид включаем пункт "Изображения и диаграммы". Почему он по дефолту выключен - непонятно


И всё, собственно:



среда, 18 сентября 2019 г.

OpenOffice/LibreOffice - как скопировать сводную таблицу

Попытался скопировать свод с одного листа на другой. Вставились только значения.
Попытался скопировать целиком лист - оформление сохранилось, но собственно свод исчез, остались значения.
Как быть, если не хочется заново подбирать параметры, но нужна та же таблица немного в другом разрезе?

На исходной таблице жмём "Изменить макет", там жмём "Еще" и выбираем новый лист в качестве места назначения:


пятница, 10 марта 2017 г.

WinWord и вставка названия главы в колонтитул

Вот уж не думал, что буду что-то писать про работу в MS Office, но пришлось.
Сочиняю сейчас памятку для пользователей и понадобилось для удобочитаемости в верхней части каждой страницы вставить название главы, которая есть на этой странице.
Погуглил...

Вот как это делается в Star/Open/Libre-office:

1. присвоить нужным заголовкам соответствующие стили
2. открыть колонтитул
3. Выберите команду Вставка – Поля – Дополнительно и перейдите на вкладку Документ.
NB! в вики по ссылке в русской версии ошибка - надо открывать вкладку "Документ", как на моем скриншоте, а не "Функции", как написано там. В английской версии той же вики всё правильно.
4. В списке Тип выберите пункт "Глава", а в списке Формат – пункт "Название и номер главы".
5. Нажмите кнопку Вставить, затем кнопку Закрыть.

Скриншот из Apache OpenOffice 4.1.3 под XUbuntu 16.04.2

А вот через какую жопу это делается в излишне популярном продукте.

Большинство советчиков предлагают вручную вставлять для каждой главы перекрестную ссылку на ее заголовок в каждый колонтитул. Что будет с этими ссылками, если страницы поедут или между двумя заголовками появится третий, советчиков не волнует.

На самом же деле всё намного проще, и вместе с тем сложнее.

1. Вставка - Поле
2. Категория: Связи и ссылки
3. Поле: StyleRef

Скриншот из MSO 2003 под W2K3/server, тема "классическая"

И в итоге, как только на очередной странице появляется новый абзац в указанном стиле, так автоматически меняется содержимое вставленного поля. Хоть в колонтитуле, хоть у чёрта в стуле. Но у опенсорсников сделано куда понятнее и логичнее - "вставить номер и (или) название главы".

пятница, 8 апреля 2016 г.

OpenOffice и курсоры MySQL

Не очень разработчики ООО (да и LO) любят MySQL. Самое наглядное проявление этого - полное отсутствие поиска, не говоря уже о замене, в редакторе скриптов. Да-да, в редакторе запросов в принципе нет такой возможности. Уже смешно.
Про неумение LO работать с теми скриптами, с которыми OOO справляется влёт, я уже молчу.

Но выяснилась, причем совершенно в неподходящий момент, неожиданная бяка. Понадобилось использовать курсоры в хранимой процедуре, чтобы не плодить множество вложенных select-ов. Но, как это иногда бывает, MySQL server gone away из-за таймаута. (это в ООО, а LO модча показывал пустое окно вместо результатов запроса). Методом тыка было выяснено, что сервер "уходит" на команде open cursor.

Почему я решил, что виноват офис? Да потому что из-за неудобства IDE в этом офисе, для написания и отладки запросов я использую MySQL Workbench, и в ней всё работало отлично, сервер никуда не пропадал и результаты возвращались как положено.

Печально, но выяснилось, что использовать курсоры нельзя. Пришлось, благо, что хранимые процедуры/функции пишутся на более "стандартном" диалекте, близком к обычным ЯВУ, лепить циклы опроса и совершать прочие некрасивые действия, чтобы имитировать функциональность курсоров.

Суть задачи:

Есть система инвентаризации ИТ OCS-NG Inventory. Ее БД хранится в виде множества связанных таблиц, где основная таблица ocsweb.hardware, а большинство остальных таблиц связано с ней соотношением одно-ко-многим, то есть, для каждой записи в hardware может быть несколько записей в других таблицах.

В частности, конкретно в моем случае, для каждого компьютера может быть несколько записей в таблице "Мониторы". Действительно, ведь можно подключить несколько мониторов к одной системе. Но в ежеквартальном отчете все мониторы одного компа должны попасть в одну ячейку электронной таблицы.

group_concat, конечно, справляется, но... Но надо сначала обработать отдельные поля этих записей. Например, без "драйверов" старые мониторы LG не сообщают о себе некоторую информацию. А другие наоборот, сообщают всё подряд, включая серийный номер и дату производства. Если тупо слепить вместе все поля, то может получиться некрасиво.

Допустим, один монитор сообщил о себе всё, и group_concat может сделать примерно такое: "модель (производитель), sn: номер". Но в случае старого монитора такая красота превратится в уродливое "  (проихводитель), sn:  " или вообще в "  (  ), sn:  ", за что я уже получал (и справедливо) от начальства.

Стало быть, надо обработать возможные ситуации разной заполненности полей и в зависимости от этого сформировать итоговую строку так, чтобы она оставалась аккуратной. Учитывая слабую гибкость того, что можно вписать внутрь select-a. сей процесс превращается в тяжеловесную конструкцию со множеством скобок и вложенных операторов. Потому мне и понадобилась хранимая функция, в которой всё то же самое можно проделать намного элегантнее.

Так как записей в связанной таблице может быть несколько, то надо обрабатывать их одну за другой, объединяя результаты в итоговую строчку. Как это выглядит с курсором?

declare (переменные для курсора)
declare (переменная-счетчик)(количество_записей)
declare (курсор)
declare (переменная результат)

open курсор

счетчик=1
результат=''
количество записей=select count(*) from таблица where такая-то-связь

label: loop
    fetch курсор into переменные курсора
    обработать_переменные_курсора
# счетчик дописывается в итоговую строку, если мониторов больше одного
    результат=concat(результат, обработанные_переменные_курсора)
    счетчик++
end loop

return результат

fetch возвращает по одной записи за раз и можно спокойно двигаться по связанной таблице. Ну да, у этих курсоров есть свои ограничения, но в своей задаче я в эти ограничения не упираюсь. А вот select возвращает набор записей, который штатно нельзя сохранить в переменной. И для "последовательного" доступа к записям в этом наборе надо извращаться примерно так:

    select MANUFACTURER,CAPTION,DESCRIPTION,SERIAL
        from (select (@mwr:=@mwr+1) kak,MANUFACTURER,CAPTION,DESCRIPTION,SERIAL
            from (select @mwr:=0) rt, monitors where hardware_id=gmhwid) pp
        where kak=RowNum into gmM, gmC, gmD, gmS;


То есть, использовать три select-a вместо одного простого fetch.
Внутренний select - старый трюк для добавления порядковых номеров к возвращаемым записям - из псевдо-таблицы выбирается поле, увеличивающееся при каждой выборке.
Средний select выполняет собственно выборку из таблицы мониторов. Возвращается набор пронумерованных записей
Внешний select собственно и имитирует работу fetch-a, выбирая из среднего запись, соответствующую номеру итерации.

Наверное, можно поиграться с limit, например, выбрать в поиске только одну строку, запомнить ее ключевое поле, выбрать еще строку, в которой ключевое поле отличается.

среда, 22 октября 2014 г.

SED: приводим в порядок дампы зон DNS

Понадобилось мне примерно такое вот привести в машинно-обрабатываемый вид. То есть, провести предварительную подготовку данных - выбрать только информацию об адресах

;  Database file (null) for 127.21.172.in-addr.arpa zone.
;      Zone version:  180
;
@                       IN  SOA cnt10srv031.contoso.com. hostmaster.contoso.com. (
                                180          ; serial number
                                28800        ; refresh
                                7200         ; retry
                                604800       ; expire
                                3600       ) ; default TTL
;
;  Zone NS records
;
@                       NS    cnt10srv030.contoso.com.
@                       NS    cnt30srv030.contoso.com.
;
;  Zone records
;
1                       PTR    cnt30nce017.contoso.com.
152                     PTR    cnt30nce202.contoso.com.
158                     PTR    cnt30prn044.contoso.com.
68                      PTR    cnt30nce907.contoso.com.
85                      [AGE:3627316]    1200    PTR    cnt301512.contoso.com.
87                      [AGE:3627293]    1200    PTR    cnt301561.contoso.com.
90                      PTR    cnt30prn025.contoso.com.

Ну, как известно, командная строка в линуксах рулит. Пропускаем этот дамп через такой фильтр:

cat имя_дампа|grep PTR|sed -e 's/  */ /g;s/\[.*\]//;s/\t/ /g;s/ 1200 //g;s/ 900 //g'

(900 и 1200 - это два вида TTL, встречающихся в этих дампах, не стал вспоминать регекспы, а тупо сделал одну замену за другой)

Получаем на выходе красоту:

1 PTR cnt30nce017.contoso.com.
152 PTR cnt30nce202.contoso.com.
158 PTR cnt30prn044.contoso.com.
68 PTR cnt30nce907.contoso.com.
85 PTR cnt301512.contoso.com.
87 PTR cnt301561.contoso.com.
90 PTR cnt30prn025.contoso.com.

Дальше вставляю полученное в open/libre-office, который видит, что вставляемое очень похоже на табулированные данные и предлагает вставить их как CSV. Разумеется, я не против, только указываю, что столбцы отделяются пробелами...


скриншот окна вставки

Что и требовалось доказать:

частичный скриншот вставленного текста

Попытка вставить подобное в excel 2003 приводит к тому, что вместо трех столбцов получаем только один, и никаких параметров, позволяющих настроить вставку нет: есть только "текст юникод" и "текст". Возможно, в более поздних версиях MSO появилось такое, но не факт.

Дамп прямой зоны обрабатываем похожим фильтром:

grep -v -E ".21.120|.21.121|CNAME" имя_дампа|sed -e 's/  */ /g;s/\[.*\]//;s/\t/ /g;s/ 1200 / /g;s/ 900 / /g;s/ 600 / /g;s/  / /g'

Добавился еще один TTL и из этой зоны нас не интересуют адреса из подсетей 172.21.120.0/24 и 172.21.121.0/24

Получаем:
cnt30srv030 A 172.21.122.212
cnt30SRV041 A 172.21.122.135
cnt30SRV951 A 172.21.122.160

Ну красота же?