Перейти до основного вмісту

Qt та Excel. Робота з книгами та листами 2.

В продовження ось цієї статті ми будемо готувати. xls файл до друку. Процес підготовки документа до друку складається з таких етапів як визначення розміру паперу, полів, настройка колонтитулів і т.д.

Задаємо області друку.
activeSheet->querySubObject("PageSetup")->dynamicCall("PrintArea", "A1: D3"); // область друк А1: D3

Поля сторінки.
Поля сторінки задаються в точках, 1 точка = 1/72 дюйма = 1/28 сантиметра. Для завдання полів використовується чотири властивості: TopMargin, RightMargin, BottomMargin, LeftMargin.
activeSheet->querySubObject("PageSetup")->dynamicCall("TopMargin", 28); // верхнє поле дорівнює 1 см.

Колонтитули.
Величина колонтитулів задається властивостями: HeaderMargin, FooterMargin.
activeSheet->querySubObject("PageSetup")->dynamicCall("HeaderMargin", 28); // розмір верхнього колонтитула дорівнює 1см.
Тут є невеликий підступ, якщо значення верхнього поля менше величини колонтитула, текст колонтитула буде "наїжджати" на остновной текст сторінки, щоб цього не відбувалося при завданні верхнього та нижнього поля треба враховувати розмір колонтитула.
В Excel верхній і нижній колонтитул розділені на з частини: LeftHeader, CenterHeader, RightHeader - верхні і соответсвенно: LeftFooter, CenterFooter, RightFooter - нижні. У кожну частину текст задається окремо.
activeSheet->querySubObject("PageSetup")->dynamicCall("LeftFooter", QDate::currentDate().toString("dd.MM.yyyy")); // поточну дату в лівий нижній колонтитул < br> activeSheet->querySubObject("PageSetup")->dynamicCall("RightHeader", "The name of our firm"); // назва фірми в правий верхній колонтитул

Орієнтація і розмір паперу.
Орієнтація паперу визначається значенням властивості Orientation, і може приймати одне з двох значень: xlPortrait - вертикальна сторінка, xlLandscape - горизонтальна.
activeSheet->querySubObject("PageSetup")->dynamicCall("Orientation", "xlLandscape");
Розмір визначається властивістю PaperSize, таблицю значень констант для цієї властивості я взяв з довідки по VisualBasic.

Name Value Description
xlPaper10x14 16 10 in. x 14 in.
xlPaper11x17 17 11 in. x 17 in.
xlPaperA3 8 A3 (297 mm x 420 mm)
xlPaperA4 9 A4 (210 mm x 297 mm)
xlPaperA4Small 10 A4 Small (210 mm x 297 mm)
xlPaperA5 11 A5 (148 mm x 210 mm)
xlPaperB4 12 B4 (250 mm x 354 mm)
xlPaperB5 13 A5 (148 mm x 210 mm)
xlPaperCsheet 24 C size sheet
xlPaperDsheet 25 D size sheet
xlPaperEnvelope10 20 Envelope # 10 (4-1/8 in. x 9-1/2 in.)
xlPaperEnvelope11 21 Envelope # 11 (4-1/2 in. x 10-3/8 in.)
xlPaperEnvelope12 22 Envelope # 12 (4-1/2 in. x 11 in.)
xlPaperEnvelope14 23 Envelope # 14 (5 in. x 11-1/2 in.)
xlPaperEnvelope9 19 Envelope # 9 (3-7/8 in. x 8-7/8 in.)
xlPaperEnvelopeB4 33 Envelope B4 (250 mm x 353 mm)
xlPaperEnvelopeB5 34 Envelope B5 (176 mm x 250 mm)
xlPaperEnvelopeB6 35 Envelope B6 (176 mm x 125 mm)
xlPaperEnvelopeC3 29 Envelope C3 (324 mm x 458 mm)
xlPaperEnvelopeC4 30 Envelope C4 (229 mm x 324 mm)
xlPaperEnvelopeC5 28 Envelope C5 (162 mm x 229 mm)
xlPaperEnvelopeC6 31 Envelope C6 (114 mm x 162 mm)
xlPaperEnvelopeC65 32 Envelope C65 (114 mm x 229 mm)
xlPaperEnvelopeDL 27 Envelope DL (110 mm x 220 mm)
xlPaperEnvelopeItaly 36 Envelope (110 mm x 230 mm)
xlPaperEnvelopeMonarch 37 Envelope Monarch (3-7/8 in. x 7-1/2 in.)
xlPaperEnvelopePersonal 38 Envelope (3-5/8 in. x 6-1/2 in.)
xlPaperEsheet 26 E size sheet
xlPaperExecutive 7 Executive (7-1/2 in. x 10-1/2 in.)
xlPaperFanfoldLegalGerman 41 German Legal Fanfold (8-1/2 in. x 13 in.)
xlPaperFanfoldStdGerman 40 German Legal Fanfold (8-1/2 in. x 13 in.)
xlPaperFanfoldUS 39 US Standard Fanfold (14-7/8 in. X 11 in.)
xlPaperFolio 14 Folio (8-1/2 in. x 13 in.)
xlPaperLedger 4 Ledger (17 in. x 11 in.)
xlPaperLegal 5 Legal (8-1/2 in. x 14 in.)
xlPaperLetter 1 Letter (8-1/2 in. x 11 in.)
xlPaperLetterSmall 2 Letter Small (8-1/2 in. x 11 in.)
xlPaperNote 18 Note (8-1/2 in. x 11 in.)
xlPaperQuarto 15 Quarto (215 mm x 275 mm)
xlPaperStatement 6 Statement (5-1/2 in. x 8-1/2 in.)
xlPaperTabloid 3 Tabloid (11 in. x 17 in.)
xlPaperUser 256 User-defined
activeSheet-> querySubObject ("PageSetup") -> dynamicCall ("PaperSize", "xlPaperTabloid");

