Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to read and write docx files in Qt
Forum Updated to NodeBB v4.3 + New Features

How to read and write docx files in Qt

Scheduled Pinned Locked Moved Unsolved General and Desktop
35 Posts 9 Posters 27.0k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M mrjj
    14 Dec 2016, 21:21

    @Dante-Pham
    Ok. well DocX or something like it seems the way to go then.

    There is also the option of a pure VBA project. But the widgets you
    get there is not as advanced as Qt versions but the merging of docs would
    be easy.

    D Offline
    D Offline
    Dante Pham
    wrote on 15 Dec 2016, 02:02 last edited by
    #14

    @mrjj After doing some research I think DocX may just work. However, I have never had any exprience dealing with .dll files, let alone using it in Qt. Do you have any suggestions on how to use it ?

    M 1 Reply Last reply 15 Dec 2016, 07:47
    0
    • A Offline
      A Offline
      Andy314
      wrote on 15 Dec 2016, 07:20 last edited by
      #15

      Hallo, I think to understand the binary docx structrue is a very hard stuff.
      Much more easy it would be to use the AcxtiveX interface for word.
      Code something like this:

      Open Doc1, select all text, copy to clipboard, close Doc1
      open Doc2, set cursor to the end of the document, paste text, save doc2.

      The AciteveX interface of Qt is very good and I have much experiences with it. I use it for Excel (fill Tables) and for Access (open Report an export to PDF.

      You can hide the office windows by this task, so that the user sees nothing of you tasks.

      D 1 Reply Last reply 15 Dec 2016, 11:56
      1
      • D Dante Pham
        15 Dec 2016, 02:02

        @mrjj After doing some research I think DocX may just work. However, I have never had any exprience dealing with .dll files, let alone using it in Qt. Do you have any suggestions on how to use it ?

        M Offline
        M Offline
        mrjj
        Lifetime Qt Champion
        wrote on 15 Dec 2016, 07:47 last edited by mrjj
        #16

        @Dante-Pham
        Hi.
        Using a DLL involves loading it and resolve symbols.
        Meaning to be able to run functions from it.
        You also need a .h file. (didnt see any?)
        You should also get a copy of visual studio as .NET is best/easy/to used from that IDE.
        Then you shall google calling a .net DLL from C++ as there might be other things to look out for.

        Maybe @VRonin knows a easier way to use the .DLL in Qt.

        Update:
        Its available via Nuget
        so it should be easy to install and try the samples directly in VS.
        Then try to mix with Qt.

        Update 2:
        Using VBA, this short code can merge all docs from a folder.

        Sub MergeDocs()
            Dim rng As Range
            Dim MainDoc As Document
            Dim strFile As String, strFolder As String
            Dim Count As Long
            With Application.FileDialog(msoFileDialogFolderPicker)
                .Title = "Pick folder"
                .AllowMultiSelect = False
                If .Show Then
                    strFolder = .SelectedItems(1) & Application.PathSeparator
                Else
                    Exit Sub
                End If
            End With
            Set MainDoc = Documents.Add
            strFile = Dir$(strFolder & "*.docx") ' can change to .doc
            Count = 0
            Do Until strFile = ""
                Count = Count + 1
                Set rng = MainDoc.Range
                With rng
                    .Collapse 0
                    If Count > 1 Then
                        .InsertBreak 2
                        .End = MainDoc.Range.End
                        .Collapse 0
                    End If
                    .InsertFile strFolder & strFile
                End With
                strFile = Dir$()
            Loop
            MsgBox ("Files are merged")
        lbl_Exit:
            Exit Sub
        End Sub
        

        Credits to gmaxey.
        http://www.vbaexpress.com/forum/showthread.php?51797-Macro-to-merge-mulitple-word-doc-into-one-word-doc

        D 1 Reply Last reply 15 Dec 2016, 13:05
        1
        • V Offline
          V Offline
          VRonin
          wrote on 15 Dec 2016, 07:58 last edited by
          #17

          For what you need to do I'd point you to http://stackoverflow.com/questions/18351829/merge-multiple-word-documents-into-one-open-xml/18352219#18352219

          Using .Net dlls in visual studio is extremely easy, just open the project property and add a reference to the .dll, then right click on the .cpp file you need to use the library in, go into properties and activate /clr in the "Common Language RunTime Support" field under general. Now you can use C++/CLI in it which is quite close to C#

          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
          ~Napoleon Bonaparte

          On a crusade to banish setIndexWidget() from the holy land of Qt

          1 Reply Last reply
          2
          • A Andy314
            15 Dec 2016, 07:20

            Hallo, I think to understand the binary docx structrue is a very hard stuff.
            Much more easy it would be to use the AcxtiveX interface for word.
            Code something like this:

            Open Doc1, select all text, copy to clipboard, close Doc1
            open Doc2, set cursor to the end of the document, paste text, save doc2.

            The AciteveX interface of Qt is very good and I have much experiences with it. I use it for Excel (fill Tables) and for Access (open Report an export to PDF.

            You can hide the office windows by this task, so that the user sees nothing of you tasks.

            D Offline
            D Offline
            Dante Pham
            wrote on 15 Dec 2016, 11:56 last edited by
            #18

            @Andy314 I am using ActiveX but i have no idea what functions are used to do what you describe. Would you mind giving me some examples ? How do I copy and paste ? How to hide the window ?

            A 1 Reply Last reply 19 Dec 2016, 12:27
            0
            • M mrjj
              15 Dec 2016, 07:47

              @Dante-Pham
              Hi.
              Using a DLL involves loading it and resolve symbols.
              Meaning to be able to run functions from it.
              You also need a .h file. (didnt see any?)
              You should also get a copy of visual studio as .NET is best/easy/to used from that IDE.
              Then you shall google calling a .net DLL from C++ as there might be other things to look out for.

              Maybe @VRonin knows a easier way to use the .DLL in Qt.

              Update:
              Its available via Nuget
              so it should be easy to install and try the samples directly in VS.
              Then try to mix with Qt.

              Update 2:
              Using VBA, this short code can merge all docs from a folder.

              Sub MergeDocs()
                  Dim rng As Range
                  Dim MainDoc As Document
                  Dim strFile As String, strFolder As String
                  Dim Count As Long
                  With Application.FileDialog(msoFileDialogFolderPicker)
                      .Title = "Pick folder"
                      .AllowMultiSelect = False
                      If .Show Then
                          strFolder = .SelectedItems(1) & Application.PathSeparator
                      Else
                          Exit Sub
                      End If
                  End With
                  Set MainDoc = Documents.Add
                  strFile = Dir$(strFolder & "*.docx") ' can change to .doc
                  Count = 0
                  Do Until strFile = ""
                      Count = Count + 1
                      Set rng = MainDoc.Range
                      With rng
                          .Collapse 0
                          If Count > 1 Then
                              .InsertBreak 2
                              .End = MainDoc.Range.End
                              .Collapse 0
                          End If
                          .InsertFile strFolder & strFile
                      End With
                      strFile = Dir$()
                  Loop
                  MsgBox ("Files are merged")
              lbl_Exit:
                  Exit Sub
              End Sub
              

              Credits to gmaxey.
              http://www.vbaexpress.com/forum/showthread.php?51797-Macro-to-merge-mulitple-word-doc-into-one-word-doc

              D Offline
              D Offline
              Dante Pham
              wrote on 15 Dec 2016, 13:05 last edited by
              #19

              @mrjj
              _ DocX only has a .DLL file and a documentation (.chm file) which is very unfinished. Lots of explainations in there are missing. After a while I found myself lost and my code messed up. I tried emailing the guy and he hasn't replied to me yet. Still, I did try adding library into Qt but it only takes .lib files. I found a documentation which show me how to add .dll files but it still didn't work after numerous tries
              _ I don't think Nuget and VBA are going to work for me because I don't know anything about them, which makes it difficult for me to modify and make tweaks to them ( which i am definitely going to ). Still, I have to do more research on them. I will be back very soon

              M 1 Reply Last reply 15 Dec 2016, 13:08
              1
              • D Dante Pham
                15 Dec 2016, 13:05

                @mrjj
                _ DocX only has a .DLL file and a documentation (.chm file) which is very unfinished. Lots of explainations in there are missing. After a while I found myself lost and my code messed up. I tried emailing the guy and he hasn't replied to me yet. Still, I did try adding library into Qt but it only takes .lib files. I found a documentation which show me how to add .dll files but it still didn't work after numerous tries
                _ I don't think Nuget and VBA are going to work for me because I don't know anything about them, which makes it difficult for me to modify and make tweaks to them ( which i am definitely going to ). Still, I have to do more research on them. I will be back very soon

                M Offline
                M Offline
                mrjj
                Lifetime Qt Champion
                wrote on 15 Dec 2016, 13:08 last edited by
                #20

                @Dante-Pham said in How to read and write docx files in Qt:

                Nuget

                That is just a system to easy get a lib for Visual Studio.
                Click and Play , so to speak :)

                1 Reply Last reply
                1
                • D Offline
                  D Offline
                  Dante Pham
                  wrote on 15 Dec 2016, 14:25 last edited by
                  #21

                  Ok so thanks to @VRonin , I found this https://youtu.be/qOfiiYP2JTI?t=2m11s , in which is pretty much what I'm looking for ! The only problem is I don't know C# . Is there any way we can do that in Qt in C++ ??

                  M V 2 Replies Last reply 15 Dec 2016, 14:39
                  0
                  • D Dante Pham
                    15 Dec 2016, 14:25

                    Ok so thanks to @VRonin , I found this https://youtu.be/qOfiiYP2JTI?t=2m11s , in which is pretty much what I'm looking for ! The only problem is I don't know C# . Is there any way we can do that in Qt in C++ ??

                    M Offline
                    M Offline
                    mrjj
                    Lifetime Qt Champion
                    wrote on 15 Dec 2016, 14:39 last edited by
                    #22

                    @Dante-Pham
                    Well if you know c++ then C# is pretty easy.
                    https://msdn.microsoft.com/en-us/library/yyaad03b(v=vs.90).aspx

                    I think you can do it almost same way with Visual Studio and c++ but of course the syntax will be
                    different.

                    D 1 Reply Last reply 15 Dec 2016, 14:41
                    0
                    • M mrjj
                      15 Dec 2016, 14:39

                      @Dante-Pham
                      Well if you know c++ then C# is pretty easy.
                      https://msdn.microsoft.com/en-us/library/yyaad03b(v=vs.90).aspx

                      I think you can do it almost same way with Visual Studio and c++ but of course the syntax will be
                      different.

                      D Offline
                      D Offline
                      Dante Pham
                      wrote on 15 Dec 2016, 14:41 last edited by
                      #23

                      @mrjj Ok I got 5 more days to finish this ... And I have never used visual studio.

                      M D 2 Replies Last reply 15 Dec 2016, 14:51
                      0
                      • D Dante Pham
                        15 Dec 2016, 14:41

                        @mrjj Ok I got 5 more days to finish this ... And I have never used visual studio.

                        M Offline
                        M Offline
                        mrjj
                        Lifetime Qt Champion
                        wrote on 15 Dec 2016, 14:51 last edited by
                        #24

                        @Dante-Pham
                        oh. that might be a bit tight then.
                        Im not sure what he use in the video . maybe this ?
                        http://www.aspose.com/api/net/words/aspose.words/documentbuilder

                        1 Reply Last reply
                        1
                        • D Dante Pham
                          15 Dec 2016, 14:25

                          Ok so thanks to @VRonin , I found this https://youtu.be/qOfiiYP2JTI?t=2m11s , in which is pretty much what I'm looking for ! The only problem is I don't know C# . Is there any way we can do that in Qt in C++ ??

                          V Offline
                          V Offline
                          VRonin
                          wrote on 15 Dec 2016, 15:05 last edited by VRonin
                          #25

                          @Dante-Pham said in How to read and write docx files in Qt:

                          Is there any way we can do that in Qt in C++ ??

                          As mentioned above you'll need to use a dialec of C++ called C++/CLI.
                          You can download visual studio from https://www.visualstudio.com/vs/community/ you can find a crash course in the dialect here: https://www.codeproject.com/articles/19354/quick-c-cli-learn-c-cli-in-less-than-minutes
                          Given the name googling it is a nightmare you are better off just googling stuff in C# and either translate it (it's not that hard) or if you go on msdn the examples are often available in C#, VB.Net and more importantly C++/CLI (see for example https://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient(v=vs.110).aspx?cs-save-lang=1&cs-lang=cpp)

                          @Dante-Pham said in How to read and write docx files in Qt:

                          DocX only has a .DLL file and a documentation

                          That's all you need, you use #using <DocX.dll> to include it in the source file (that needs to be compiled with the /clr option )

                          Here you can find a small example of a qmake project using this paradigm

                          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                          ~Napoleon Bonaparte

                          On a crusade to banish setIndexWidget() from the holy land of Qt

                          1 Reply Last reply
                          2
                          • D Dante Pham
                            15 Dec 2016, 14:41

                            @mrjj Ok I got 5 more days to finish this ... And I have never used visual studio.

                            D Offline
                            D Offline
                            Devopia53
                            wrote on 16 Dec 2016, 06:13 last edited by Devopia53
                            #26

                            @Dante-Pham

                            Why not use QAxObject for MS ActiveX?
                            This is the solution you want to use like this:

                            QString     outFile("C:/test.docx");
                            QString     inFile1("C:/test1.docx");
                            QString     inFile2("C:/test2.docx");
                            QAxObject   axObject("Word.Application");
                            QAxObject   *documents = axObject.querySubObject("Documents");
                            QAxObject   *document = documents->querySubObject("Open(const QString&, bool)", inFile1, true);
                            QAxObject   *selection = axObject.querySubObject("Selection");
                            
                            selection->dynamicCall("EndKey(QVariant&)", 6); // WdUnits::wdStory=6
                            selection->dynamicCall("InsertBreak(QVariant&)", 7); // WdBreakType::wdPageBreak=7
                            selection->dynamicCall("InsertFile(QString&)", inFile2);
                            
                            document->dynamicCall("SaveAs(const QString&)", outFile);
                            document->dynamicCall("Close()");
                            axObject.dynamicCall("Quit()");
                            
                            

                            You need a validation check for all pointers!

                            V D 2 Replies Last reply 16 Dec 2016, 07:42
                            2
                            • D Devopia53
                              16 Dec 2016, 06:13

                              @Dante-Pham

                              Why not use QAxObject for MS ActiveX?
                              This is the solution you want to use like this:

                              QString     outFile("C:/test.docx");
                              QString     inFile1("C:/test1.docx");
                              QString     inFile2("C:/test2.docx");
                              QAxObject   axObject("Word.Application");
                              QAxObject   *documents = axObject.querySubObject("Documents");
                              QAxObject   *document = documents->querySubObject("Open(const QString&, bool)", inFile1, true);
                              QAxObject   *selection = axObject.querySubObject("Selection");
                              
                              selection->dynamicCall("EndKey(QVariant&)", 6); // WdUnits::wdStory=6
                              selection->dynamicCall("InsertBreak(QVariant&)", 7); // WdBreakType::wdPageBreak=7
                              selection->dynamicCall("InsertFile(QString&)", inFile2);
                              
                              document->dynamicCall("SaveAs(const QString&)", outFile);
                              document->dynamicCall("Close()");
                              axObject.dynamicCall("Quit()");
                              
                              

                              You need a validation check for all pointers!

                              V Offline
                              V Offline
                              VRonin
                              wrote on 16 Dec 2016, 07:42 last edited by
                              #27

                              @Devopia53 said in How to read and write docx files in Qt:

                              Why not use QAxObject for MS ActiveX

                              The main point is that to use activeX you need MS Word installed, if you use an independent library you do not

                              "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                              ~Napoleon Bonaparte

                              On a crusade to banish setIndexWidget() from the holy land of Qt

                              M 1 Reply Last reply 16 Dec 2016, 07:49
                              1
                              • V VRonin
                                16 Dec 2016, 07:42

                                @Devopia53 said in How to read and write docx files in Qt:

                                Why not use QAxObject for MS ActiveX

                                The main point is that to use activeX you need MS Word installed, if you use an independent library you do not

                                M Offline
                                M Offline
                                mrjj
                                Lifetime Qt Champion
                                wrote on 16 Dec 2016, 07:49 last edited by
                                #28

                                Hi
                                In posters use case, there will always be word as the users
                                will create the input in that application.
                                However, @VRonin explanation on how to mix .NET with Qt in Visual studio does
                                sound awfully easy and would most likely be the most straightforward as DocX seems
                                very high level.
                                Time is short however and he never used VS before so might be slightly uphill to get going. :)

                                1 Reply Last reply
                                0
                                • D Offline
                                  D Offline
                                  Dante Pham
                                  wrote on 16 Dec 2016, 12:40 last edited by
                                  #29

                                  Just to be clear, MS Word will always be installed along with this app ( if it's not already installed )
                                  Currently I'm using QAxObject, however, I can't find the functions that i need (most importantly copying, pasting and adding customizable-style-strings) anywhere. Having this will probably solve the whole problem.
                                  Using Visual Studio to me is very overwhelming. I lost quite a few times using it. I'm familiar with Dev C++ and CodeBlock and they are quite simple.

                                  1 Reply Last reply
                                  0
                                  • D Devopia53
                                    16 Dec 2016, 06:13

                                    @Dante-Pham

                                    Why not use QAxObject for MS ActiveX?
                                    This is the solution you want to use like this:

                                    QString     outFile("C:/test.docx");
                                    QString     inFile1("C:/test1.docx");
                                    QString     inFile2("C:/test2.docx");
                                    QAxObject   axObject("Word.Application");
                                    QAxObject   *documents = axObject.querySubObject("Documents");
                                    QAxObject   *document = documents->querySubObject("Open(const QString&, bool)", inFile1, true);
                                    QAxObject   *selection = axObject.querySubObject("Selection");
                                    
                                    selection->dynamicCall("EndKey(QVariant&)", 6); // WdUnits::wdStory=6
                                    selection->dynamicCall("InsertBreak(QVariant&)", 7); // WdBreakType::wdPageBreak=7
                                    selection->dynamicCall("InsertFile(QString&)", inFile2);
                                    
                                    document->dynamicCall("SaveAs(const QString&)", outFile);
                                    document->dynamicCall("Close()");
                                    axObject.dynamicCall("Quit()");
                                    
                                    

                                    You need a validation check for all pointers!

                                    D Offline
                                    D Offline
                                    Dante Pham
                                    wrote on 16 Dec 2016, 12:54 last edited by Dante Pham
                                    #30

                                    @Devopia53 I'm not sure what youre trying to implement there. I tested it out and the three files didnt change at all. If you know how to copy, paste from one docx to another, add strings using QAxWidget, that would be awesome

                                    D 1 Reply Last reply 16 Dec 2016, 13:19
                                    0
                                    • D Dante Pham
                                      16 Dec 2016, 12:54

                                      @Devopia53 I'm not sure what youre trying to implement there. I tested it out and the three files didnt change at all. If you know how to copy, paste from one docx to another, add strings using QAxWidget, that would be awesome

                                      D Offline
                                      D Offline
                                      Devopia53
                                      wrote on 16 Dec 2016, 13:19 last edited by
                                      #31

                                      @Dante-Pham

                                      The example I provided is simply merging Document1(inFile1) and Document2(inFile2) to create Document3(outFile).

                                      For more information, check out Microsoft's site.

                                      1 Reply Last reply
                                      1
                                      • D Offline
                                        D Offline
                                        Dante Pham
                                        wrote on 18 Dec 2016, 15:25 last edited by
                                        #32

                                        One last thing
                                        Let's say i have to create a .docx file that has 50 questions and it should look like this:
                                        Header
                                        Questions 1: { insert docx to this area }
                                        Questions 2: { insert docx to this area }
                                        ...
                                        Questions 50: { insert docx to this area }
                                        Footer
                                        I implemented this code:

                                            QAxObject   axObject("Word.Application");
                                            QAxObject   *documents = axObject.querySubObject("Documents");
                                            QAxObject   *document = documents->querySubObject("Open(const QString&, bool)", Header, true); 
                                            QAxObject   *selection = axObject.querySubObject("Selection");
                                            selection->dynamicCall("EndKey(QVarient&)", 6); // WdStoryType::wdStory=6
                                        for(int i=1; i<=50; i++)
                                        {
                                            selection->dynamicCall("InsertFile(QString&)", Questioner); // A .docx file that i created. It's written "Question:" inside of it.
                                            selection->dynamicCall("InsertFile(QString&)", Question[i]); // Array of .docx files that i created. Works fine.
                                        }
                                            selection->dynamicCall("InsertFile(QString&)", Footer); 
                                            document->dynamicCall("SaveAs(const QString&)", Name);
                                            document->dynamicCall("Close()");
                                            axObject.dynamicCall("Quit()");
                                        

                                        And it came out like this
                                        Header
                                        Questions:
                                        { insert docx to this area }
                                        Questions:
                                        { insert docx to this area }
                                        ...
                                        Questions:
                                        { insert docx to this area }
                                        Footer
                                        .
                                        Is there a way to just insert "Question" + " " char(i+48) + ": ": to the start of every questions that i make ? Additionally, as you can see my output, after every "Question:" it just goes down one line ( i do understand that it's because i insert the file, but i dont know how to fix it ) and i dont want that.

                                        1 Reply Last reply
                                        0
                                        • D Dante Pham
                                          15 Dec 2016, 11:56

                                          @Andy314 I am using ActiveX but i have no idea what functions are used to do what you describe. Would you mind giving me some examples ? How do I copy and paste ? How to hide the window ?

                                          A Offline
                                          A Offline
                                          Andy314
                                          wrote on 19 Dec 2016, 12:27 last edited by
                                          #33

                                          Hello @Dante-Pham,
                                          I have no Qt-Code for Word, in the moment - this was for an other projekt in CPP-Builder for what I had a WrapperClass, but for Access and Excel I made my own tools.

                                          Obj ist the "Excel.Application" QAxObject*
                                          void setVisible(bool on=true)
                                          {
                                          Obj->setProperty("Visible", on);
                                          }
                                          I think for the Wordapp it is the same.
                                          You can generate html-Documentation for a QAxObject
                                          QString s = Obj->generateDocumentation();
                                          Here you get a least the function and property names, and an idea what the do. How the really work is detective searching work in the internet. The most matches you get if you look for VBA-Code (Visual-Basic for Application).

                                          1 Reply Last reply
                                          1

                                          23/35

                                          15 Dec 2016, 14:41

                                          • Login

                                          • Login or register to search.
                                          23 out of 35
                                          • First post
                                            23/35
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved