Как получить имя поименованной ячейки?

Автор Kadet, 26 мая 2021, 07:26

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

economist

Цитата: Kadet от 26 мая 2021, 12:59а там без 3-D моделирования и графического конструктора не обойтись

Сейчас наметилась следующая тенденция: если нет патологической зависимости от "автокада" - народ берет свободный CAD, что-то из https://awesomeopensource.com/projects/cad или наш nanoCAD. Затем ручками или процедурно генерит основные примитивы, например в этом https://github.com/CadQuery/cadquery - обычно это что-то особенное, например нестандартные косынки для крепления каркасных балок (хотя всё это уже где-то есть, нужно просто поискать). А затем быстро собирает из них "растягиваемый" прототип. Готовые CAD-ведомости материалов/стройработ - экспортируют в Calc для осмечивания.   

Хорошая новость - почти все CAD умеют в Python, а значит легко самому научиться и научить других. Тот python что в LibreOffice - уже позволяет творить определенные чудеса (скоро покажу в новой ветке по Calc). Считать и подгонять белую/черную смету по своим/поставщиков прайсам в Calc/Base, как сделали вы - удобно. А Питон может облегчить и ускорить перенос данных за счет унификации форматов и умения брать данные откуда угодно - из файлов, сайтов, БД.

Время учить Питон, мне кажется всем нам этого не избежать. Кульманы уже почти не встретишь.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Kadet

Спасибо! Ща закончу этот проект и таки придётся коснуться питона.
Спасибо за наводки. Попробую совместить Base со внешними CAD-ами.

Спасибо, за направление.

Kadet

Спасибо! Перебором всё получилось. Есть минусы, но и фиг с ними.

Kadet

Добрый день, коллеги!
Нужна ещё помощь.
Пытаюсь скопировать документ CALC в другой документ CALC со специальным форматированием. Первый лист документа должен быть ориентирован книжно, а все прочие альбомно. Потом это документ будет сохраняться в PDF для удобства формирования ком.предложения.

Однако, никак не получается установить разные стили страниц для разных листов CALC. Что делаю не так? Где ошибка.

Код макроса-экспортёра из CALC в CALC
Sub ANExport(oEvent)
Dim oDoc As Object, vComp As Object, oSheet As Object, oSheet1 As Object, oRange, oRange1, oRow%, oCell, sURL$, oData, StyleName
Dim i%, j%, k%, n%, index%, Xmax, Ymax, sName$, oStartColumn, oStartRow, oEndColumn, oEndRow, oRw%, bFooterIs as Boolean
Dim oPaperOrien, document, oActiveSheet, MaxPages, oPageStyles, oStyle, oLeftText, oCenterText, oRightText, oGraph, oDrawPage
Dim aSize As new com.sun.star.awt.Size
Dim oOpt(1) as new com.sun.star.beans.PropertyValue
Dim CellAddress As New com.sun.star.table.CellRangeAddress
Dim oRanges(0) As New com.sun.star.table.CellRangeAddress
'ON LOCAL ERROR GOTO ErroANExport:

oDoc = ThisComponent

sURL = "private:factory/scalc"
vComp = StarDesktop.LoadComponentFromUrl(sURL, "_blank", 0, Array())
document = vComp.CurrentController.Frame
document.Controller.ShowGrid = false 'Убрать разметку ячеек
' document.Controller.HasColumnRowHeaders = false 'Убрать названия сток и стоблцов

oSheet = oDoc.CurrentController.getActiveSheet
index = oSheet.RangeAddress.Sheet
n = oDoc.Sheets.Count-2
For k=0 To n
oSheet = oDoc.Sheets(k)
sName = oSheet.Name
If k=0 Then
oSheet1 = vComp.Sheets(k)
oSheet1.Name = sName
Else
vComp.Sheets.insertNewByName(sName, k)
End If

oSheet1 = vComp.Sheets(k)
oRange = oSheet.getCellByPosition(0,0)
oDoc.CurrentController.select(oRange)