Номер першої сторінки.
activeSheet-> querySubObject ("PageSetup") -> dynamicCall ("FirstPageNumber", 50);

Масштаб сторінок.
Є три властивості для встановлення масштабу: FitToPageTall - вписати по висоті, FitToPageWide - вписати по ширині і власне сам Zoom - масштаб. Щоб встановити машстаб за першими двома властивостями Zoom повинен бути відключений примусово, інакше зміни будуть ігноруватися.
activeSheet-> querySubObject ("PageSetup") -> dynamicCall ("Zoom", false); / / відключаємо властивість Zoom
activeSheet-> querySubObject ("PageSetup") -> dynamicCall ("FitToPageTall", 2); / / в 2 сторінки по висоті
activeSheet-> querySubObject ("PageSetup") -> dynamicCall ("FitToPageWide", 1); / / в 1 сторінку по ширині
або
activeSheet-> querySubObject ("PageSetup") -> dynamicCall ("Zoom", 150); / / масштаб 150%

Коментарі

Популярні дописи з цього блогу

Qt та Excel. Робота з ячейками.

Для доступу до всіх властивостей і вмісту ячійок у Excel використовуються два об'єкти Range і Cells. Між ними є тільки одна відмінність (крім назви) - перший об'єкт забезпечує доступ до області ячійок та його аргументом є строка. QAxObject *myRange; myRange = sheetAct->querySubObject("Range (QVariant)", "A1:D3"); myRange->dynamicCall("Select()"); / / виділяємо діапазон ячійок Cells забезпечує доступ тільки до однієї ячійки і аргументом є номер рядка і стовпця. Таким чином запис виду: QAxObject *myRange; myRange = sheetAct->querySubObject("Range(QVariant)", "A2"); і QAxObject *myCells; myCells = sheetAct->querySubObject("Cells (Int, Int)", 1, 2); є рівнозначною. Щоб визначити реальну адресу ячійки або діапазону ячійок можна скористатися властивістю Address, яке має наступні параметри: RowAbsolute, ColumnAbsolute, ReferenceStyle, External, RelativeTo. myRange = sheetAct->querySubObject(...

QString в HEX и обратно

Спочатку з QString робимо QByteArray. Зауважимо, якщо у вас по тексту тільки латинські букви цілком підійде варіант з .toUtf8(). Якщо ж присутня і кирилиця - обов'язково використовуємо .toLocal8Bit(). QString strA = "Some text"; QByteArray bA = strA.toLocal8Bit().toHex(); Перетворення QByteArray в початковий текст має такий вигляд: QString strB = QString::fromLocal8Bit(QByteArray::fromHex(bA))); Цікаво, що якщо ми для зберігання записали отриманий Нех куди-небудь, наприклад, в файл або базу даних у вигляді текстового рядка, то для зворотного перетворення цей рядок потрібно додатково перетворити в QByteArray. QString strA2 = QString::fromUtf8(bA); QByteArray bB = strA2.toUtf8(); QString strB = QString::fromLocal8Bit(QByteArray::fromHex(bB)));

Qt Округлення до певного розряду

Округлення - тривіальна задача в математиці, але в Qt немає функції округлення до певного розряду. Проте в QtMath є такі функції як qFloor (qreal) і QCeil (qreal), в результаті яких int. А також можна використовуючи round (double), отримати double. Дуже швидко я знайшов ось цей ресурс звідки взяв вихідну формулу. Вона без сумніву працює, але дає результати, які не відповідаю моїм очікуванням: toRound(187.156, 2); //187.15 toRound(187.156, 1); //187.1 toRound(187.156, 0); //187 toRound(187.156, -1); //180 toRound(187.156, -2); //100 Після невеликої корекції самої функції, її підсумковий варіант виглядає так: double wcsv::toRound(double val, int r) {   double outpValue;   double tempVal;   tempVal=val*pow(10,r);   if (double(int(tempVal))+0.5==tempVal){     int(tempVal)%2 == 0       ? outpValue=double(qFloor(tempVal))/pow(10,r)       :outpValue=d...