QT 数据导入导出:Excel、PDF导出及打印功能
qt 数据导入导出导出excel的pdf打印等因为是软件产品。最近在重构公司产品的数据导出模块发现很多新手开发者对Qt的数据输出方案总有些摸不着头脑。今天咱们就撸起袖子用最接地气的方式聊聊Qt里那些实用的数据导出姿势。准备好了吗直接上硬菜先说最常被问到的Excel导出。虽然Qt没内置Excel支持但Windows平台有个隐藏福利——QAxObject。别被这个奇怪的名字吓到其实就是用COM接口操作Office全家桶。上代码QAxObject* excel new QAxObject(Excel.Application); excel-dynamicCall(SetVisible(bool), false); // 默默干活不弹窗 QAxObject* workbooks excel-querySubObject(WorkBooks); workbooks-dynamicCall(Add); QAxObject* workbook excel-querySubObject(ActiveWorkBook); QAxObject* worksheet workbook-querySubObject(Worksheets(int), 1); // 填充表头 QAxObject* cell worksheet-querySubObject(Cells(int,int), 1, 1); cell-dynamicCall(SetValue(const QString), 设备编号); // 填数据时建议批量操作提升10倍速度不是梦 QAxObject* range worksheet-querySubObject(Range(const QString), A2:D100); QListQListQVariant dataBlock; for(auto device : deviceList) { dataBlock QListQVariant{device.id, device.name, ...}; } range-dynamicCall(SetValue(const QVariant), QVariant(dataBlock)); workbook-dynamicCall(SaveAs(const QString), D:/export.xlsx); workbook-dynamicCall(Close()); excel-dynamicCall(Quit());这段代码有几个坑得注意动态调用失败不报错建议用QAxBase::generateDocumentation检查可用方法、Excel进程可能残留任务管理器记得检查、Linux/macOS直接不兼容。所以真实项目建议用QXlsx这类跨平台库这里只是展示原理。转战PDF导出就舒服多了Qt原生支持杠杠的。核心思路是把内容画到QPrinter上QPrinter printer(QPrinter::HighResolution); printer.setOutputFormat(QPrinter::PdfFormat); printer.setOutputFileName(report.pdf); QPainter painter; if(!painter.begin(printer)) { qWarning() PDF初始化失败; return; } // 先画个标题 QFont titleFont(微软雅黑, 18); painter.setFont(titleFont); painter.drawText(100, 100, 设备检测报告); // 画表格数据建议用QTextDocument更省事 int yPos 150; for(int row0; rowmodel-rowCount(); row){ painter.drawText(100, yPos, model-data(model-index(row,0)).toString()); painter.drawText(300, yPos, model-data(model-index(row,1)).toString()); yPos 30; // 分页处理 if(yPos printer.pageRect().height()-50){ printer.newPage(); yPos 50; } } painter.end();这里有个隐藏技巧QPrinter的坐标系原点在页面左上角单位是1/72英寸。建议先用printer.pageRect()获取实际绘制区域避免内容被裁剪。遇到复杂表格建议上QTextDocument它能自动处理分页和样式。qt 数据导入导出导出excel的pdf打印等因为是软件产品。打印功能其实是PDF导出的亲兄弟代码相似度90%QPrintDialog dialog(printer, this); if(dialog.exec() QDialog::Accepted){ QPainter painter; if(painter.begin(printer)){ // 绘制逻辑和PDF导出完全一致 renderReport(painter); painter.end(); } }不过实际使用中要注意物理打印机的奇葩特性有的不支持自定义纸张尺寸、有的边距超大。建议在打印前用printer.getPageLayout()获取实际可用区域动态调整布局。踩过这些坑之后我总结出三个保命原则批量操作Excel避免频繁COM调用、PDF/打印共用渲染逻辑、所有输出功能都要加进度提示QProgressDialog你值得拥有。最后放个绝招——用QStandardItemModel作为数据中心所有导出模块都从这一个model取数据维护起来真香代码写多了你会发现Qt这套图形输出体系就像乐高积木掌握了painter和model这两个核心组件各种输出需求都能见招拆招。下次遇到导出需求别慌先泡杯咖啡打开QtAssistant剩下的都是搭积木的快乐时光了。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2413034.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!