Xmax = oDoc.CurrentController.VisibleArea.Width
Ymax = oDoc.CurrentController.VisibleArea.Height
If k=0 Then
oPaperOrien = 0
oStartColumn = 0
oStartRow = 0
oEndColumn = 5
oEndRow = 500
bFooterIs = False
MaxPages = 2
StyleName = "Report"
Else
oPaperOrien = 1
oStartColumn = 0
oStartRow = 0
oEndColumn = Xmax/oSheet.Columns(1000).Width
oEndRow = Ymax/oSheet.Rows(1000).Height
bFooterIs = True
MaxPages = 1
StyleName = "Default"
End If

oRange = oSheet.getCellRangeByPosition(oStartColumn,oStartRow,oEndColumn,oEndRow)
oData = oRange.DataArray
oRange = oSheet.getCellRangeByPosition(0,0,oEndColumn,oEndRow)
oDoc.CurrentController.select(oRange)
oData = oDoc.CurrentController.getTransferable()

oRange1 = oSheet1.getCellRangeByName("A1")
vComp.CurrentController.select(oRange1)
vComp.CurrentController.insertTransferable(oData)

oActiveSheet = vComp.CurrentController.getActiveSheet()
oStyle = vComp.StyleFamilies.getByName("PageStyles").getByName(StyleName)
oStyle.CenterHorizontally = True
oStyle.HeaderIsOn = True
oStyle.FooterIsOn = false
oStyle.TopMargin = 750
oStyle.LeftMargin = 500
oStyle.RightMargin = 500
oStyle.BottomMargin = 750
oStyle.ScaleToPagesX = 1
oStyle.ScaleToPagesY = MaxPages
SetHeaderTextInSpreadSheet(vComp, oSheet1, oLeftText, oCenterText, oRightText)

oOpt(1).Name = "PaperOrientation"
oOpt(1).Value = oPaperOrien
vComp.Printer = oOpt()

oRanges(0).Sheet = k
oRanges(0).StartColumn = 0 : oRanges(0).StartRow = 0
oRanges(0).EndColumn = oEndColumn : oRanges(0).EndRow = oEndRow
vComp.CurrentController.getActiveSheet().setPrintAreas(oRanges)

oActiveSheet.Rows(oStartRow).IsStartOfNewPage = True
Next
'***********************************************************************
ErroANExport:
' ON LOCAL ERROR GOTO 0
End Sub


P.S./// Возможно в оторванности от основной базы макрос не будет работать. Не проверял.

Kadet

Разрывы печатных страниц в листе не работают - oActiveSheet.Rows(oStartRow).IsStartOfNewPage = True
Количество страниц, в которые нужно вписывать данные из конкретного листа, тоже не работает - oStyle.ScaleToPagesY = MaxPages
Ориентация стиля тоже не работает:
oOpt(1).Name = "PaperOrientation"
oOpt(1).Value = oPaperOrien
vComp.Printer = oOpt()


Всё берёт по последней настройке.

Kadet

Пока формулировал вопрос понял ошибку.
Получается, что ориентацию устанавливаю для всего документа:
oOpt(1).Name = "PaperOrientation"
oOpt(1).Value = oPaperOrien
vComp.Printer = oOpt()

Однако, в лоб - oActiveSheet.Printer = oOpt(), не находит метод.

economist

А области печати заданы? В Excel всегда есть хотя бы одна ОП, а Calc м.б. ни одной.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Kadet

Да. Области печати задаю. Образцы брал с рабочих макросов.
Вычитал тут на форуме, что нужно создавать два новых стиля - альбомный и книжный и каждому отдельному листу нужно присваивать разные стили. А то я меняю тот, который по умолчанию - Default, а он для всех листов один.
"Ручками" сделал это без труда (в образце), однако никак не могу разобраться как создать новые стили PageStyle макросом.

Kadet

Ура. Научился создавать стили макросом.
oPageStyles = vComp.StyleFamilies.getByName("PageStyles")
oPageStyle = vComp.createinstance("com.sun.star.style.PageStyle")
oPageStyles.insertByName ("Книжный", oPageStyle) 'Добавить название Стиля
oPageSetup=oPageStyles.getByName("Книжный")