Пройтись по всем значениям в автофильтре сохраняя видимое как отдельный файл pdf

Автор useronforum, 24 июля 2014, 02:47

0 Пользователи и 1 гость просматривают эту тему.

useronforum

Здравствуйте.

Есть лист с таблицей и автофильтром в LibreOffice/OpenOffice Calc.
Нужно пройтись по всем значениям одного столбца в автофильтре,
сохраняя каждый раз видимое как отдельный файл pdf
с именем как в фильтрованном значении.

Шаблон приложен к сообщению.

Возможно ли написать такой макрос?

rami

Возвращаю ваш файл с макросом ImportToPDF. Сначала откройте редактор макросов и в строке, где написано "Здесь указать адрес папки" укажите адрес. Потом отфильтруйте данные, установите курсор в ячейку(любую) текст в ячейке будет именем файла PDF, нажмите кнопку. Ищите PDF по указаному адресу.

useronforum

Спасибо за помощь, но нет самого главного:
автоматически пробежаться по всем значениям фильтра.

То есть нужно нажать 1 раз кнопку и создастся 4 файла.

Сейчас же нужно вручную выбирать значение из фильтра.
А если значений 1000?!

То есть нужно применять какую-нибудь команду, например ApplyFilterToIRow(I),
по циклу для всех строк фильтра.

===
Просто существуют :
== Ограничения макрорегистратора ==
https://help.libreoffice.org/Common/Recording_a_Macro/ru

Следующие действия не регистрируются:


  • Открытие окон не регистрируется.
  • Действия, выполненные в других окнах (где регистратор не запущен), не регистрируются.
  • Переключение окон не регистрируется.
  • Действия, не связанные с содержимым документа, не регистрируются. Например, изменения, внесенные в диалоговое окно "Параметры", организатор макросов, настройки.
  • Выделения регистрируются только в том случае, если они выполняются с помощью клавиатуры (перемещением курсора), но не регистрируются при использовании мыши.
  • Макрорегистратор работает только в Calc и Writer.

То есть не получается через запись макроса записать выбор другого значение в фильтре.

Нужно знать команду макроса (В Excel такая возможность есть: через .AutoFilter).
Узнать бы такую команду для макроса LibreOffice/OpenOffice Calc.

useronforum

В принципе можно обойтись без фильтра.

Есть 2 способа:
1 способ.
Вручную добавить на второй лист Лист2 в ячейки (A2:A..) все возможные значения столбца Лист1.A без повторений.
В ячейку Лист2.A1 поместить номер последней строки для удобства.

Макросом пройтись циклом по i по всем строкам Лист2 (от 2 до Лист2.A1)
begin
  Вложенным циклом пройтись по j по всем строкам Лист1
  begin
    if Лист1[A][j] не равно Лист2[A][i] then
      высоту j-й строки Лист1 присвоить равной 0 (скрыть её)
    else
      высотк j-й строки Лист1 присвоить равной 10 (отобразить её)
  end;
  сохранить в pdf видимое на Лист1
end;


2 способ.
Отсортировать строки листа по столбцу A вручную.

RowNumberFrom=2;
Макросом пройтись циклом по i по всем строкам листа
begin
  if текущее значение ячейки A[i] не равно A[i-1] then
  begin
    RowNumberTo=i-1
    устанавливаем область печати=все строки от RowNumberFrom до RowNumberTo
    отправляем на печать (виртуальный pdf-принтер doPdf уже установлен у меня)
    RowNumberFrom=i;
  end;
end;


===
Если какой-то из этих способов проще реализовать в макросе,
то помогите реализовать этот способ.

rami

Цитата: useronforum от 24 июля 2014, 13:39автоматически пробежаться по всем значениям фильтра.
Автоматически не получится, т.к. автофильтр для этого не предназначен, он предназначен только для быстрой "ручной" работы, но есть ещё два вида фильтров: Стандартный и Расширенный. Оба они хорошо вписываются в макросы. Стандартный фильтр подойдёт лучше. Обе ваши последние идеи, как говорила моя бабушка "на тёмный лес", они будут выполняться очень долго (тысячи строк— десятки минут)
Цитата: useronforum от 24 июля 2014, 13:39А если значений 1000?!
Тогда в автоматическом режиме получите 1000 файлов PDF. Напишите подробней, какие условия:
1. сколько колонок и строк в таблице?
2. по какому столбцу выполнять фильтрацию?
3. по документам PDF из предыдущего макроса есть замечания?

useronforum

Цитата: rami от 25 июля 2014, 23:22
Цитироватьавтоматически пробежаться по всем значениям фильтра.
Автоматически не получится, т.к. автофильтр для этого не предназначен, он предназначен только для быстрой "ручной" работы, но есть ещё два вида фильтров: Стандартный и Расширенный. Оба они хорошо вписываются в макросы. Стандартный фильтр подойдёт лучше.
Как сделать через стандартный фильтр?

