一、前言
除了能夠打印基本的文字信息數據到pdf和紙張,越來越多的應用需求還要求能夠導出圖片,並且要支持圖文混排,相當於doc文檔類似,當然也不會是太複雜的,類似於打印報表一樣,有表格形式的文字描述,也有對應的圖片插入其中,圖文混排的應用場景還真不少比如醫療行業輸出診斷結果往往都帶了圖片。於是針對這個需求特意開闢了新的類DataCreat專門生成報表的數據,將生成好的數據體直接傳入給DataPrint類即可,如果有各種各樣的不同的圖文混排格式,可以直接在DataCreat類中生成好就行,默認提供了一種圖文混排報表的模板,其他格式都按照這個格式來就行,建議做成結構體的形式,比如提供的模板是無人機監控系統告警報告。
無人機監控系統告警報告結構體參數:
- 大標題
- 副標題
- 設備名稱
- 座標經度值
- 座標緯度值
- 報警觸發時間
- 報告打印時間
- 警情類型
- 報警設備數量
- 報警級別
- 報警圖片集合
- 最後列拉伸填充
- 橫向排版
- 紙張邊距
二、功能特點
- 組件同時集成了導出數據到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以及打印數據,自動分頁。
- 靈活性超高,可自由更改源碼設置對齊方式、文字顏色、背景顏色等。
- 支持任意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/
四、效果圖
五、相關代碼
#include "datacreat.h"
void DataCreat::creatUavsReportHead(QStringList &list, const UavsReportData &reportData)
{
//表格開始
list << "<table border='0.0' cellspacing='0' cellpadding='6'>";
//標題
list << "<tr>";
list << QString("<td width='100%' align='center' style='font-size:22px;font-weight:bold;' colspan='%1'>%2</td>").arg(2).arg(reportData.title);
list << "</tr>";
//橫線或者換行
list << "<hr>";
//list << "<br>";
//當前模塊通用樣式
QString style = "style='font-size:18px;'";
//設備名稱
QString name = QString("設備名稱: %1").arg(reportData.name);
list << "<tr>";
list << QString("<td colspan='%1' %2>%3</td>").arg(2).arg(style).arg(name);
list << "</tr>";
//經度緯度
QString lng = QString("設備經度: %1").arg(reportData.lng);
QString lat = QString("設備緯度: %1").arg(reportData.lat);
list << "<tr>";
list << QString("<td %1>%2</td>").arg(style).arg(lng);
list << QString("<td %1>%2</td>").arg(style).arg(lat);
list << "</tr>";
//告警日期+報告時間
QString timeAlarm = QString("告警日期: %1").arg(reportData.timeAlarm);
QString timeReport = QString("報告時間: %1").arg(reportData.timeReport);
list << "<tr>";
list << QString("<td %1>%2</td>").arg(style).arg(timeAlarm);
list << QString("<td %1>%2</td>").arg(style).arg(timeReport);
list << "</tr>";
//表格結束
list << "</table>";
}
void DataCreat::creatUavsReportBody(QStringList &list, const UavsReportData &reportData, int imageWidth)
{
//換行
list << "<br><br>";
//表格開始
list << "<table border='0.5' cellspacing='0' cellpadding='5'>";
//標題
list << "<tr>";
list << QString("<td width='100%' align='center' style='font-size:20px;font-weight:bold;' colspan='%1'>%2</td>").arg(2).arg(reportData.subTitle);
list << "</tr>";
//當前模塊通用樣式
QString style = "style='font-size:18px;'";
//告警類型
QString type = QString("告警類型: %1").arg(reportData.type);
list << "<tr>";
list << QString("<td width='100%' colspan='%1' %2>%3</td>").arg(2).arg(style).arg(type);
list << "</tr>";
//目標數量+威脅等級
QString textCount = QString("目標數量: %1").arg(reportData.textCount);
QString textLevel = QString("威脅等級: %1").arg(reportData.textLevel);
list << "<tr>";
list << QString("<td %1>%2</td>").arg(style).arg(textCount);
list << QString("<td %1>%2</td>").arg(style).arg(textLevel);
list << "</tr>";
//圖像隊列
QStringList listImage = reportData.images;
int count = listImage.count();
//告警圖像
QString text = QString("告警圖像 ( 共 %1 張 )").arg(count);
list << "<tr>";
list << QString("<td width='100%' align='center' style='font-size:20px;font-weight:bold;' colspan='%1'>%2</td>").arg(2).arg(text);
list << "</tr>";
//計算繪製區域大小,先將圖像縮放到合適大小並保存在本地
QString path = qApp->applicationDirPath() + "/snap/";
for (int i = 0; i < count; ++i) {
QImage image(listImage.at(i));
if (image.width() > imageWidth) {
QString name = path + QString("%1.jpg").arg(i + 1);
image = image.scaled(imageWidth, image.height(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
image.save(name, "jpg");
listImage[i] = name;
}
}
//qDebug() << listImage;
//垂直居中
style = "style='vertical-align:middle;'";
for (int i = 0; i < count; i = i + 2) {
list << "<tr>";
list << QString("<td align='center' %1><img src='%2'></td>").arg(style).arg(listImage.at(i));
//需要過濾判斷下,很可能是奇數會超過下一個
if (i < count - 1) {
list << QString("<td align='center' %1><img src='%2'></td>").arg(style).arg(listImage.at(i + 1));
}
list << "</tr>";
}
//表格結束
list << "</table>";
}