QT生成Word PDF文檔

需求:將軟件處理的結果保存為一個報告文檔,文檔中包含表格、圖片、文字,格式為word的.doc和.pdf。生成word是為了便于用戶編輯。

開發環境:qt4.8.4+vs2010

在qt的官網上對于pdf的操作介紹如下:http://qt-project.org/wiki/Handling_PDF 。即通過QPrinter類來創建pdf;還有通過第三方庫PoDoFo、Hummus。本文主要介紹的是用QPrinter類來創建pdf。

在qt的官網上對于word的操作介紹如下:http://qt-project.org/wiki/Handling_Microsoft_Word_file_format 。即通過Word本身COM組件的形式,Qt的ActiveX框架來實現;還有通過xml來實現。本文主要介紹Qt ActiveX和html格式生成word文檔。

下面舉例詳細說明pdf和word文檔的生成:

1.pdf的生成

pdf文檔里要求有表格、圖片、文字,參考博客:http://blog.sina.com.cn/s/blog_a6fb6cc90101gvnx.html。里面有介紹文字、圖片、表格分別是怎樣通過QPrinter類來實現的。但是遇到一個麻煩就是怎樣把這三種格式的東西放在一起而且排版好呢,用上述博客里的方法嘗試之后,最終確定使用第三種生成表格(html格式)的方式來得到:
?

QPrinter printer_text;
printer_text.setOutputFormat(QPrinter::PdfFormat);
printer_text.setOutputFileName(pdfname);//pdfname為要保存的pdf文件名QTextDocument text_document;
QString html = GeneratePicWord();//自定義的函數,用來生成html代碼text_document.setHtml(html);
text_document.print(&printer_text);
QTextBlock it = text_document.end();

GeneratePicWord()函數的內容大致如下:

QString html;
//文字部分
QDateTime current_date_time = QDateTime::currentDateTime();
QString current_date = current_date_time.toString("yyyy-MM-dd hh:mm:ss ddd");
html += "<h2 align=\"center\">育種管理模塊</h2>";
html += "<h4 align=\"center\">" + current_date + "</h2><br>";
//圖片部分
html += "<img align=\"middle\" src = \"" + imagepath + "\"  width=\"600\" height=\""+QString::number(showHeight) + "\"/><br>" ;
//表格部分
html +=  "<table align=\"center\" border=\"0.2\" cellspacing=\"0\" cellpadding=\"0\"  style=\"width: 100%; height: 100%;\">";
html +="<tr>";  
QString fieldname;
for ( int i = 0; i < fieldCount; ++i)
{
fieldname = fields[i].name();
html +="<td bgcolor=\"Silver\">" + fieldname + "</td>";
}
html +="</tr></table>";

?

2.word的生成

word的生成可以用QActiveX來實現。博客:http://www.360doc.com/content/14/0227/16/7918060_356177077.shtml里說的比較詳細了。首先新建一個模板文件Id.dot,在模板文件中事先“插入”-》“書簽”,如下圖所示:

?

書簽主要在表格的第一行前兩列,分別是code,ndvi。表格下面有兩個書簽,分別是pic,pic2。用代碼插入需要的文字和圖片:

	QAxWidget *word = new QAxWidget("Word.Application",this, Qt::MSWindowsOwnDC);word->setProperty("Visible", true);//get all documentsQAxObject *documents = word->querySubObject("Documents");//build a tempetate with .dot filedocuments->dynamicCall("Add(QString)", QString::fromLocal8Bit("F:/Id.dot"));//get the current actived documentQAxObject *document = word->querySubObject("ActiveDocument");QString code = "code";QAxObject *bookmark_code = document->querySubObject("Bookmarks(QVariant)", "code");if ( !bookmark_code->isNull()){bookmark_code->dynamicCall("Select(void)");bookmark_code->querySubObject("Range")->setProperty("Text", "textg");}QAxObject *bookmark_ndvi = document->querySubObject("Bookmarks(QVariant)", "ndvi");if ( !bookmark_ndvi->isNull()){bookmark_ndvi->dynamicCall("Select(void)");bookmark_ndvi->querySubObject("Range")->setProperty("Text", "ndvi");}QAxObject *bookmark_ndvi2 = document->querySubObject("Bookmarks(QVariant)", "ndvi");if ( !bookmark_ndvi2->isNull()){bookmark_ndvi2->dynamicCall("Select(void)");bookmark_ndvi2->querySubObject("Range")->setProperty("Text", "ndvi2");}QAxObject *bookmark_pic = document->querySubObject("Bookmarks(QVariant)", "pic");if ( !bookmark_pic->isNull()){bookmark_pic->dynamicCall("Select(void)");QAxObject *shapes = document->querySubObject("InlineShapes");shapes->dynamicCall("AddPicture(Const QString&)", "F:\\CND.jpg");}document->dynamicCall("SaveAs (const QString&)", QString("F:/testword.doc"));document->dynamicCall("Close(boolean)", false);word->dynamicCall("Quit()");

只會插入到第一行已經預設好書簽的位置。對于有多條數據,還不知道怎樣動 態創建 書簽來插入數據。在網上找了些資料,未能很好的通過模板書簽的方式來解決這兩個問題。
那么想通過上面生成pdf時的html能不能直接保存為.doc文件呢?答案是能!而且節約了很多時間,只需一次生成固定格式的html,就可以保存為pdf和doc文件,多好的事情啊,為什么要用Qt ActiveX呢。

當然不能直接把生成pdf的文件名改成doc就行了,還需要做下面一個事情:
?

QString html;
html += "<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:w=\"urn:schemas-microsoft-com:office:word\" xmlns=\"http://www.w3.org/TR/REC-html40\"><head><meta http-equiv=Content-Type  content=\"text/html; charset=gb2312\" >"; //這句可加可不加。主要是因為我在word里把doc另存為html文件后,看到有這么個頭標簽,由此想到直接將html文檔保存為doc文件。
html =GeneratePicWord();//該函數同生產pdf文檔的一樣QFile outFile(docname);
outFile.open(QIODevice::WriteOnly | QIODevice::Append );
QTextStream ts(&outFile);
ts<<html<<endl;

主要在后面那4行,將html輸出到doc文件中去。

得到的結果如圖:

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36014.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36014.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36014.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華為認證 | H3C廠商證書,含金量有多高?

華為H3C認證是中國第一家建立國際規范的完整的網絡技術認證體系&#xff0c;它的作用是不言而喻的&#xff0c;工作上它能給你帶來技能加分。 那么H3C認證網絡工程師證書含金量怎么樣呢&#xff1f;下面我們就來了解一下吧。 01 H3C認證網絡工程師證書含金量 全面覆蓋H3C相關…

微服務Eureka注冊中心

目錄 一、Eureka的結構和作用 二、搭建eureka-server 三、服務注冊 四、服務發現 假如我們的服務提供者user-service部署了多個實例&#xff0c;如圖&#xff1a; 存在的問題&#xff1a; order-service在發起遠程調用的時候&#xff0c;該如何得知user-service實例的ip地址…

深度學習快速入門系列---損失函數

在深度學習中&#xff0c;損失函數的作用是量化預測值和真實值之間的差異&#xff0c;使得網絡模型可以朝著真實值的方向預測&#xff0c;損失函數通過衡量模型預測結果與真實標簽之間的差異&#xff0c;反映模型的性能。同時損失函數作為一個可優化的目標函數&#xff0c;通過…

10個微服務設計模式

微服務設計模式是一種指導微服務架構設計和開發的一系列原則和實踐。微服務設計模式的目的是為了解決微服務架構中遇到的一些常見的問題和挑戰&#xff0c;比如服務劃分、服務通信、服務治理、服務測試等。微服務設計模式可以幫助我們構建出高效、可靠、可擴展、可維護的微服務…

九耶丨閣瑞鈦倫特-井字棋html5代碼

你想了解關于井字棋&#xff08;Tic-Tac-Toe&#xff09;的HTML代碼嗎&#xff1f;以下是一個簡單的井子棋的HTML代碼示例&#xff1a; <!DOCTYPE html> <html> <head><title>Tic-Tac-Toe</title><style>.board {display: flex;flex-wrap…

使用AT命令操作Modem 3G/4G模塊

1. 引言 AT命令是一種通信協議&#xff0c;用于控制和配置各種設備&#xff0c;尤其在通信領域中具有重要性。它的名稱來源于"ATtention"&#xff08;注意&#xff09;&#xff0c;因為命令通常以"AT"開頭。AT命令最早被用于調制解調器&#xff0c;用于與…

redis學習筆記(三)

文章目錄 key操作&#xff08;1&#xff09;查找鍵&#xff08;2&#xff09;判斷鍵是否存在&#xff08;3&#xff09;查看鍵的的值的數據類型&#xff08;4&#xff09;刪除鍵以及鍵對應的值&#xff08;5&#xff09;查看鍵的有效期&#xff08;6&#xff09;設置key的有效期…

springboot整合rabbitmq

rabbitmq的七種模式 Hello word 客戶端引入依賴 <!--rabbitmq 依賴客戶端--><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.8.0</version></dependency> 生產者 imp…

STM32 LoRa源碼解讀