ЦитироватьОбе ваши последние идеи, как говорила моя бабушка "на тёмный лес", они будут выполняться очень долго (тысячи строк— десятки минут)
Это не важно. Можно запустить и на ночь оставить.
Сейчас я вручную делаю ту же задачу около часа или дольше.
А это нужно делать периодически.

Цитата: rami от 25 июля 2014, 23:22
ЦитироватьА если значений 1000?!
Тогда в автоматическом режиме получите 1000 файлов PDF.
Да это и нужно.

ЦитироватьНапишите подробней, какие условия:
1. сколько колонок и строк в таблице?
2. по какому столбцу выполнять фильтрацию?
3. по документам PDF из предыдущего макроса есть замечания?
1. Колонок около 10. Строк 5000-10000.
2. Фильтрация только по первому столбцу.
3. Нет замечаний. Хорошо, что формат листа сохраняет при сохранении.

rami

Цитата: useronforum от 26 июля 2014, 05:07Это не важно. Можно запустить и на ночь оставить.
Сейчас я вручную делаю ту же задачу около часа или дольше.
Я так и поверил ;D вы в ручную около часа, а бедняга Комп всю ночь будет пахать
Попробуйте новый вариант, если будут замечания доработаем. Обратите внимание на качество файлов PDF и печати.

useronforum

Ошибка при сохранении.
Объект не доступен.
Не разрешен доступ к объекту из-за ограничения прав пользователя.

rami

Цитата: useronforum от 26 июля 2014, 15:55Ошибка при сохранении.
Объект не доступен.
Не разрешен доступ к объекту из-за ограничения прав пользователя.
И кто охраняет секретный объект 8-) 8-) 8-) ?


rami

Цитата: useronforum от 28 июля 2014, 12:33Путь надо было так прописать: "file:///C:/temp/"
Ну, это вам надо было, я ваши пути не знаю. Каждый должен прописывать путь в соответствии со своей файловой системой.
А каковы результаты? Какой объём данных и за какое время выполнен? Качество распечатки?

useronforum

Спасибо.

===
Доделал макрос:

1) Скопировал ширину столбцов из исходного листа
For j=1 To 11
ThisComponent.Sheets(0).Columns(j).Width=ThisComponent.Sheets(1).Columns(j).Width
Next

2) Первый столбец скрыл
ThisComponent.Sheets(0).Columns(0).Width=1

3) Сделал выравнивание по центру (может быть можно проще?)
sub curs898989
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:SelectAll", "", 0, Array())

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "HorizontalAlignment"
args2(0).Value = com.sun.star.table.CellHoriJustify.CENTER

dispatcher.executeDispatch(document, ".uno:HorizontalAlignment", "", 0, args2())

end sub

===
А как редактировать кнопку?
(Ширина, высота, цвет, положение, надпись)

rami

Цитата: useronforum от 28 июля 2014, 14:30А как редактировать кнопку?
(Ширина, высота, цвет, положение, надпись)
Сначала о кнопке, потом остальное.
В меню "Вид" "Панели инструментов" выберите "Элементы управления", на самой панели нажмите значок "Режим разработки" и щёлкните по кнопке, она выделится, щёлкните по значку "Элемент управления" откроется окно "Свойства:Кнопка"

useronforum

Работает 1 файл в секунду. Нормально.

Добавить бы повторение верхней строки на каждой странице при сохранении в pdf,
как это делается при печати.

А как отключить уменьшение шрифта в ячейках при широком тексте?
Чтобы просто обрезался (для сравнения нужно).

rami

Цитата: useronforum от 28 июля 2014, 14:301) Скопировал ширину столбцов из исходного листа
Это лишнее действие, т.к. всё форматирование копируется автоматом
Цитата: useronforum от 28 июля 2014, 14:303) Сделал выравнивание по центру (может быть можно проще?)
Проще этого не делать вообще, т.к. всё форматирование копируется автоматом.
Поясняю почему: файлы PDF имеют тоже самое форматирование, что и форматирование исходного файла. Оформите исходный файл так как нужно раз и навсегда, а потом когда будут новые данные просто запишите их вместо старых.
Цитата: useronforum от 28 июля 2014, 14:302) Первый столбец скрыл
ThisComponent.Sheets(0).Columns(0).Width=1
Лучше я его скрою. В макросе Filtracia найдите внизу строку :ThisComponent.Sheets(0).CharHeight=8 и замените на :ThisComponent.Sheets(0).Columns.removeByIndex(0,1)
Цитата: useronforum от 28 июля 2014, 16:22А как отключить уменьшение шрифта в ячейках при широком тексте?
Чтобы просто обрезался (для сравнения нужно).
В меню "Формат" "Ячейки..." в окне "Формат ячеек" "Выравнивание" снять флажок "Уменьшать по размеру ячейки"
Цитата: useronforum от 28 июля 2014, 16:22Добавить бы повторение верхней строки на каждой странице при сохранении в pdf,
как это делается при печати.
В макросе ImportToPDF найдите вверху строку :sNameFile=ThisComponent.Sheets(0).getCellByPosition(0,1).Stringи замените на :sNameFile=ThisComponent.Sheets(0).NameСравните с тем, что получилось у меня.