1. 程式人生 > 其它 >Qt資料庫應用18-橫向縱向排版

Qt資料庫應用18-橫向縱向排版

一、前言

近期使用者提了個需求,需要列印一個文件,要求其中部分頁橫向排版部分頁面縱向排版,這個在之前的通用列印匯出pdf類中是不具備的,通用的列印匯出pdf只能統一設定一個排版方式,要麼橫向要麼縱向,而如果要指定某一頁橫向還是縱向,需要單獨的處理。為什麼之前設計的類不支援單獨指定頁面,主要是為了方便使用者使用,並不需要複雜的設定,而且面對的應用場景都是統一的日誌類、資訊類,這些資料基本上要麼統一是橫向要麼統一是縱向排版,不需要精確到某一頁什麼排版,而且傳入資料內容集合以後是自動分頁處理的,也無法動態切換排版方式。一般是特殊的報表內容才可能需要指定頁不同的排版方式,比如醫療上面用的報表,個人資訊縱向排版,體檢資訊中的心電圖橫向排版看到更清晰。

要實現指定頁不同排版方式,需要用到QPdfWriter類,這個類是從Qt5.3開始有的,將QPainter類指定繪製物件為QPdfWriter類物件即可,然後通過函式setPageOrientation設定紙張的方向,呼叫newPage函式生成新的一頁,自行控制分頁和繪製內容,既然都已經是QPainter物件了,那就想要如何繪製都可以,畫點畫線畫框,心中有座標,萬物皆painter。當然也支援QTextDocument構建好html內容傳入,這樣也非常豐富靈活。

二、功能特點

  1. 元件同時集成了匯出資料到csv、xls、pdf和列印資料。
  2. 所有操作全部提供靜態方法無需new,資料和屬性等各種引數設定採用結構體資料,極為方便。
  3. 同時支援QTableView、QTableWidget、QStandardItemModel、QSqlTableModel等資料來源。
  4. 提供靜態方法直接傳入QTableView、QTableWidget控制元件,自動識別列名、列寬和資料內容。
  5. 每組功能都提供單獨的完整的示例,註釋詳細,非常適合各階段Qter程式設計師。
  6. 原創匯出資料機制,不依賴任何office元件或者作業系統等第三方庫,支援嵌入式linux。
  7. 速度超快,9個欄位10萬行資料只需要2秒鐘完成。
  8. 只需要四個步驟即可開始急速匯出海量資料比如100W條記錄到Excel。
  9. 同時提供直接寫入資料介面和多執行緒寫入資料介面,不卡主介面。
  10. 可設定標題、副標題、表名。
  11. 可設定匯出資料的欄位名、列名、列寬。
  12. 可設定末尾列自動拉伸填充,預設拉伸更美觀。
  13. 可設定是否啟用校驗過濾資料,啟用後符合規則的資料特殊顏色顯示。
  14. 可指定校驗的列、校驗規則、校驗值、校驗值資料型別。
  15. 校驗規則支援 精確等於==、大於>、大於等於>=、小於<、小於等於<=、不等於!=、包含contains。
  16. 校驗值資料型別支援 整型int、浮點型float、雙精度型double,預設文字字串型別。
  17. 可設定隨機背景顏色及需要隨機背景色的列集合。
  18. 支援分組輸出資料,比如按照裝置分組輸出資料,方便檢視。
  19. 可設定csv分隔符、行內容分隔符、子內容分隔符。
  20. 可設定邊框寬度、自動填資料型別,預設自動資料型別開啟。
  21. 可設定是否開啟資料單元格樣式,預設不開啟,不開啟可以節約大概30%的檔案體積。
  22. 可設定橫向排版、紙張邊距等,比如匯出到pdf以及列印資料。
  23. 提供圖文混排匯出資料到pdf以及列印示例,自動分頁,支援多圖。
  24. 提供一個列印樣板中同時包括橫向縱向排版示例。
  25. 提供靜態函式將控制元件截圖匯出到pdf檔案。
  26. 提供靜態函式將圖片轉成pdf檔案。
  27. 提供靜態函式將csv檔案轉成xls檔案,支援列寬表名等引數設定。
  28. 針對每列可分別設定欄位對齊樣式、內容對齊樣式,包括左對齊、居中對齊、右對齊。
  29. 靈活性超高,可自由更改原始碼設定對齊方式、文字顏色、背景顏色等。
  30. 支援任意excel表格軟體,包括但不限於excel2003-2021、wps、openoffice等。
  31. 純Qt編寫,支援任意Qt版本+任意編譯器+任意系統。

三、體驗地址

  1. 體驗地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取碼:o05q 檔名:bin_dataout.zip
  2. 國內站點:https://gitee.com/feiyangqingyun
  3. 國際站點:https://github.com/feiyangqingyun
  4. 個人主頁:https://blog.csdn.net/feiyangqingyun
  5. 知乎主頁: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
}