Qt資料庫應用18-橫向縱向排版
阿新 • • 發佈:2022-05-27
一、前言
近期使用者提了個需求,需要列印一個文件,要求其中部分頁橫向排版部分頁面縱向排版,這個在之前的通用列印匯出pdf類中是不具備的,通用的列印匯出pdf只能統一設定一個排版方式,要麼橫向要麼縱向,而如果要指定某一頁橫向還是縱向,需要單獨的處理。為什麼之前設計的類不支援單獨指定頁面,主要是為了方便使用者使用,並不需要複雜的設定,而且面對的應用場景都是統一的日誌類、資訊類,這些資料基本上要麼統一是橫向要麼統一是縱向排版,不需要精確到某一頁什麼排版,而且傳入資料內容集合以後是自動分頁處理的,也無法動態切換排版方式。一般是特殊的報表內容才可能需要指定頁不同的排版方式,比如醫療上面用的報表,個人資訊縱向排版,體檢資訊中的心電圖橫向排版看到更清晰。
要實現指定頁不同排版方式,需要用到QPdfWriter類,這個類是從Qt5.3開始有的,將QPainter類指定繪製物件為QPdfWriter類物件即可,然後通過函式setPageOrientation設定紙張的方向,呼叫newPage函式生成新的一頁,自行控制分頁和繪製內容,既然都已經是QPainter物件了,那就想要如何繪製都可以,畫點畫線畫框,心中有座標,萬物皆painter。當然也支援QTextDocument構建好html內容傳入,這樣也非常豐富靈活。
二、功能特點
- 元件同時集成了匯出資料到csv、xls、pdf和列印資料。
- 所有操作全部提供靜態方法無需new,資料和屬性等各種引數設定採用結構體資料,極為方便。
- 同時支援QTableView、QTableWidget、QStandardItemModel、QSqlTableModel等資料來源。
- 提供靜態方法直接傳入QTableView、QTableWidget控制元件,自動識別列名、列寬和資料內容。
- 每組功能都提供單獨的完整的示例,註釋詳細,非常適合各階段Qter程式設計師。
- 原創匯出資料機制,不依賴任何office元件或者作業系統等第三方庫,支援嵌入式linux。
- 速度超快,9個欄位10萬行資料只需要2秒鐘完成。
- 只需要四個步驟即可開始急速匯出海量資料比如100W條記錄到Excel。
- 同時提供直接寫入資料介面和多執行緒寫入資料介面,不卡主介面。
- 可設定標題、副標題、表名。
- 可設定匯出資料的欄位名、列名、列寬。
- 可設定末尾列自動拉伸填充,預設拉伸更美觀。
- 可設定是否啟用校驗過濾資料,啟用後符合規則的資料特殊顏色顯示。
- 可指定校驗的列、校驗規則、校驗值、校驗值資料型別。
- 校驗規則支援 精確等於==、大於>、大於等於>=、小於<、小於等於<=、不等於!=、包含contains。
- 校驗值資料型別支援 整型int、浮點型float、雙精度型double,預設文字字串型別。
- 可設定隨機背景顏色及需要隨機背景色的列集合。
- 支援分組輸出資料,比如按照裝置分組輸出資料,方便檢視。
- 可設定csv分隔符、行內容分隔符、子內容分隔符。
- 可設定邊框寬度、自動填資料型別,預設自動資料型別開啟。
- 可設定是否開啟資料單元格樣式,預設不開啟,不開啟可以節約大概30%的檔案體積。
- 可設定橫向排版、紙張邊距等,比如匯出到pdf以及列印資料。
- 提供圖文混排匯出資料到pdf以及列印示例,自動分頁,支援多圖。
- 提供一個列印樣板中同時包括橫向縱向排版示例。
- 提供靜態函式將控制元件截圖匯出到pdf檔案。
- 提供靜態函式將圖片轉成pdf檔案。
- 提供靜態函式將csv檔案轉成xls檔案,支援列寬表名等引數設定。
- 針對每列可分別設定欄位對齊樣式、內容對齊樣式,包括左對齊、居中對齊、右對齊。
- 靈活性超高,可自由更改原始碼設定對齊方式、文字顏色、背景顏色等。
- 支援任意excel表格軟體,包括但不限於excel2003-2021、wps、openoffice等。
- 純Qt編寫,支援任意Qt版本+任意編譯器+任意系統。
三、體驗地址
- 體驗地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取碼:o05q 檔名:bin_dataout.zip
- 國內站點:https://gitee.com/feiyangqingyun
- 國際站點:https://github.com/feiyangqingyun
- 個人主頁:https://blog.csdn.net/feiyangqingyun
- 知乎主頁:https://www.zhihu.com/people/feiyangqingyun/
四、效果圖
五、相關程式碼
void DataOther::savePdf(const QString &fileName, const QString &content)
{
#if (QT_VERSION >= QT_VERSION_CHECK(5,3,0))
//建立pdf檔案物件
QFile pdfFile(fileName);
if (!pdfFile.open(QIODevice::WriteOnly)) {
return;
}
//建立pdf寫入物件
QPdfWriter pdfWriter(&pdfFile);
//設定紙張尺寸
pdfWriter.setPageSize(QPageSize(QPageSize::A4));
//設定紙張解析度
pdfWriter.setResolution(100);
//設定頁邊距
int margin = 20;
pdfWriter.setPageMargins(QMarginsF(margin, margin, margin, margin), QPageLayout::Millimeter);
//設定紙張方向
pdfWriter.setPageOrientation(QPageLayout::Portrait);
//設定標題和建立者
pdfWriter.setTitle("測試標題");
pdfWriter.setCreator("建立者Qt");
//建立pdf繪圖物件
QPainter pdfPainter;
pdfPainter.begin(&pdfWriter);
//設定字型
QFont font;
font.setPixelSize(20);
pdfPainter.setFont(font);
//繪製第1頁內容 - 縱向排版
pdfPainter.drawText(0, 0, "第一頁內容");
//繪製第2頁內容 - 橫向排版
pdfWriter.setPageOrientation(QPageLayout::Landscape);
pdfWriter.newPage();
pdfPainter.drawText(0, 0, "第二頁內容");
//繪製第3頁內容 - 富文字
pdfWriter.setPageOrientation(QPageLayout::Portrait);
pdfWriter.newPage();
//pdfPainter.drawText(0, 0, "第三頁內容");
//採用html格式內容輸出非常強大
QStringList list;
#if 1
list << "<h1>這裡是標題</h1>";
list << "<p>這裡是段落。</p>";
int width = pdfWriter.width();
list << QString("<table width='%1' border='0.5' cellspacing='0' cellpadding='6'>").arg(width);
list << QString("<tr style='font-weight:bold;'><td align='center'>姓名</td><td align='center'>成績</td></tr>");
for (int i = 0; i < 10; ++i) {
list << QString("<tr><td align='center'>姓名%1</td><td align='center'>%2</td></tr>").arg(i + 1).arg(rand() % 100);
}
list << "</table>";
#else
UavsReportData data;
DataCreat::creatUavsReportHead(list, data);
DataCreat::creatUavsReportBody(list, data);
#endif
QString html = list.join("");
QTextDocument pdfDoc;
pdfDoc.begin();
pdfDoc.setHtml(html);
pdfDoc.drawContents(&pdfPainter);
pdfDoc.end();
//繪製第4頁內容 - 傳入的富文字
if (!content.isEmpty()) {
pdfWriter.setPageOrientation(QPageLayout::Portrait);
pdfWriter.newPage();
pdfDoc.begin();
pdfDoc.setHtml(content);
pdfDoc.drawContents(&pdfPainter);
pdfDoc.end();
}
//結束繪製並關閉檔案
pdfPainter.end();
pdfFile.close();
#endif
}