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.8k 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.
  • D Offline
    D Offline
    Dante Pham
    wrote on last edited by
    #10

    @mrjj Basically I'm trying to make a program that can copy lots of small documents and put it into just one file. It's like you have multiple questions and you merge them into just one test.
    Office should always be installed with this program ( except for when it has already been installed )

    1 Reply Last reply
    1
    • mrjjM Offline
      mrjjM Offline
      mrjj
      Lifetime Qt Champion
      wrote on last edited by
      #11

      Ok. i see.
      Would it be option to do it via pdf or must end result be a doc?

      I did something the same with
      https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/
      (the free command line version)
      so made small VBA macro that printed/saved the docs to pdf and then just
      ran tool on it. and got perfect pdf from it.

      D 1 Reply Last reply
      0
      • mrjjM mrjj

        Ok. i see.
        Would it be option to do it via pdf or must end result be a doc?

        I did something the same with
        https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/
        (the free command line version)
        so made small VBA macro that printed/saved the docs to pdf and then just
        ran tool on it. and got perfect pdf from it.

        D Offline
        D Offline
        Dante Pham
        wrote on last edited by
        #12

        @mrjj Input and Output should be .doc or .docx so that it will be easier for users to modify the files. Changing .doc to .pdf and vice versa is good but doesn't help very much because the core features I intend to implement will, in most cases, involve in working with .doc and .docx

        mrjjM 1 Reply Last reply
        0
        • D Dante Pham

          @mrjj Input and Output should be .doc or .docx so that it will be easier for users to modify the files. Changing .doc to .pdf and vice versa is good but doesn't help very much because the core features I intend to implement will, in most cases, involve in working with .doc and .docx

          mrjjM Offline
          mrjjM Offline
          mrjj
          Lifetime Qt Champion
          wrote on last edited by
          #13

          @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 1 Reply Last reply
          0
          • mrjjM mrjj

            @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 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 ?

            mrjjM 1 Reply Last reply
            0
            • Andy314A Offline
              Andy314A Offline
              Andy314
              wrote on 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
              1
              • D Dante Pham

                @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 ?

                mrjjM Offline
                mrjjM Offline
                mrjj
                Lifetime Qt Champion
                wrote on 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
                1
                • VRoninV Offline
                  VRoninV Offline
                  VRonin
                  wrote on 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
                  • Andy314A Andy314

                    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 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 ?

                    Andy314A 1 Reply Last reply
                    0
                    • mrjjM mrjj

                      @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 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

                      mrjjM 1 Reply Last reply
                      1
                      • D Dante Pham

                        @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

                        mrjjM Offline
                        mrjjM Offline
                        mrjj
                        Lifetime Qt Champion
                        wrote on 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 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++ ??

                          mrjjM VRoninV 2 Replies Last reply
                          0
                          • D Dante Pham

                            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++ ??

                            mrjjM Offline
                            mrjjM Offline
                            mrjj
                            Lifetime Qt Champion
                            wrote on 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
                            0
                            • mrjjM mrjj

                              @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 last edited by
                              #23

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

                              mrjjM D 2 Replies Last reply
                              0
                              • D Dante Pham

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

                                mrjjM Offline
                                mrjjM Offline
                                mrjj
                                Lifetime Qt Champion
                                wrote on 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

                                  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++ ??

                                  VRoninV Offline
                                  VRoninV Offline
                                  VRonin
                                  wrote on 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

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

                                    D Offline
                                    D Offline
                                    Devopia53
                                    wrote on 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!

                                    VRoninV D 2 Replies Last reply
                                    2
                                    • D Devopia53

                                      @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!

                                      VRoninV Offline
                                      VRoninV Offline
                                      VRonin
                                      wrote on 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

                                      mrjjM 1 Reply Last reply
                                      1
                                      • VRoninV VRonin

                                        @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

                                        mrjjM Offline
                                        mrjjM Offline
                                        mrjj
                                        Lifetime Qt Champion
                                        wrote on 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 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

                                          • Login

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