目錄結構&#xff1a; SX1278 |-- include | |-- fifo.h | |-- lora.h | |-- platform.h | |-- radio.h | |-- spi.h | |-- sx1276.h | |-- sx1276Fsk.h | |-- sx1276FskMisc.h | |-- sx1276Hal.h | |-- sx1276LoRa.h | -- sx1276LoRaMisc.h – src |-- fifo.c |-- lora.c |-- …

【解析postman工具的使用---基礎篇】

postman前端請求詳解 主界面1.常見類型的接口請求1.1 查詢參數的接口請求1.1.1 什么是查詢參數?1.1.2 postman如何請求 1.2 ?表單類型的接口請求1.2.1 復習下http請求1.2.2? 什么是表單 1.3 上傳文件的表單請求1.4? json類型的接口請求 2. 響應接口數據分析2.1 postman的響…

紅帽RHCA考試內容解析

紅帽RHCA考試內容解析&#xff1a;最新的RHCA有3大方向體系&#xff0c;考試內容分別為&#xff1a; 一、Platform 平臺技術 RH442&#xff1a;性能調優 使用紅帽企業Linux和紅帽網絡提供的工具來學習Linux的性能調優和規劃的技巧及方法&#xff0c;學習系統架構&#xff0c;…

什么是DNS欺騙及如何進行DNS欺騙

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、什么是 DNS 欺騙&#xff1f;二、開始1.配置2.Ettercap啟動3.操作 總結 前言 我已經離開了一段時間&#xff0c;我現在回來了&#xff0c;我終于在做一個教…

【AI】p54-p58導航網絡、藍圖和AI樹實現AI隨機移動和跟隨移動、靠近玩家揮拳、AI跟隨樣條線移動思路

p54-p58導航網絡、藍圖和AI樹實現AI隨機移動和跟隨移動、靠近玩家揮拳、AI跟隨樣條線移動思路 p54導航網格p55藍圖實現AI隨機移動和跟隨移動AI Move To&#xff08;AI進行移動&#xff09;Get Random Pointln Navigable Radius&#xff08;獲取可導航半徑內的隨機點&#xff09…

Java基礎十 - 設計模式

一、單例 1. 創建 餓漢式 package basic;public class ESingleton {// 先私有化靜態實例private static ESingleton eSingleton new ESingleton();// 私有化構造方法&#xff0c;防止外部實例化private ESingleton(){};// 提供全局訪問方法public static ESingleton geteSi…

時序預測 | MATLAB實現基于LSTM長短期記憶神經網絡的時間序列預測-遞歸預測未來(多指標評價)

時序預測 | MATLAB實現基于LSTM長短期記憶神經網絡的時間序列預測-遞歸預測未來(多指標評價) 目錄 時序預測 | MATLAB實現基于LSTM長短期記憶神經網絡的時間序列預測-遞歸預測未來(多指標評價)預測結果基本介紹程序設計參考資料 預測結果 基本介紹 Matlab實現LSTM長短期記憶神經…

識別和應對內存抖動

關于作者&#xff1a;CSDN內容合伙人、技術專家&#xff0c; 從零開始做日活千萬級APP。 專注于分享各領域原創系列文章 &#xff0c;擅長java后端、移動開發、人工智能等&#xff0c;希望大家多多支持。 目錄 一、導讀二、概覽三、案例分析3.1 使用memory-profiler3.2 使用 cp…

磁粉制動器離合器收放卷應用介紹

張力控制系統的開環閉環應用介紹,請查看下面文章鏈接: PLC張力控制(開環閉環算法分析)_張力控制plc程序實例_RXXW_Dor的博客-CSDN博客里工業控制張力控制無處不在,也衍生出很多張力控制專用控制器,磁粉制動器等,本篇博客主要討論PLC的張力控制相關應用和算法,關于繞線…

什么是 fullgc

GC GC 全稱為garbage collection,中文含義為垃圾回收&#xff0c;在jvm中的含義為回收無用內存空間 Young space 中文名為年輕代或者新生代&#xff0c;為JVM 堆的一部分&#xff0c;由分代GC概念劃分而來&#xff0c;保存生命周期較短的對象 Tenured space 中文名為老年代…

APP外包開發的iOS開發語言

學習iOS開發需要掌握Swift編程語言和相關的開發工具、框架和技術。而學習iOS開發需要時間和耐心&#xff0c;尤其是對于初學者。通過堅持不懈的努力&#xff0c;您可以逐步掌握iOS開發技能&#xff0c;構建出功能豐富、優質的移動應用。今天和大家分享學習iOS開發的一些建議方法…

【數據結構系列】鏈表

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kuan 的首頁,持續學…