Qt資料庫應用9-資料匯出元件使用方法

## 一、使用方法

### 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 items;

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/)

## 四、效果圖

Qt資料庫應用9-資料匯出元件使用方法