Qt中导出.txt, .xls, .xlsx, .pdf文件小结

本文介绍如何使用Qt进行文件输出,包括纯文本文件(.txt)、Excel表格(.xls和.xlsx)、PDF文档(.pdf)的导出方法。具体涉及QTextStream、QODBC连接Excel、VBA编程操作Excel及QPrinter生成PDF等技术。

1. 使用QTextStream输出流导出.txt文件

QString strFilePath = "C:/test.txt";

QFile file(strFilePath);

if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {

QMessageBox::information(NULLtr("提示信息:"), tr("文件打开失败!"));

return;

}

QTextStream out(&file);

out<<"1"<<"\t"<<"2013-1-25 12:00:00"<<"\t"<<tr("武汉")<<"\t"<<"wuhan"<<endl

<<"2"<<"\t"<<"2013-1-25 12:00:00"<<"\t"<<tr("广州")<<"\t"<<"guangzhou"<<endl

<<"3"<<"\t"<<"2013-1-25 12:00:00"<<"\t"<<tr("深圳")<<"\t"<<"shenzhen"<<endl;

file.close();

2. 使用DSN连接Excel表格处理导出.xls文件 (但是.xlsx文件写不进)

QString strFilePath = "C:/test.xls";

{

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC""excelexport");

if (!db.isValid()) {

QMessageBox::information(NULLtr("提示信息:"), tr("连接ODBC驱动失败"));

return;

}

QString dsn = QString("DRIVER={Microsoft Excel Driver (*.xls)};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%1\";DBQ=%2")

.arg(strFilePath).arg(strFilePath);

db.setDatabaseName(dsn);

if (!db.open()) {

QMessageBox::information(NULLtr("提示信息:"), tr("打开Excel表格失败!"));

return;

}

QSqlQuery query(db);

QString strSql = QString("DROP TABLE mydata");

query.exec(strSql);

strSql.clear();

strSql = QString("CREATE TABLE mydata (id number, dt date, addr char(60), name char(60))");

query.exec(strSql);

strSql.clear();

strSql = QString("INSERT INTO mydata (id, dt, addr, name) VALUES (1, '2013-1-25 12:00:00''%1', 'wuhan')").arg(tr("武汉"));

query.exec(strSql);

strSql.clear();

strSql = QString("INSERT INTO mydata (id, dt, addr, name) VALUES (2, '2013-1-25 12:00:00''%1', 'guangzhou')").arg(tr("广州"));

query.exec(strSql);

strSql.clear();

strSql = QString("INSERT INTO mydata (id, dt, addr, name) VALUES (3, '2013-1-25 12:00:00''%1', 'shenzhen')").arg(tr("深圳"));

query.exec(strSql);

db.close();

}

QSqlDatabase::removeDatabase("excelexport");

3. 直接对Excel文件做VBA编程导出.xlsx文件 (同样.xls文件也可以)

QString strFilePath = "C:/test.xlsx";

strFilePath = strFilePath.replace("/""\\");//路径需要\反斜杠

//QAxWidget excelApp("Excel.Application");//也可以

QAxObject excelApp("Excel.Application");

QAxObjectexcelWorkBooks = excelApp.querySubObject("Workbooks");

QAxObjectexcelWorkBook;

QAxObjectexcelWorkSheets;

QAxObjectexcelWorkSheet;

//

