## 一、使用方法
### 1。1 第一步:引入元件
- 元件中所有程式碼檔案是一個整體,不支援單個程式碼檔案拆分使用,因為很多通用的方法都放在一個程式碼檔案中,複用很多程式碼。
- datehead是本元件用到的標頭檔案以及通用的資料結構體。
- datahelper是通用的校驗列函式和資料匯出列印函式。
- datacreat用於建立html格式的資料,用來匯出到pdf和列印資料。
- datacsv用於匯入匯出檔案csv格式。
- dataxls是資料匯出到xls的核心。
- dataprint是資料匯出到pdf和列印資料。
1。 將core_dataout整個目錄複製到你的專案資料夾同級目錄。
2。 開啟你的專案的pro檔案,引入元件。
```cpp
INCLUDEPATH += $$PWD/。。/core_dataout
include ($$PWD/。。/core_dataout/core_dataout。pri)
```
3。 此時在專案樹狀結構圖中可以看到 core_dataout 元件程式碼。
### 1。2 第二步:獲取資料
- 無論是匯出到xls還是pdf或者列印,前提是都要拿到需要處理的資料集合。
- 拿到資料的方式基本上兩種,一種是資料庫查詢比如QSqlTableModel,一種是介面控制元件取資料比如QTableView、QTableWidget、QStandardItemModel。
- QTableView一般有兩種資料來源,一個是QSqlTableModel,一個是QStandardItemModel。
- 資料集合按照一行行資料來,中間用英文的 分號 ; 隔開,最後統一放到QStringList中。
#### 1。2。1 示例QSqlTableModel
```cpp
void frmDataOut2::on_btnLoad_clicked()
{
model->setTable(“MsgInfo”);
model->select();
ui->tableView->setModel(model);
for (int i = 0; i < columnCount; i++) {
model->setHeaderData(i, Qt::Horizontal, columnNames。at(i));
ui->tableView->setColumnWidth(i, columnWidths。at(i));
}
}
QStringList frmDataOut2::getContent()
{
QStringList content;
QString sql = QString(“select * from MsgInfo limit %1”)。arg(100);
QSqlQuery query;
if (!query。exec(sql)) {
return content;
}
//迴圈遍歷資料
while (query。next()) {
QStringList list;
for (int i = 0; i < column; i++) {
list << query。value(i)。toString();
}
content << list。join(“;”);
}
return content;
}
```
#### 1。2。2 示例QStandardItemModel
```cpp
void frmSimple::on_btnLoad_clicked()
{
//清空資料
model->clear();
//設定列數及列標題和列寬
model->setColumnCount(column);
for (int i = 0; i < column; ++i) {
model->setHeaderData(i, Qt::Horizontal, columnNames。at(i));
ui->tableView->setColumnWidth(i, columnWidths。at(i));
}
//迴圈新增行資料
for (int i = 0; i < row; ++i) {
//迴圈新增一行的列
QList
for (int j = 0; j < column; ++j) {
QStandardItem *item = new QStandardItem;
item->setText(QString(“行%1_列%2”)。arg(i + 1)。arg(j + 1));
items << item;
}
model->appendRow(items);
}
ui->tableView->setModel(model);
}
QStringList frmSimple::getContent()
{
//從 QTableView 獲取資料
QStringList content;
for (int i = 0; i < row; ++i) {
QStringList list;
for (int j = 0; j < column; ++j) {
list << model->item(i, j)->text();
}
//每行資料作為一個整體字串分割存入
content << list。join(“;”);
}
return content;
}
```
#### 1。2。3 示例QTableWidget
```cpp
void frmDataOut1::on_btnLoad_clicked()
{
QStringList list;
list << “防區上線” << “防區離線” << “防區旁路” << “防區報警” << “防區故障”;
ui->tableWidget->clearContents();
for (int i = 0; i < rowCount; i++) {
//隨機生成告警內容
int index = rand() % 4;
QTableWidgetItem *item1 = new QTableWidgetItem(QString::number(i + 1));
QTableWidgetItem *item2 = new QTableWidgetItem(“防區” + QString::number(i + 1));
QTableWidgetItem *item3 = new QTableWidgetItem(“主機上報”);
QTableWidgetItem *item4 = new QTableWidgetItem(list。at(index));
QTableWidgetItem *item5 = new QTableWidgetItem(DATETIME);
item5->setTextAlignment(Qt::AlignCenter);
ui->tableWidget->setItem(i, 0, item1);
ui->tableWidget->setItem(i, 1, item2);
ui->tableWidget->setItem(i, 2, item3);
ui->tableWidget->setItem(i, 3, item4);
ui->tableWidget->setItem(i, 4, item5);
}
}
QStringList frmDataOut1::getContent()
{
QStringList content;
for (int i = 0; i < row; i++) {
QStringList list;
for (int j = 0; j < column; j++) {
list << ui->tableWidget->item(i, j)->text();
}
content << list。join(“;”);
}
return content;
}
```
### 1。3 第三步:設定資料
- 無論是匯出到xls還是pdf或者列印,都需要設定資料結構體,傳入列名、列寬、資料集合等資訊。
- 如果是匯出到xls還需要設定檔名及表名。
- 如果是匯出到pdf需要設定檔名。
- 列印不需要設定檔名和表名。
```cpp
void frmSimple::on_btnXls_clicked()
{
//設定結構體資料
DataContent dataContent;
//填充內容
dataContent。content = getContent();
//設定列名列寬
dataContent。columnNames = columnNames;
dataContent。columnWidths = columnWidths;
//設定檔名
dataContent。fileName = “d:/0。xls”;
//設定表名
dataContent。sheetName = “測試資訊”;
//呼叫靜態函式儲存
DataXls::saveXls(dataContent);
//開啟剛才匯出的檔案
QUIHelper::openFile(dataContent。fileName, “匯出測試資訊”);
}
void frmSimple::on_btnPdf_clicked()
{
//設定結構體資料
DataContent dataContent;
//填充內容
dataContent。content = getContent();
//設定列名列寬
dataContent。columnNames = columnNames;
dataContent。columnWidths = columnWidths;
//設定檔名
dataContent。fileName = “d:/0。pdf”;
//呼叫靜態函式儲存
DataPrint::savePdf(dataContent);
//開啟剛才匯出的檔案
QUIHelper::openFile(dataContent。fileName, “匯出測試資訊”);
}
void frmSimple::on_btnPrint_clicked()
{
//設定結構體資料
DataContent dataContent;
//填充內容
dataContent。content = getContent();
//設定列名列寬
dataContent。columnNames = columnNames;
dataContent。columnWidths = columnWidths;
//呼叫靜態函式列印
DataPrint::print(dataContent);
}
```
### 1。4 第四步:執行操作
- 資料匯入匯出元件dataout提供了統一的資料結構體用來設定資料和其他引數。
- 封裝了統一的靜態函式DataXls::saveXls用來匯出到xls、DataPrint::savePdf用來匯出到pdf、DataPrint::print用來列印資料。
- 支援各種詳細複雜的引數設定以及海量資料匯出多執行緒操作,具體參見詳細使用demo。
```cpp
//呼叫靜態函式儲存到xls
DataXls::saveXls(dataContent);
//呼叫靜態函式儲存到pdf
DataPrint::savePdf(dataContent);
//呼叫靜態函式列印資料
DataPrint::print(dataContent);
```
## 二、功能特點
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。 支援任意excel表格軟體,包括但不限於excel2003-2021、wps、openoffice等。
26。 純Qt編寫,支援任意Qt版本+任意編譯器+任意系統。
## 三、體驗地址
1。 體驗地址:[https://pan。baidu。com/s/1ZxG-oyUKe286LPMPxOrO2A](https://pan。baidu。com/s/1ZxG-oyUKe286LPMPxOrO2A) 提取碼:o05q 檔名:bin_dataout。zip
2。 國內站點:[https://gitee。com/feiyangqingyun](https://gitee。com/feiyangqingyun)
3。 國際站點:[https://github。com/feiyangqingyun](https://github。com/feiyangqingyun)
4。 個人主頁:[https://blog。csdn。net/feiyangqingyun](https://blog。csdn。net/feiyangqingyun)
5。 知乎主頁:[https://www。zhihu。com/people/feiyangqingyun/](https://www。zhihu。com/people/feiyangqingyun/)
## 四、效果圖