1、概述
Document
類是一個用于操作 XLSX 文件的類,繼承自 QObject
。它提供了對 Excel 文件的讀寫操作,包括單元格的讀寫、圖片和圖表的插入、單元格合并、列和行的格式化、數據驗證和條件格式化等功能。此外,它還支持對工作簿和工作表的操作,如添加、刪除、重命名工作表等。這個類可以用于創建、編輯和保存 XLSX 文件,也可以將 XLSX 文件的內容保存為 CSV 格式。
2、重要方法
-
explicit Document(QObject *parent = nullptr)
:默認構造函數,創建一個空的Document
對象。 -
Document(const QString &xlsxName, QObject *parent = nullptr)
:通過指定 XLSX 文件名創建Document
對象。 -
Document(QIODevice *device, QObject *parent = nullptr)
:通過指定QIODevice
創建Document
對象,用于從內存設備讀取或寫入 XLSX 文件。 -
~Document()
:析構函數,釋放Document
對象。
-
bool write(const CellReference &cell, const QVariant &value, const Format &format = Format())
:向指定單元格寫入值,并可選地設置格式。 -
bool write(int row, int col, const QVariant &value, const Format &format = Format())
:向指定行列的單元格寫入值,并可選地設置格式。 -
QVariant read(const CellReference &cell) const
:讀取指定單元格的值。 -
QVariant read(int row, int col) const
:讀取指定行列的單元格的值。
-
int insertImage(int row, int col, const QImage &image)
:在指定位置插入圖片。 -
bool getImage(int imageIndex, QImage &img)
:根據圖片索引獲取圖片。 -
bool getImage(int row, int col, QImage &img)
:根據行列位置獲取圖片。 -
uint getImageCount()
:獲取圖片數量。 -
Chart *insertChart(int row, int col, const QSize &size)
:在指定位置插入圖表。
-
bool mergeCells(const CellRange &range, const Format &format = Format())
:合并指定范圍的單元格,并可選地設置格式。 -
bool unmergeCells(const CellRange &range)
:拆分已合并的單元格。 -
bool setColumnWidth(const CellRange &range, double width)
:設置指定列范圍的寬度。 -
bool setColumnFormat(const CellRange &range, const Format &format)
:設置指定列范圍的格式。 -
bool setColumnHidden(const CellRange &range, bool hidden)
:設置指定列范圍是否隱藏。 -
bool setRowHeight(int row, double height)
:設置指定行的高度。 -
bool setRowFormat(int row, const Format &format)
:設置指定行的格式。 -
bool setRowHidden(int row, bool hidden)
:設置指定行是否隱藏。
-
QStringList sheetNames() const
:獲取所有工作表的名稱。 -
bool addSheet(const QString &name, AbstractSheet::SheetType type = AbstractSheet::ST_WorkSheet)
:添加一個工作表。 -
bool insertSheet(int index, const QString &name, AbstractSheet::SheetType type = AbstractSheet::ST_WorkSheet)
:在指定位置插入一個工作表。 -
bool selectSheet(const QString &name)
:選擇指定名稱的工作表。 -
bool selectSheet(int index)
:選擇指定索引的工作表。 -
bool renameSheet(const QString &oldName, const QString &newName)
:重命名工作表。 -
bool copySheet(const QString &srcName, const QString &distName = QString())
:復制工作表。 -
bool moveSheet(const QString &srcName, int distIndex)
:移動工作表。 -
bool deleteSheet(const QString &name)
:刪除工作表。
-
bool save() const
:保存當前的 XLSX 文件。 -
bool saveAs(const QString &xlsXname) const
:將當前的 XLSX 文件保存為指定名稱。 -
bool saveAs(QIODevice *device) const
:將當前的 XLSX 文件保存到指定的QIODevice
。 -
bool saveAsCsv(const QString mainCSVFileName) const
:將當前的 XLSX 文件保存為 CSV 格式。 -
bool isLoadPackage() const
:檢查是否已加載 XLSX 文件。 -
bool load() const
:加載 XLSX 文件。
3、移植QXlsx源碼
github下載:點擊跳轉
csdn下載:點擊跳轉
下載后如下圖所示:里面的QXlsx為我們需要用到的源碼,其它的為一些官方的示例代碼:
打開QXlsx文件夾后如下圖所示:通過QXlsx.pro打開可以編譯為動態庫使用,在程序里加載QXlsx.pri可以直接使用源碼。
將QXlsx源碼文件夾拷貝到創建的Qt工程路徑下(也可以是其它路徑):
4、demo
在工程的.pro文件中添加下列代碼:
include($$PWD/QXlsx/QXlsx.pri) # QXlsx源代碼
INCLUDEPATH += $$PWD/QXlsx
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include "xlsxdocument.h"QXLSX_USE_NAMESPACE // 添加Xlsx命名空間MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);setWindowTitle("QXlsx基本讀寫Excel");//創建一個excel文件Document xlsx; // 初始化后默認有一個sheet1//doc.addSheet("第一個sheet", AbstractSheet::ST_WorkSheet); // 添加第一個sheet,如果不添加則會有一個默認的bool ret = xlsx.saveAs("./1.xlsx"); // 保存到EXCEL_NAME,如果已經存在則覆蓋if(ret){qInfo() << "創建excel成功!";}else{qWarning() << "創建excel失敗!";}//打開文件Document *m_xlsx = new Document("./1.xlsx", this);if(m_xlsx->load()) // 判斷文件是否打開成功(也可以使用isLoadPackage){qInfo() << "excel打開成功!";}else{qWarning() << "excel打開失敗!";}//將數據寫入excel
#if 0m_xlsx->write("A2", 123); // 從A1開始m_xlsx->write("B2", 0.001);m_xlsx->write("C2", "abc");m_xlsx->write("D2", true);m_xlsx->write("E2", "你好");
#elsem_xlsx->write(1, 1, 456); // 從1,1開始m_xlsx->write(1, 2, 0.002);m_xlsx->write(1, 3, "aaa");m_xlsx->write(1, 4, false);m_xlsx->write(1, 5, "你好");
#endifif(m_xlsx->save()){qInfo() << "數據寫入成功!";}else{qWarning() << "數據寫入失敗!";}//讀取excel中所有數據int rowLen = m_xlsx->dimension().rowCount(); // 獲取最大行數int columnLen = m_xlsx->dimension().columnCount(); // 獲取最大列數for(int i = 1; i <= rowLen; i++) // 遍歷每一行{QString data = QString("第%1行:").arg(i);for(int j = 1; j <= columnLen; j++) // 遍歷每一個單元格(列){
#if 1QVariant value = m_xlsx->read(i, j); // 通過單元格行號、列號讀取數據
#elseQVariant value = m_xlsx->read(QString("%1%2").arg((char)(64 + i)).arg(j)); // 通過單元格引用讀取數據
#endifif(!value.isNull()){data.append(value.toString()).append(" ");}else{data.append("NULL ");}}qInfo() << data;}//將數據另存到2.xlsxif(m_xlsx->saveAs("./2.xlsx")){qInfo() << "另存為2.xlsx";}else{qWarning() << "文件另存為失敗!";}
}
覺得有幫助的話,打賞一下唄。。
? ? ? ? ? ?