if (excelWorkBooks) {

QFile file(strFilePath);

if (file.exists()) {

excelWorkBook = excelWorkBooks->querySubObject("Open(const QString&)"strFilePath);

else {

excelWorkBook = excelWorkBooks->querySubObject("Add()");

}

if (excelWorkBook) {

excelWorkSheets = excelWorkBook->querySubObject("Sheets");

else {

QMessageBox::information(0, tr("提示信息:"), tr("QAxObject workbook 初始化失败!"));

}

else {

QMessageBox::information(0, tr("提示信息:"), tr("初始化Excel错误,可能没有安装Office组件!"));

}

excelWorkSheet = excelWorkSheets->querySubObject("Item(int index)", 1);

excelWorkSheet->setProperty("Name""mydata");

QAxObjectexcelSheetTab = excelWorkSheet->querySubObject("Tab");

excelSheetTab->setProperty("ColorIndex", 4);

QAxObjectexcelSheetRange;

QAxObjectexcelSheetInterior;

QAxObjectexcelSheetFont;

//1, 2013-1-25 12:00:00, 武汉, wuhan

excelSheetRange = excelWorkSheet->querySubObject("Cells(1, 1)");

excelSheetRange->dynamicCall("SetValue(const QVariant&)"QVariant(1));

excelSheetRange->setProperty("HorizontalAlignment", 1);

excelSheetRange->setProperty("ColumnWidth", 10);

excelSheetRange->setProperty("RowHeight", 40);

excelSheetInterior = excelSheetRange->querySubObject("Interior");

excelSheetInterior->setProperty("ColorIndex"QVariant(3));

excelSheetFont = excelSheetRange->querySubObject("Font");

excelSheetFont->setProperty("Bold"true);

excelSheetRange = excelWorkSheet->querySubObject("Cells(1, 2)");

excelSheetRange->dynamicCall("SetValue(const QVariant&)"QVariant("2013-1-25 12:00:00"));

excelSheetRange->setProperty("NumberFormatLocal""yyyy-mm-dd hh:mm:ss;@");

excelSheetRange->setProperty("HorizontalAlignment", 2);

excelSheetRange->setProperty("ColumnWidth", 30);

excelSheetInterior = excelSheetRange->querySubObject("Interior");

excelSheetInterior->setProperty("ColorIndex"QVariant(4));

excelSheetFont = excelSheetRange->querySubObject("Font");

excelSheetFont->setProperty("Italic"true);

excelSheetRange = excelWorkSheet->querySubObject("Cells(1, 3)");

excelSheetRange->dynamicCall("SetValue(const QVariant&)"QVariant(tr("武汉")));

excelSheetRange->setProperty("HorizontalAlignment", 3);

excelSheetRange->setProperty("ColumnWidth", 20);

excelSheetInterior = excelSheetRange->querySubObject("Interior");

excelSheetInterior->setProperty("ColorIndex"QVariant(5));

excelSheetFont = excelSheetRange->querySubObject("Font");

excelSheetFont->setProperty("Name""Verdana");

excelSheetRange = excelWorkSheet->querySubObject("Cells(1, 4)");

excelSheetRange->dynamicCall("SetValue(const QVariant&)"QVariant("wuhan"));

excelSheetRange->setProperty("HorizontalAlignment", 4);

excelSheetRange->setProperty("ColumnWidth", 30);

excelSheetInterior = excelSheetRange->querySubObject("Interior");

excelSheetInterior->setProperty("ColorIndex"QVariant(6));

excelSheetFont = excelSheetRange->querySubObject("Font");

excelSheetFont->setProperty("ColorIndex"QVariant(7));

//2, 2013-1-25 12:00:00, 广州, guangzhou

excelSheetRange = excelWorkSheet->querySubObject("Cells(2, 1)");

excelSheetRange->dynamicCall("SetValue(const QVariant&)"QVariant(2));

excelSheetRange->setProperty("HorizontalAlignment", 1);

excelSheetRange->setProperty("RowHeight", 40);

excelSheetInterior = excelSheetRange->querySubObject("Interior");

excelSheetInterior->setProperty("ColorIndex"QVariant(3));

excelSheetFont = excelSheetRange->querySubObject("Font");

excelSheetFont->setProperty("Bold"true);

excelSheetRange = excelWorkSheet->querySubObject("Cells(2, 2)");

excelSheetRange->dynamicCall("SetValue(const QVariant&)"QVariant("2013-1-25 12:00:00"));

excelSheetRange->setProperty("NumberFormatLocal""yyyy-mm-dd hh:mm:ss;@");

excelSheetRange->setProperty("HorizontalAlignment", 2);

excelSheetInterior = excelSheetRange->querySubObject("Interior");

excelSheetInterior->setProperty("ColorIndex"QVariant(4));

excelSheetFont = excelSheetRange->querySubObject("Font");

excelSheetFont->setProperty("Italic"true);

excelSheetRange = excelWorkSheet->querySubObject("Cells(2, 3)");

excelSheetRange->dynamicCall("SetValue(const QVariant&)"QVariant(tr("广州")));

excelSheetRange->setProperty("HorizontalAlignment", 3);

excelSheetInterior = excelSheetRange->querySubObject("Interior");

excelSheetInterior->setProperty("ColorIndex"QVariant(5));

excelSheetFont = excelSheetRange->querySubObject("Font");

excelSheetFont->setProperty("Name""Verdana");

excelSheetRange = excelWorkSheet->querySubObject("Cells(2, 4)");

excelSheetRange->dynamicCall("SetValue(const QVariant&)"QVariant("guangzhou"));

excelSheetRange->setProperty("HorizontalAlignment", 4);

excelSheetInterior = excelSheetRange->querySubObject("Interior");

excelSheetInterior->setProperty("ColorIndex"QVariant(6));

excelSheetFont = excelSheetRange->querySubObject("Font");

excelSheetFont->setProperty("ColorIndex"QVariant(7));

//3, 2013-1-25 12:00:00, 深圳, shenzhen

excelSheetRange = excelWorkSheet->querySubObject("Cells(3, 1)");

excelSheetRange->dynamicCall("SetValue(const QVariant&)"QVariant(3));

excelSheetRange->setProperty("HorizontalAlignment", 1);

excelSheetRange->setProperty("RowHeight", 40);

excelSheetInterior = excelSheetRange->querySubObject("Interior");

excelSheetInterior->setProperty("ColorIndex"QVariant(3));

excelSheetFont = excelSheetRange->querySubObject("Font");

excelSheetFont->setProperty("Bold"true);

excelSheetRange = excelWorkSheet->querySubObject("Cells(3, 2)");

excelSheetRange->dynamicCall("SetValue(const QVariant&)"QVariant("2013-1-25 12:00:00"));

excelSheetRange->setProperty("NumberFormatLocal""yyyy-mm-dd hh:mm:ss;@");

excelSheetRange->setProperty("HorizontalAlignment", 2);

excelSheetInterior = excelSheetRange->querySubObject("Interior");

excelSheetInterior->setProperty("ColorIndex"QVariant(4));

excelSheetFont = excelSheetRange->querySubObject("Font");

excelSheetFont->setProperty("Italic"true);

excelSheetRange = excelWorkSheet->querySubObject("Cells(3, 3)");

excelSheetRange->dynamicCall("SetValue(const QVariant&)"QVariant(tr("深圳")));

excelSheetRange->setProperty("HorizontalAlignment", 3);

excelSheetInterior = excelSheetRange->querySubObject("Interior");

excelSheetInterior->setProperty("ColorIndex"QVariant(5));

excelSheetFont = excelSheetRange->querySubObject("Font");

excelSheetFont->setProperty("Name""Verdana");

excelSheetRange = excelWorkSheet->querySubObject("Cells(3, 4)");

excelSheetRange->dynamicCall("SetValue(const QVariant&)"QVariant("shenzhen"));

excelSheetRange->setProperty("HorizontalAlignment", 4);

excelSheetInterior = excelSheetRange->querySubObject("Interior");

excelSheetInterior->setProperty("ColorIndex"QVariant(6));

excelSheetFont = excelSheetRange->querySubObject("Font");

excelSheetFont->setProperty("ColorIndex"QVariant(7));

//

excelApp.setProperty("DisplayAlerts", 0);

excelWorkBook->dynamicCall("SaveAs(const QString&)"strFilePath);

excelWorkBook->dynamicCall("Close(Boolean)"false);

excelApp.dynamicCall("Quit()");

4. 使用QPrinter导出.pdf文件

QString strFilePath = "C:/test.pdf";

QPrinter printer;

printer.setOutputFormat(QPrinter::PdfFormat);

printer.setOutputFileName(strFilePath);

QPainter painter;

if (!painter.begin(&printer)) {

QMessageBox::information(NULLtr("提示信息:"), tr("打开.pdf文件失败!"));

return;

}

//第一页

QString strPrint = QString("1   2013-1-25 12:00:00   %1   wuhan").arg(tr("武汉"));

QPoint point(10, 10);

painter.drawText(pointstrPrint);

strPrint.clear();

strPrint = QString("2   2013-1-25 12:00:00   %1   guanzhou").arg(tr("广州"));

point.setY(30);

painter.drawText(pointstrPrint);

strPrint.clear();

strPrint = QString("3   2013-1-25 12:00:00   %1   shenzhen").arg(tr("深圳"));

point.setY(50);

painter.drawText(pointstrPrint);

//第二页

printer.newPage();

strPrint = QString("1   2013-1-25 12:00:00   %1   wuhan").arg(tr("武汉"));

point.setY(10);

painter.drawText(pointstrPrint);

strPrint.clear();

strPrint = QString("2   2013-1-25 12:00:00   %1   guanzhou").arg(tr("广州"));

point.setY(50);

painter.drawText(pointstrPrint);

strPrint.clear();

strPrint = QString("3   2013-1-25 12:00:00   %1   shenzhen").arg(tr("深圳"));

point.setY(90);

painter.drawText(pointstrPrint);

painter.end();

<think>嗯,用户想要用C++的Excel库将xlsx文件转换为PDF的示例代码。这个问题其实有点复杂,因为常见的Excel处理库主要专注数据处理,很少直接支持转换成PDF格式。我看了看用户提供的几个引用资料,其中提到了OpenXLSXXLSXIO,它们都是处理Excel文件的库,但似乎都没有直接的PDF导出功能。用户可能正在开发一个需要将Excel报表导出PDF格式的功能,可能是为了打印或存档。ta可能已经尝试过一些库但没找到解决方案,所以来寻求示例代码。不过可惜的是,从目前的库功能来看,直接转换确实不太现实。考虑到用户的需求本质,其实应该分成两步:先用库读取Excel内容,再调用专门的PDF生成工具。这个思路更可行。我准备推荐用户使用libreoffice命令行工具作为最稳妥的方案,因为微软格式转换本身就复杂,很多商业库都要付费。如果用户坚持要代码级实现,可能需要引入Qt或者PDF报表库。用户可能没意识到这个需求的技术复杂度,ta可能期待有个简单的API直接转换。我得在回复中明确说明技术限制,避免用户浪费时间。同时提供几种替代方案:最简单的是调用外部工具,中等方案是用报表库重绘,复杂方案是用跨平台框架。这样用户可以根据实际需求选择。对了,还得提醒用户注意格式兼容性问题。Excel文件里的图表、条件格式转换后可能会丢失,这点必须提前说明,不然用户实现后可能会失望。最后主动询问需要哪种实现方式,这样能更快帮用户解决问题。</think> 根据引用内容和技术调研,以下是实现XLSXPDF的可靠方案及示例代码框架: --- ### **技术方案分析** 1. **OpenXLSX/LibXL等库局限性** 引用[1][^1]中的OpenXLSX和类似库(如LibXL)专注于Excel文件读写,**不直接支持PDF导出功能**。需结合第三方PDF生成库实现。 2. **推荐分步实现** ```mermaid graph LR A[读取XLSX数据] --> B[提取内容/样式] B --> C[用PDF库渲染] C --> D[生成PDF] ``` --- ### **示例代码(使用LibXL + PoDoFo库)** ```cpp #include <libxl.h> #include <podofo/podofo.h> using namespace libxl; using namespace PoDoFo; void convertXlsxToPdf(const std::string& xlsxPath, const std::string& pdfPath) { // 1. 读取XLSX Book* book = xlCreateBook(); if (book->load(xlsxPath.c_str())) { Sheet* sheet = book->getSheet(0); // 2. 创建PDF文档 PdfMemDocument pdf; PdfPage* page = pdf.GetPages().CreatePage(PdfPage::CreateStandardPageSize(ePdfPageSize_A4)); PdfPainter painter; painter.SetPage(page); // 3. 提取Excel内容(示例:仅提取文本) for (int row = 0; row < sheet->lastRow(); ++row) { for (int col = 0; col < sheet->lastCol(); ++col) { CellType cellType = sheet->cellType(row, col); if (cellType == CELLTYPE_STRING) { std::string text = sheet->readStr(row, col); painter.DrawText(text.c_str(), col * 50, page->GetPageSize().GetHeight() - (row * 20)); } } } painter.FinishPage(); pdf.Save(pdfPath.c_str()); } book->release(); } ``` --- ### **替代方案建议** 1. **调用外部工具(无需编码)** 安装LibreOffice,通过命令行转换: ```bash libreoffice --headless --convert-to pdf input.xlsx ``` 2. **.NET方案(需Windows环境)** 使用Microsoft.Office.Interop: ```csharp Excel.Application excel = new Excel.Application(); excel.Workbooks.Open("input.xlsx").ExportAsFixedFormat(XlFixedFormatType.xlTypePDF, "output.pdf"); ``` 3. **Qt框架方案** ```cpp QAxObject excel("Excel.Application"); QAxObject workbook = excel.querySubObject("Workbooks")->querySubObject("Open(const QString&)", "input.xlsx"); workbook->querySubObject("ExportAsFixedFormat", "output.pdf"); ``` --- ### **关键注意事项** 1. **格式兼容性** - 复杂表格/图表可能导致样式丢失 - 建议优先测试简单文件 2. **依赖管理** - 使用PoDoFo需链接`libpodofo-dev` - LibXL为商业库(测试版免费) 3. **跨平台限制** Office自动化方案仅支持Windows,推荐方案1/3跨平台使用 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值