https://github.com/dbzhang800/QtXlsxWriter 下载qtxlsx地址
QtXlsx is a library that can read and write Excel files. It doesn't require Microsoft Excel and can be used in any platform that Qt5 supported. The library can be used to
- Generate a new .xlsx file from scratch
- Extract data from an existing .xlsx file
- Edit an existing .xlsx file
Getting Started
- For linux user, if your Qt is installed through package manager tools such "apt-get", make sure that you have installed the Qt5 develop package qtbase5-private-dev
Usage(1): Use Xlsx as Qt5's addon module
Building the module
Note: Perl is needed in this step.
-
Download the source code.
-
Put the source code in any directory you like
-
Go to top directory of the project in a terminal and run
qmake
make
make install
The library, the header files, and others will be installed to your system.
make html_docs
can be used to generate documentations of the library, andmake check
can be used to run unit tests of the library.
Using the module
- Add following line to your qmake's project file:
QT += xlsx
- Then, using Qt Xlsx in your code
#include >
int main() { QXlsx::Document xlsx; xlsx.write("A1", "Hello Qt!"); xlsx.saveAs("Test.xlsx"); return 0; }
Usage(2): Use source code directly
The package contains a qtxlsx.pri file that allows you to integrate the component into applications that use qmake for the build step.
-
Download the source code.
-
Put the source code in any directory you like. For example, 3rdparty:
|-- project.pro
|-- ....
|-- 3rdparty\
| |-- qtxlsx\
| |
- Add following line to your qmake project file:
include(3rdparty/qtxlsx/src/xlsx/qtxlsx.pri)
Note: If you like, you can copy all files from src/xlsx to your application's source path. Then add following line to your project file:
include(qtxlsx.pri)
> **Note**: If you do not use qmake, you need to define the following macro manually
> ```
XLSX_NO_LIB
- Then, using Qt Xlsx in your code
#include "xlsxdocument.h"
int main() { QXlsx::Document xlsx; xlsx.write("A1", "Hello Qt!"); xlsx.saveAs("Test.xlsx"); return 0; }
在构建的时候,可能会有如下的错误,
xlsxzipreader.cpp: In member function ‘void QXlsx::ZipReader::init()’:
xlsxzipreader.cpp:51:66: error: conversion from ‘QVector’ to non-scalar type ‘QList’ requested
QList allFiles = m_reader->fileInfoList();
这里只需要吧出错的文件添加 :
#include
然后把出错的地方的"QList" 用"QVector" 替换掉重新构建就可以了。
简单的写excel:
void BurnTaskWidget::OnExportButtonClick()
{
QXlsx::Document z_xlsx;
QStringList z_titleList;
QString z_filePathName;
QString z_defaultFileName = "刻录任务汇总.xls";
// 设置保存的默认文件名称 文件名_当前时间.xls
QFileInfo z_fileinfo(z_defaultFileName);
QDateTime z_curDateTime = QDateTime::currentDateTime();
QString z_strCurTime = z_curDateTime.toString("yyyyMMddhhmmss");
z_defaultFileName = z_fileinfo.baseName() + "_" + z_strCurTime + ".xls";
// 获取保存文件路径
QFileDialog *z_fileDlg = new QFileDialog(this);
z_fileDlg->setWindowTitle("保存文件");
z_fileDlg->setAcceptMode(QFileDialog::AcceptSave);
z_fileDlg->selectFile(z_defaultFileName);
z_fileDlg->setNameFilter("Excel Files(*.xls *.xlsx)");
z_fileDlg->setDefaultSuffix("xls");
if (z_fileDlg->exec() == QDialog::Accepted)
{
z_filePathName = z_fileDlg->selectedFiles().at(0);
}
// 保存文件添加后缀名
z_fileinfo = QFileInfo(z_filePathName);
if (z_fileinfo.suffix() != "xls" && z_fileinfo.suffix() != "xlsx")
{
z_filePathName += ".xls";
}
// 设置excel任务标题
z_titleList << "流水号" << "光盘名称" << "密级" << "提交人" << "部门" << "申请时间" << "任务状态";
for (int i = 0; i < z_titleList.size(); i++)
{
z_xlsx.write(1, i+1, z_titleList.at(i));
}
// 设置烈宽
z_xlsx.setColumnWidth(1, 20);
z_xlsx.setColumnWidth(2, 20);
z_xlsx.setColumnWidth(3, 10);
z_xlsx.setColumnWidth(4, 15);
z_xlsx.setColumnWidth(5, 20);
z_xlsx.setColumnWidth(6, 25);
z_xlsx.setColumnWidth(7, 10);
// 获取表格内容设置excel
int z_row = modelBurnTask->rowCount();
int z_col = modelBurnTask->columnCount() - 1;// 最后一列为图标,不保存
for (int i = 0; i < z_row; i++)
{
for (int j = 0; j < z_col; j++)
{
z_xlsx.write(i+2, j+1 ,modelBurnTask->index(i, j).data().toString());
}
}
// 保存文件
z_xlsx.saveAs(z_filePathName);
}
读写方法:
读:
void FlightPlanWid::readExcel(QString path)
{
QXlsx::Document xlsx(path);
QXlsx::Workbook *workBook = xlsx.workbook();
QXlsx::Worksheet *workSheet = static_cast(workBook->sheet(0));
ui.tableWidget->setRowCount(workSheet->dimension().rowCount());
ui.tableWidget->setColumnCount(23);
QString value;
for (int i = 6; i <= workSheet->dimension().rowCount(); i++)
{
for (int j = 1; j <= workSheet->dimension().columnCount(); j++)
{
QXlsx::Cell *cell = workSheet->cellAt(i, j);
if (cell==NULL) continue;
if (cell->isDateTime())//日期
{
if (cell->dateTime().date().year()==1899) continue;
value = cell->dateTime().toString("yyyy/MM/dd hh:mm");
}
else
{
value = cell->value().toString();
}
setItemValue(i - 6, j - 1, value);
}
}
for (int i = ui.tableWidget->rowCount() - 1; i >= 0; i--)//删除末尾空白行
{
QTableWidgetItem *item = ui.tableWidget->item(i, 0);
if (item==NULL)
ui.tableWidget->removeRow(i);
else break;
}
}
写:
void FlightPlanWid::saveBtnClickedSlot()
{
if (currentScriptIndex == -1) return;
QXlsx::Document xlsx;
QString value;
for (int i = 0; i < ui.tableWidget->rowCount(); i++)
{
for (int j = 0; j < ui.tableWidget->columnCount(); j++)
{
QTableWidgetItem *item = ui.tableWidget->item(i, j);
if (item == NULL)
value = "";
else
value = item->text();
xlsx.write(i + 1, j + 1, value);
}
}
if (xlsx.saveAs("./Data/Saved/" + ui.nameEdt->text() + ".xlsx"))
QMessageBox::information(this, "保存", "保存成功!", QMessageBox::Ok);
}
对于Qt Xlsx ( QtXlsxWriter ) 的安装请参考:
http://blog.csdn.net/woshidahuaidan2011/article/details/52724452
这里主要介绍其基本的编程使用方法。
首先我们想到就是对xlsx文件进行读写,因此我们有如下的代码:
#include >
#include "xlsxdocument.h" #include "xlsxformat.h" #include "xlsxcellrange.h" #include "xlsxchart.h" int main() { QXlsx::Document xlsx("book1.xlsx");/*打开一个book1的文件*/ QXlsx::Format format1;/*设置该单元的样式*/ format1.setFontColor(QColor(Qt::red));/*文字为红色*/ format1.setPatternBackgroundColor(QColor(152,251,152));/*北京颜色*/ format1.setFontSize(15);/*设置字体大小*/ format1.setHorizontalAlignment(QXlsx::Format::AlignHCenter);/*横向居中*/ format1.setBorderStyle(QXlsx::Format::BorderDashDotDot);/*边框样式*/ xlsx.write("A1", "Hello Qt!", format1);/*写入文字,应该刚才设置的样式*/ xlsx.write(2, 1, 12345, format1);/*写入文字,应该刚才设置的样式*/ QXlsx::Format format2;/*重新设置另一个单元的样式*/ format2.setFontBold(true);/*设置加粗*/ format2.setFontUnderline(QXlsx::Format::FontUnderlineDouble);/*下双划线*/ format2.setFillPattern(QXlsx::Format::PatternLightUp);/*填充方式*/ xlsx.write("A4", "=44+33", format2);/*写入文字,应该刚才设置的样式*/ xlsx.write("C4", true, format2); xlsx.saveAs("book1.xlsx");/*保存*/ QXlsx::Document xlsx2("Book1.xlsx");/*复制book1到book2*/ xlsx2.saveAs("Book2.xlsx"); return 0; }
其运行效果如下:
接下来我们处理数据的是很多时候需要插入折线图、饼状图等等来图像化的处理数据,因此我们可以可以在原有代码上添加一段代码,使之添加一个sheet而且插入饼状图及其条形图:
#include >
#include "xlsxdocument.h" #include "xlsxformat.h" #include "xlsxcellrange.h" #include "xlsxchart.h" int main() { QXlsx::Document xlsx("book1.xlsx");/*打开一个book1的文件*/ QXlsx::Format format1;/*设置该单元的样式*/ format1.setFontColor(QColor(Qt::red));/*文字为红色*/ format1.setPatternBackgroundColor(QColor(152,251,152));/*北京颜色*/ format1.setFontSize(15);/*设置字体大小*/ format1.setHorizontalAlignment(QXlsx::Format::AlignHCenter);/*横向居中*/ format1.setBorderStyle(QXlsx::Format::BorderDashDotDot);/*边框样式*/ xlsx.write("A1", "Hello Qt!", format1);/*写入文字,应该刚才设置的样式*/ xlsx.write(2, 1, 12345, format1);/*写入文字,应该刚才设置的样式*/ QXlsx::Format format2;/*重新设置另一个单元的样式*/ format2.setFontBold(true);/*设置加粗*/ format2.setFontUnderline(QXlsx::Format::FontUnderlineDouble);/*下双划线*/ format2.setFillPattern(QXlsx::Format::PatternLightUp);/*填充方式*/ xlsx.write("A4", "=44+33", format2);/*写入文字,应该刚才设置的样式*/ xlsx.write("C4", true, format2); if(!xlsx.selectSheet("ziv")){/*在当前打开的xlsx文件中,找一个名字为ziv的sheet*/ xlsx.addSheet("ziv");//找不到的话就添加一个名为ziv的sheet } for (int i=10; i<20; ++i) {/*写入一串数字*/ xlsx.write(i, 1, i*i*i); //A10:A19 xlsx.write(i, 2, i*i); //B10:B19 xlsx.write(i, 3, i*i-1); //C10:C19 } QXlsx::Chart *pieChart = xlsx.insertChart(3, 5, QSize(300, 300));/*在3行5列的位置插入一个图标*/ pieChart->setChartType(QXlsx::Chart::CT_Pie);/*插入一个饼形图*/ pieChart->addSeries(QXlsx::CellRange("A10:A19"));/*饼形图添加数据*/ pieChart->addSeries(QXlsx::CellRange("B10:B19")); pieChart->addSeries(QXlsx::CellRange("C10:C19")); QXlsx::Chart *barChart = xlsx.insertChart(3, 13, QSize(300, 300));/*在3行13列的位置插入一个图标*/ barChart->setChartType(QXlsx::Chart::CT_Bar);/*条形图*/ barChart->addSeries(QXlsx::CellRange("A10:C19"));/*给条形图加入数据*/ xlsx.saveAs("book1.xlsx");/*保存*/ QXlsx::Document xlsx2("Book1.xlsx");/*复制book1到book2*/ xlsx2.saveAs("Book2.xlsx"); return 0; }
上面代码中运行效果如下:
很多时候我们还需要添加图表来美化表格,代码如下:
#include >
#include > #include "xlsxdocument.h" #include "xlsxformat.h" #include "xlsxcellrange.h" #include "xlsxchart.h" int main() { QXlsx::Document xlsx("book1.xlsx");/*打开一个book1的文件*/ QXlsx::Format format1;/*设置该单元的样式*/ format1.setFontColor(QColor(Qt::red));/*文字为红色*/ format1.setPatternBackgroundColor(QColor(152,251,152));/*北京颜色*/ format1.setFontSize(15);/*设置字体大小*/ format1.setHorizontalAlignment(QXlsx::Format::AlignHCenter);/*横向居中*/ format1.setBorderStyle(QXlsx::Format::BorderDashDotDot);/*边框样式*/ xlsx.write("A1", "Hello Qt!", format1);/*写入文字,应该刚才设置的样式*/ xlsx.write(2, 1, 12345, format1);/*写入文字,应该刚才设置的样式*/ QXlsx::Format format2;/*重新设置另一个单元的样式*/ format2.setFontBold(true);/*设置加粗*/ format2.setFontUnderline(QXlsx::Format::FontUnderlineDouble);/*下双划线*/ format2.setFillPattern(QXlsx::Format::PatternLightUp);/*填充方式*/ xlsx.write("A4", "=44+33", format2);/*写入文字,应该刚才设置的样式*/ xlsx.write("C4", true, format2); if(!xlsx.selectSheet("ziv")){/*在当前打开的xlsx文件中,找一个名字为ziv的sheet*/ xlsx.addSheet("ziv");//找不到的话就添加一个名为ziv的sheet } for (int i=10; i<20; ++i) {/*写入一串数字*/ xlsx.write(i, 1, i*i*i); //A10:A19 xlsx.write(i, 2, i*i); //B10:B19 xlsx.write(i, 3, i*i-1); //C10:C19 } QXlsx::Chart *pieChart = xlsx.insertChart(3, 5, QSize(300, 300));/*在3行5列的位置插入一个图标*/ pieChart->setChartType(QXlsx::Chart::CT_Pie);/*插入一个饼形图*/ pieChart->addSeries(QXlsx::CellRange("A10:A19"));/*饼形图添加数据*/ pieChart->addSeries(QXlsx::CellRange("B10:B19")); pieChart->addSeries(QXlsx::CellRange("C10:C19")); QXlsx::Chart *barChart = xlsx.insertChart(3, 13, QSize(300, 300));/*在3行13列的位置插入一个图标*/ barChart->setChartType(QXlsx::Chart::CT_Bar);/*条形图*/ barChart->addSeries(QXlsx::CellRange("A10:C19"));/*给条形图加入数据*/ QImage image(40, 100, QImage::Format_RGB32);/*新建一个Qimage,大小40*100*/ image.fill(Qt::green);/*填充绿色*/ xlsx.insertImage(1, 1, image);/*插入图片*/ xlsx.saveAs("book1.xlsx");/*保存*/ QXlsx::Document xlsx2("Book1.xlsx");/*复制book1到book2*/ xlsx2.saveAs("Book2.xlsx"); return 0; }
效果如下:
到此为止对于Qt Xlsx 的使用应该可以满足大部分的需求,如有疑问欢迎留言指正,原文地址:
http://blog.csdn.net/woshidahuaidan2011/article/details/53349163