自己从网上下载了一个例子:https://files-cdn.cnblogs.com/files/warmlight/qword.rar
里面有一个完整例子(导出word的具体操作),一个单独的类(根据模板导出word)。
如果wordhandler.h和wordhandler.cpp有问题,一般是文件编码类型的问题。使用wordhandler类时,一定要声明wordhandler为成员变量或全局变量,因为用到了线程,如果是局部变量,会报错。使用时,调用StartExport函数传入参数,再调用start函数启动线程即可。当然,需要根据自己的情况更改要传入什么。
声明:使用例子时,如果产生不可预料的情况(删库跑路,服务器崩溃),本人概不负责。另外,如果调用不成功,也不关我的事。拜拜~
添加一些微操代码。
具体查看微软api(2020.05.21链接还可用):https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.office.interop.word?view=word-pia
因为最近项中需要生成报表,所以网上查了资料,因为VB看不懂所以总结的也不多,在实现中没有使用标签只是以光标的位置来插入,包括:创建文件,排版方式,添加文字,添加图片,添加表格,表格添加文字(图片),光标移动到尾部,光标跳转(类似tab)等。
1 pro文件中添加 QT += axcontainer 2 3 QAxObject *m_pWord; //指向整个Word应用程序 4 QAxObject *m_pWorkDocuments; //指向文档集,Word有很多文档 5 QAxObject *m_pWorkDocument; //指向m_sFile对应的文档,就是要操作的文档 6 7 /* 8 创建word 9 */ 10 11 void MainWindow::open() 12 { 13 m_pWord = new QAxObject(); 14 bool flag = m_pWord->setControl( "Word.Application" ); 15 if(!flag) 16 { 17 return; 18 } 19 m_pWord->setProperty("Visible", true); 20 21 QAxObject *document = m_pWord->querySubObject("Documents"); 22 if(!document) 23 { 24 return ; 25 } 26 27 //获取当前激活的文档 28 m_pWorkDocument = m_pWord->querySubObject("ActiveDocument"); 29 } 30 31 /* 32 * 排版方式 33 * 纵行、横行 34 */ 35 36 void MainWindow::setype(bool type) 37 { 38 QAxObject* selection = m_pWord->querySubObject("Selection"); 39 if(!selection) 40 { 41 return; 42 } 43 if(type) 44 { 45 selection->querySubObject("PageSetup")->setProperty("Orientation","wdOrientLandscape"); 46 }else{ 47 selection->querySubObject("PageSetup")->setProperty("Orientation","wdOrientPortrait"); 48 } 49 } 50 51 /* 52 * 获取页宽 53 */ 54 55 int MainWindow::pageWidth() 56 { 57 int width; 58 QAxObject* selection = m_pWord->querySubObject("Selection"); 59 if(!selection) 60 { 61 return; 62 } 63 width = selection->querySubObject("PageSetup")->property("PageWidth").toInt();; 64 return width; 65 } 66 67 /* 68 *设置字号 69 */ 70 71 void MainWindow::setFontSize(int size) 72 { 73 QAxObject* selection = m_pWord->querySubObject("Selection"); 74 if(!selection) 75 { 76 return; 77 } 78 selection->querySubObject("Font")->setProperty("Size",size); 79 } 80 81 /* 82 设置对齐方式 83 */ 84 85 void MainWindow::setAlignment(int index) 86 { 87 QAxObject *selection = m_pWord->querySubObject("Selection"); 88 if(!selection) 89 { 90 return; 91 } 92 if(index == 0) 93 { 94 selection->querySubObject("ParagraphFormat")->setProperty("Alignment","wdAlignParagraphCenter"); 95 } 96 if(index == 1) 97 { 98 selection->querySubObject("ParagraphFormat")->setProperty("Alignment","wdAlignParagraphJustify"); 99 } 100 if(index == 2) 101 { 102 selection->querySubObject("ParagraphFormat")->setProperty("Alignment","wdAlignParagraphRight"); 103 } 104 if(index == 3) 105 { 106 selection->querySubObject("ParagraphFormat")->setProperty("Alignment","wdAlignParagraphLeft"); 107 } 108 } 109 110 111 /* 112 插入文字 113 */ 114 115 void MainWindow::typeText(QString text) 116 { 117 QAxObject* selection = m_pWord->querySubObject("Selection"); 118 if(!selection) 119 { 120 return; 121 } 122 selection->dynamicCall("TypeText(const QString&)",text); 123 } 124 /* 125 插入图片 126 */ 127 128 void MainWindow::AddPicture(QString file) 129 { 130 QAxObject* selection = m_pWord->querySubObject("Selection"); 131 if(!selection) 132 { 133 return; 134 } 135 QString filename = file; 136 filename.replace("/","\\"); 137 QAxObject *Inlineshapes = selection->querySubObject("InlineShapes"); 138 Inlineshapes->dynamicCall("AddPicture(const QString&)",filename); 139 delete Inlineshapes; 140 } 141 142 /* 143 插入回车 144 */ 145 146 void MainWindow::insertEnter() 147 { 148 QAxObject* selection = m_pWord->querySubObject("Selection"); 149 if(!selection) 150 { 151 return; 152 } 153 selection->dynamicCall("TypeParagraph(void)"); 154 } 155 156 /* 157 * 光标移到末尾,跳出单元格 158 */ 159 void MainWindow::moveForEnd() 160 { 161 QAxObject* selection = m_pWord->querySubObject("Selection"); 162 QVariantList params; 163 params.append(6); 164 params.append(0); 165 selection->dynamicCall("EndOf(QVariant&, QVariant&)", params).toInt(); 166 } 167 168 /* 169 创建表格 170 QStringList headList 添加表头 171 */ 172 173 QAxObject* MainWindow::createTable(int row, int column,QStringList headList) 174 { 175 QAxObject* selection = m_pWord->querySubObject("Selection"); 176 if(!selection) 177 { 178 return false; 179 } 180 selection->dynamicCall("InsertAfter(QString&)", "\r\n"); 181 182 QAxObject *range = selection->querySubObject("Range"); 183 QAxObject *tables = m_pWorkDocument->querySubObject("Tables"); 184 QAxObject *table = tables->querySubObject("Add(QVariant,int,int)",range->asVariant(),row,column); 185 186 table->setProperty("Style","网格型"); 187 //表格自动拉伸列 0固定 1根据内容调整 2 根据窗口调整 188 table->dynamicCall("AutoFitBehavior(WdAutoFitBehavior)", 2); 189 190 //设置表头 191 for(int i=0;i<headList.size();i++) 192 { 193 table->querySubObject("Cell(int,int)",1,i+1)->querySubObject("Range")->dynamicCall("SetText(QString)", headList.at(i)); 194 //加粗 195 table->querySubObject("Cell(int,int)",1,i+1)->querySubObject("Range")->dynamicCall("SetBold(int)", true); 196 } 197 return table; 198 } 199 200 /* 201 填充表格 202 */ 203 204 void MainWindow::setCellText(QAxObject *table, int row, int column, QString text) 205 { 206 QAxObject* range = table->querySubObject("Cell(int, int)",row+1,column+1)->querySubObject("Range"); 207 if( range) 208 { 209 return; 210 } 211 212 range->dynamicCall("SetText(QString)", text); 213 } 214 215 /* 216 表格插入图片 217 */ 218 void MainWindow::setAddPicture(QAxObject *table, int row, int column, QString picPath) 219 { 220 QAxObject* range = table->querySubObject("Cell(int, int)",row+1,column+1)->querySubObject("Range"); 221 if(!range) 222 { 223 return; 224 } 225 range->querySubObject("InlineShapes")->dynamicCall("AddPicture(const QString&)",picPath); 226 } 227 228 /* 229 光标跳转,类似表格中的tab 230 */ 231 232 void MainWindow::moveRight() 233 { 234 QAxObject* selection = m_pWord->querySubObject("Selection"); 235 if(!selection) 236 { 237 return; 238 } 239 selection->dynamicCall("MoveRight(int)",1); 240 } 241 242 /*特殊样例*/ 243 244 245 246 void MainWindow::Example() 247 { 248 QStringList header; 249 250 newTable(1,2,header);//创建表格 251 252 typeText(tr("文字1"));//添加文字 253 insertEnter();//换行 254 insertText(""); 255 AddPicture("图像1");//插入图片 256 257 moveRight();//将光标插入到下个单元格中 258 259 typeText(tr("文字2")); 260 insertEnter(); 261 insertText(""); 262 AddPicture("图像2"); 263 264 moveForEnd();//光标跳出表格 265 266 /*然后,可以做其他操作了*/ 267 }