Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Open XML Word C# - Split into Two Columns

I was wondering how would it be possible to split the word document into two columns. The reason why I want to do this is because I want to be able to fit all of the information on one page.

Thank you so much for your help and time!

My Code

using (WordprocessingDocument wordDoc = WordprocessingDocument.Create(filepath,   WordprocessingDocumentType.Document))
            {

                MainDocumentPart mainPart = wordDoc.AddMainDocumentPart();
                mainPart.Document = new Document();

                var margin_size = 100;

                PageMargin pargeMargins = new PageMargin();
                pargeMargins.Top = margin_size;
                pargeMargins.Bottom = margin_size;

                SectionProperties sectionProps = new SectionProperties();
                sectionProps.Append(pargeMargins);

                Body body = mainPart.Document.AppendChild(new Body());
                body.Append(sectionProps);
                ParagraphProperties paragraphProperties = new ParagraphProperties
                   (
                       //new ParagraphStyleId() { Val = "No Spacing" },
                       new SpacingBetweenLines() { After = "0" }
                   );



                Paragraph para_main = body.AppendChild(new Paragraph(paragraphProperties));

                // Creating the Header where the Serial Number will exist

                // Serial Number
                Run run_mainHeader = para_main.AppendChild(new Run());
                RunProperties runProp_mainHeader = new RunProperties();    // Create run properties.
                FontSize size_mainHeader = new FontSize();
                size_mainHeader.Val = new StringValue("48");                     
                runProp_mainHeader.Append(size_mainHeader);
                run_mainHeader.Append(runProp_mainHeader);                              // Append all of the properties
                run_mainHeader.Append(new Text("S/N: " + sn));

                // Serial Barcode
                Run run_barcode = para_main.AppendChild(new Run());
                RunProperties runProp_barcode = new RunProperties();                    // Create run properties.
                RunFonts runFontMain_barcode = new RunFonts();                          // Create font
                runFontMain_barcode.Ascii = "Code39AzaleaNarrow1";                      // Specify font family
                FontSize size_barcode = new FontSize();
                size_barcode.Val = new StringValue("48");

                runProp_barcode.Append(runFontMain_barcode);
                runProp_barcode.Append(size_barcode);

                run_barcode.PrependChild<RunProperties>(runProp_barcode);
                sn = sn.ToUpper();                                                      // Sets all the values to uppercase to be a barcode format
                run_barcode.AppendChild(new Text("*" + sn + "*"));
                run_barcode.AppendChild(new Break());

                // Tube Type
                Run run_tubetype = para_main.AppendChild(new Run());
                RunProperties runProp_tubetype = new RunProperties();                   // Create run properties.
                FontSize size_tubetype = new FontSize();
                size_tubetype.Val = new StringValue("38");
                runProp_tubetype.Append(size_tubetype);
                run_tubetype.Append(runProp_tubetype);                                  // Append all of the properties
                run_tubetype.Append(new Text("Tube Type: " + forms[0].TubeType + " "));
                //run_tubetype.Append(new Break());

                // Tube Barcode
                Run run_barcode_tube = para_main.AppendChild(new Run());
                RunProperties runProp_barcode_tube = new RunProperties();               // Create run properties.
                RunFonts runFontMain_barcode_tube = new RunFonts();                     // Create font
                runFontMain_barcode_tube.Ascii = "Code39AzaleaNarrow1";                 // Specify font family
                FontSize size_barcode_tube = new FontSize();
                size_barcode_tube.Val = new StringValue("48");

                runProp_barcode_tube.Append(runFontMain_barcode_tube);
                runProp_barcode_tube.Append(size_barcode_tube);

                run_barcode_tube.PrependChild<RunProperties>(runProp_barcode_tube);
                sn = sn.ToUpper();                                                       // Sets all the values to uppercase to be a barcode format
                run_barcode_tube.AppendChild(new Text("*" + forms[0].TubeType + "*"));
                run_barcode_tube.AppendChild(new Break());



                // Goes through all of the forms
                foreach (var form in forms)
                {

                    // Set up a header per form
                    Run run_header = para_main.AppendChild(new Run());
                    RunProperties runProp_formHeader = new RunProperties();
                    Bold bold = new Bold();
                    Underline ul = new Underline() { Val = DocumentFormat.OpenXml.Wordprocessing.UnderlineValues.Single };
                    FontSize size_formHeader = new FontSize();
                    size_formHeader.Val = new StringValue("24");
                    runProp_formHeader.Append(size_formHeader);
                    runProp_formHeader.Append(bold);
                    runProp_formHeader.Append(ul);
                    run_header.AppendChild(new RunProperties(runProp_formHeader));
                    //run_header.AppendChild(new RunProperties(new Bold(), new Underline()));

                    string username = form.Username;
                    string proces_header = form.HeaderTitle;

                    run_header.AppendChild(new Text(proces_header));
                    run_header.AppendChild(new Break());

                    // Goes through all of the fields that each form contains.
                    for (int i = 0; i < form.FieldList.Count; i++)
                    {
                        // Do not need to print out user or serial for each form.
                        if (!(form.FieldList[i].Token == "SNT"))
                        {

                            Run run_data = para_main.AppendChild(new Run());
                            if (form.FieldList[i].Default)
                            {
                                run_data.AppendChild(new Text(form.FieldList[i].Label));
                            }
                            else
                            {
                                run_data.AppendChild(new Text(form.FieldList[i].Label + " " + form.FieldList[i].Spec + form.FieldList[i].Value));
                            }
                            run_data.AppendChild(new Break());
                        }
                    }

                }

                mainPart.Document.Save();
                wordDoc.Close();
                return "Success";
            }

Currently the code prints out everything top-down on one column. And I want it with two columns

like image 660
AustinT Avatar asked Feb 28 '26 12:02

AustinT


2 Answers

You can two or how many columns you want using the Columns Class for the SectionProperties and ParagraphProperties Class

http://msdn.microsoft.com/en-us/library/documentformat.openxml.wordprocessing.columns(v=office.14).aspx http://msdn.microsoft.com/en-us/library/documentformat.openxml.wordprocessing.paragraphproperties(v=office.14).aspx http://msdn.microsoft.com/en-us/library/documentformat.openxml.wordprocessing.sectionproperties(v=office.14).aspx

This should do it:

            // Add a new main document part. 
            package.AddMainDocumentPart();

            // Create the Document DOM. 
            package.MainDocumentPart.Document = new Document();
            Body bd = package.MainDocumentPart.Document.Body = new Body();

            //write a first paragraph on two columns
            var paragrap1 = new Paragraph();
            var paragraphSectionProperties = new ParagraphProperties(new SectionProperties());
            var paragraphColumns = new Columns();
            paragraphColumns.EqualWidth = true;
            paragraphColumns.ColumnCount = 2;

            paragraphSectionProperties.Append(paragraphColumns);
            paragrap1.Append(paragraphSectionProperties);

            paragrap1.Append(new Run(new Text(str)));
            bd.AppendChild(paragrap1);

            //write another paragraph without paragraph properties
            bd.Append(new Paragraph(new Run(new Text(str))));

            //set the body properties default three columns
            var sectionProperties = new SectionProperties();
            var columns = new Columns();
            columns.EqualWidth = true;
            columns.ColumnCount = 3;

            sectionProperties.Append(columns);
            bd.Append(sectionProperties);

            package.MainDocumentPart.Document.Save();
like image 90
Bogdan Avatar answered Mar 02 '26 02:03

Bogdan


You can do it for the complete document with this code:

var sectionProperty = document.Body.Descendants<SectionProperties>().First();
var paragraphColumns = new Columns {EqualWidth = true, ColumnCount = 2};
sectionProperty.Append(paragraphColumns);
like image 36
Codeman01101001 Avatar answered Mar 02 '26 02:03

Codeman01101001



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!