We are excited to unveil our very first Java component to the Java developer community. It’s Java Word Library in our 2020 Volume 3 release.
In this article, I’ll show you how to create, edit, and convert document formats like DOCX, DOCM, DOTX, WordML, HTML, TXT in Java applications using Syncfusion’s Java Word Library (Essential DocIO). This library doesn’t require Microsoft Word or Office interop dependencies.
This new library comes with the following features:
You can create a new Word document with all common document elements like text, images, hyperlinks, tables, bookmarks, comments, various types of fields, and content control in Java using the Syncfusion Word Library.
Step 1 : File > New > Java Project. The New Java Project wizard dialog appears, letting you specify the configuration of the project.
Step 2: Add external .jar files (“syncfusion-docio.jar” , “syncfusion-javahelper.jar“) to your project. Refer to the External Jars Required page to get dependent .jar files.
Java import java.io.File; import java.io.FileInputStream; import com.syncfusion.docio.*; import com.syncfusion.javahelper.system.*; import com.syncfusion.javahelper.system.drawing.*;
Step 4: Add the following code in the main method to create a Word document programmatically in Java.
//Create a new document. WordDocument document = new WordDocument(); //Add a new section to the document. WSection section = (WSection) document.addSection(); //Set margins of the section. section.getPageSetup().getMargins().setAll((float) 72); //Set page size of the section. section.getPageSetup().setPageSize(new SizeFSupport(612, 792)); //Create paragraph styles. WParagraphStyle style = createParagraphStyle(document); //Create paragraph and apply formatting. createParagraph(section); //Create table and apply formatting. createTable(section); //Save and close the document. document.save("GettingStarted.docx"); document.close(); System.out.println("Word document generated successfully.");
The following code example explains how to add paragraphs with text and images to a Word document.
/** * * Create paragraph and apply formatting. * * @param section represents the section of a Word document. */static IWParagraph createParagraph(WSection section) throws Exception { IWParagraph paragraph = section.getHeadersFooters().getHeader().addParagraph(); //Append picture to the paragraph. WPicture picture = (WPicture) paragraph.appendPicture(new FileInputStream(getDataDir("AdventureCycle.jpg"))); picture.setTextWrappingStyle(TextWrappingStyle.InFrontOfText); picture.setVerticalOrigin(VerticalOrigin.Margin); picture.setVerticalPosition((float) -45); picture.setHorizontalOrigin(HorizontalOrigin.Column); picture.setHorizontalPosition(263.5f); picture.setWidthScale((float) 20); picture.setHeightScale((float) 15); paragraph.applyStyle("Normal"); paragraph.getParagraphFormat().setHorizontalAlignment(HorizontalAlignment.Left); //Add text to the paragraph. WTextRange textRange = (WTextRange) paragraph.appendText("Adventure Works Cycles"); appendCharacterFormatToText(textRange.getCharacterFormat(), 12f, "Calibri"); textRange.getCharacterFormat().setTextColor((ColorSupport.getRed()).clone()); //Append paragraph. paragraph = section.addParagraph(); paragraph.applyStyle("Heading 1"); paragraph.getParagraphFormat().setHorizontalAlignment(HorizontalAlignment.Center); //Add text to the paragraph. textRange = (WTextRange) paragraph.appendText("Adventure Works Cycles"); appendCharacterFormatToText(textRange.getCharacterFormat(), 18f, "Calibri"); //Append paragraph. paragraph = section.addParagraph(); paragraph.getParagraphFormat().setFirstLineIndent((float) 36); paragraph.getBreakCharacterFormat().setFontSize(12f); //Add text to the paragraph. textRange = (WTextRange) paragraph.appendText("Adventure Works Cycles, the fictitious company on which the Adventure Works sample databases are based, is a large, multinational manufacturing company. The company manufactures and sells metal and composite bicycles to North American, European and Asian commercial markets. While its base operation is located in Bothell, Washington with 290 employees, several regional sales teams are located throughout their market base."); textRange.getCharacterFormat().setFontSize(12f); //Append paragraph. paragraph = section.addParagraph(); paragraph.getParagraphFormat().setFirstLineIndent((float) 36); paragraph.getBreakCharacterFormat().setFontSize(12f); //Add text to the paragraph. textRange = (WTextRange) paragraph.appendText("In 2000, Adventure Works Cycles bought a small manufacturing plant, Importadores Neptuno, located in Mexico. Importadores Neptuno manufactures several critical subcomponents for the Adventure Works Cycles product line. These subcomponents are shipped to the Bothell location for final product assembly. In 2001, Importadores Neptuno, became the sole manufacturer and distributor of the touring bicycle product group."); textRange.getCharacterFormat().setFontSize(12f); //Append paragraph. paragraph = section.addParagraph(); paragraph.applyStyle("Heading 1"); paragraph.getParagraphFormat().setHorizontalAlignment(HorizontalAlignment.Left); //Add text to the paragraph. textRange = (WTextRange) paragraph.appendText("Product Overview"); appendCharacterFormatToText(textRange.getCharacterFormat(), 16f, "Calibri"); return paragraph; }
Tables are another important element in documents that contain a set of data arranged in rows and columns. You can create simple or complex tables using the Java Word Library.
The following code example creates a simple table in the Word document and adds content to each cell.
/** * Creates table and apply formatting. * * @param section rRepresents the section of a Word document. */static IWTable createTable(WSection section) throws Exception { //Append table. IWTable table = section.addTable(); table.resetCells(3, 2); table.getTableFormat().getBorders().setBorderType(BorderStyle.None); table.getTableFormat().setIsAutoResized(true); //Append paragraph. IWParagraph paragraph = table.get(0, 0).addParagraph(); paragraph.getParagraphFormat().setAfterSpacing((float) 0); paragraph.getBreakCharacterFormat().setFontSize(12f); //Append picture to paragraph. IWPicture picture = (WPicture) paragraph.appendPicture(new FileInputStream(getDataDir("Mountain-200.jpg"))); picture.setTextWrappingStyle(TextWrappingStyle.TopAndBottom); picture.setVerticalOrigin(VerticalOrigin.Paragraph); picture.setVerticalPosition(4.5f); picture.setHorizontalOrigin(HorizontalOrigin.Column); picture.setHorizontalPosition(-2.15f); picture.setWidthScale((float) 79); picture.setHeightScale((float) 79); //Append paragraph. paragraph = table.get(0, 1).addParagraph(); paragraph.applyStyle("Heading 1"); appendParagraphFormatToParagraph(paragraph.getParagraphFormat(), (float) 0, 12f); paragraph.appendText("Mountain-200"); //Append paragraph. paragraph = table.get(0, 1).addParagraph(); appendParagraphFormatToParagraph(paragraph.getParagraphFormat(), (float) 0, 12f); appendCharacterFormatToText(paragraph.getBreakCharacterFormat(), 12f, "Times New Roman"); //Add text to the paragraph. WTextRange textRange = (WTextRange) paragraph.appendText("Product No: BK-M68B-38\r"); appendCharacterFormatToText(textRange.getCharacterFormat(), 12f, "Times New Roman"); //Add text to the paragraph. textRange = (WTextRange) paragraph.appendText("Size: 38\r"); appendCharacterFormatToText(textRange.getCharacterFormat(), 12f, "Times New Roman"); //Add text to the paragraph. textRange = (WTextRange) paragraph.appendText("Weight: 25\r"); appendCharacterFormatToText(textRange.getCharacterFormat(), 12f, "Times New Roman"); //Add text to the paragraph. textRange = (WTextRange) paragraph.appendText("Price: $2,294.99\r"); appendCharacterFormatToText(textRange.getCharacterFormat(), 12f, "Times New Roman"); //Append paragraph. paragraph = table.get(0, 1).addParagraph(); appendParagraphFormatToParagraph(paragraph.getParagraphFormat(), (float) 0, 12f); paragraph.getBreakCharacterFormat().setFontSize(12f); //Append paragraph. paragraph = table.get(1, 0).addParagraph(); paragraph.applyStyle("Heading 1"); appendParagraphFormatToParagraph(paragraph.getParagraphFormat(), (float) 0, 12f); paragraph.appendText("Mountain-300 "); //Append paragraph. paragraph = table.get(1, 0).addParagraph(); appendParagraphFormatToParagraph(paragraph.getParagraphFormat(), (float) 0, 12f); appendCharacterFormatToText(paragraph.getBreakCharacterFormat(), 12f, "Times New Roman"); //Add text to the paragraph. textRange = (WTextRange) paragraph.appendText("Product No: BK-M47B-38\r"); appendCharacterFormatToText(textRange.getCharacterFormat(), 12f, "Times New Roman"); //Add text to the paragraph. textRange = (WTextRange) paragraph.appendText("Size: 35\r"); appendCharacterFormatToText(textRange.getCharacterFormat(), 12f, "Times New Roman"); //Add text to the paragraph. textRange = (WTextRange) paragraph.appendText("Weight: 22\r"); appendCharacterFormatToText(textRange.getCharacterFormat(), 12f, "Times New Roman"); //Add text to the paragraph. textRange = (WTextRange) paragraph.appendText("Price: $1,079.99\r"); appendCharacterFormatToText(textRange.getCharacterFormat(), 12f, "Times New Roman"); //Append paragraph. paragraph = table.get(1, 0).addParagraph(); appendParagraphFormatToParagraph(paragraph.getParagraphFormat(), (float) 0, 12f); paragraph.getBreakCharacterFormat().setFontSize(12f); //Append paragraph. paragraph = table.get(1, 1).addParagraph(); paragraph.applyStyle("Heading 1"); paragraph.getParagraphFormat().setLineSpacing(12f); //Append picture to the paragraph. picture = (WPicture) paragraph.appendPicture(new FileInputStream(getDataDir("Mountain-300.jpg"))); picture.setTextWrappingStyle(TextWrappingStyle.TopAndBottom); picture.setVerticalOrigin(VerticalOrigin.Paragraph); picture.setVerticalPosition(8.2f); picture.setHorizontalOrigin(HorizontalOrigin.Column); picture.setHorizontalPosition(-14.95f); picture.setWidthScale((float) 75); picture.setHeightScale((float) 75); //Append paragraph. paragraph = table.get(2, 0).addParagraph(); paragraph.applyStyle("Heading 1"); paragraph.getParagraphFormat().setLineSpacing(12f); //Append picture to the paragraph. picture = (WPicture) paragraph.appendPicture(new FileInputStream(getDataDir("Road-550-W.jpg"))); picture.setTextWrappingStyle(TextWrappingStyle.TopAndBottom); picture.setVerticalOrigin(VerticalOrigin.Paragraph); picture.setVerticalPosition(3.75f); picture.setHorizontalOrigin(HorizontalOrigin.Column); picture.setHorizontalPosition(-5f); picture.setWidthScale((float) 92); picture.setHeightScale((float) 92); //Append paragraph. paragraph = table.get(2, 1).addParagraph(); paragraph.applyStyle("Heading 1"); appendParagraphFormatToParagraph(paragraph.getParagraphFormat(), (float) 0, 12f); paragraph.appendText("Road-150 "); //Append paragraph. paragraph = table.get(2, 1).addParagraph(); appendParagraphFormatToParagraph(paragraph.getParagraphFormat(), (float) 0, 12f); appendCharacterFormatToText(paragraph.getBreakCharacterFormat(), 12f, "Times New Roman"); //Add text to the paragraph. textRange = (WTextRange) paragraph.appendText("Product No: BK-R93R-44\r"); appendCharacterFormatToText(textRange.getCharacterFormat(), 12f, "Times New Roman"); //Add text to the paragraph. textRange = (WTextRange) paragraph.appendText("Size: 44\r"); appendCharacterFormatToText(textRange.getCharacterFormat(), 12f, "Times New Roman"); //Add text to the paragraph. textRange = (WTextRange) paragraph.appendText("Weight: 14\r"); appendCharacterFormatToText(textRange.getCharacterFormat(), 12f, "Times New Roman"); //Add text to the paragraph. textRange = (WTextRange) paragraph.appendText("Price: $3,578.27\r"); appendCharacterFormatToText(textRange.getCharacterFormat(), 12f, "Times New Roman"); //Append paragraph. paragraph = table.get(2, 1).addParagraph(); paragraph.applyStyle("Heading 1"); paragraph.getParagraphFormat().setLineSpacing(12f); section.addParagraph(); return table; }
The following code example explains how to create a paragraph style and apply formatting.
/** * Create paragraph and apply formatting. * * @param document represents the Word document. */static WParagraphStyle createParagraphStyle(WordDocument document) throws Exception { //Apply the styles. WParagraphStyle style = (WParagraphStyle) document.addParagraphStyle("Normal"); WCharacterFormat characterFormat = style.getCharacterFormat(); WParagraphFormat paragraphFormat = style.getParagraphFormat(); appendCharacterFormatToText(style.getCharacterFormat(), 11f, "Calibri"); paragraphFormat.setBeforeSpacing((float) 0); paragraphFormat.setAfterSpacing((float) 8); paragraphFormat.setLineSpacing(13.8f); style = (WParagraphStyle) document.addParagraphStyle("Heading 1"); characterFormat = style.getCharacterFormat(); paragraphFormat = style.getParagraphFormat(); style.applyBaseStyle("Normal"); appendCharacterFormatToText(style.getCharacterFormat(), 16f, "Calibri Light"); characterFormat.setTextColor((ColorSupport.fromArgb(46, 116, 181)).clone()); paragraphFormat.setBeforeSpacing((float) 12); paragraphFormat.setAfterSpacing((float) 0); paragraphFormat.setKeep(true); paragraphFormat.setKeepFollow(true); paragraphFormat.setOutlineLevel(OutlineLevel.Level1); return style; } /** * Apply characterFormat */static void appendCharacterFormatToText(WCharacterFormat characterFormat, float fontSize, String fontName) throws Exception { characterFormat.setFontSize(fontSize); characterFormat.setFontName(fontName); } /** * Apply paragraphFormat */static void appendParagraphFormatToParagraph(WParagraphFormat paragraphFormat, float afterSpacingValue, float lineSpacingValue) throws Exception { paragraphFormat.setAfterSpacing(afterSpacingValue); paragraphFormat.setLineSpacing(lineSpacingValue); }
You can download the complete working example from this GitHub.
The resultant Word document looks as follows.
Syncfusion’s Java Word Library has powerful mail merge APIs to generate personalized reports like letters, invoices, payroll, and email content. It saves you effort and time by helping you to automate the generation of personalized Word documents programmatically in Java. The resultant documents can be saved as Word documents (DOCX, DOCM, DOTX, WordML), HTML, and TXT.
You can execute mail merge for nested groups or regions in a Word document. It replaces all the merge fields within nested regions with relational (hierarchical) data by repeating nested regions of the document automatically for each record in the data source.
Step 1 : File > New > Java Project. The New Java Project wizard dialog appears, letting you specify configurations for the project.
Step 2: Add external .jar files (“syncfusion-docio.jar” , “syncfusion-javahelper.jar“) to your project. Refer to the External Jars Required page for the dependent .jar files.
Java import java.io.File; import java.io.FileInputStream; import com.syncfusion.docio.*; import com.syncfusion.javahelper.system.*; import com.syncfusion.javahelper.system.drawing.*;
Step 4: Add the following code in main method to create a purchase order report in Java using the mail merge functionality of Syncfusion Word Library.
//Creates new Word document instance for Word processing. WordDocument document = new WordDocument(); //Opens the template Word document. String basePath = getDataDir("Template.docx"); document.open(basePath, FormatType.Docx); //Retrieves the mail merge data. MailMergeDataTable dataTable = getMailMergeDataTable(); //Executes nested Mail merge using implicit relational data. document.getMailMerge().executeNestedGroup(dataTable); //Removes empty page at the end of Word document. removeEmptyPage(document); //Saves the document in the given name and format. document.save("Report.docx", FormatType.Docx); //Release the resources occupied by the WordDocument instance. document.close();
Please refer to the following Java code definition of the getMailMergeDataTable method, which provides data for mail merge. You can download the XML file from CustomerDetails.xml.
/** * * Gets the mail merge data table. * * @return */private static MailMergeDataTable getMailMergeDataTable() throws Exception { // Gets the customer details implicit as "IEnumerable" collection. ListSupport<CustomerDetails> customers = new ListSupport<CustomerDetails>(CustomerDetails.class); FileStreamSupport stream = new FileStreamSupport(getDataDir("CustomerDetails.xml"), FileMode.OpenOrCreate); XmlReaderSupport reader = XmlReaderSupport.create(stream); while (reader.getNodeType().getEnumValue() != XmlNodeType.Element.getEnumValue()) reader.read(); reader.read(); while (reader.getNodeType().getEnumValue() == XmlNodeType.Whitespace.getEnumValue()) reader.read(); while (!(reader.getLocalName() == "CustomerDetails")) { if (reader.getNodeType().getEnumValue() == XmlNodeType.Element.getEnumValue()) { switch ((reader.getLocalName()) == null ? "string_null_value" : (reader.getLocalName())) { case "Customers": customers.add(getCustomer(reader)); break; } } else { reader.read(); if ((reader.getLocalName() == "CustomerDetails") && reader.getNodeType().getEnumValue() == XmlNodeType.EndElement.getEnumValue()) break; } } reader.close(); stream.close(); // Creates an instance of "MailMergeDataTable" by specifying mail merge group // name and "IEnumerable" collection. MailMergeDataTable dataTable = new MailMergeDataTable("Customers", customers); return dataTable; }
You can download the complete working example from this GitHub repository.
The resultant Word document will be similar to the one in the following screenshot.
Thank you for taking the time to read this blog. I hope you now understand how to create Word documents with text, images, and tables, and how to create a purchase order using the mail merge feature using the Syncfusion Java Word Library. Take a moment to peruse the documentation, where you’ll find other options and features, all with accompanying code examples. Explore Java Word demos for more Word document processing examples using Syncfusion Java Word Library.
Currently, we have provided most of the basic Word processing features in our Java library. We will implement more features in our upcoming releases. Feel free to download the product setup. If you’re not yet a Syncfusion user, you can download a free, 30-day trial here.
If you have any questions about the features of this new Java library, please let us know in the comments below. You can also contact us through our support forum, Direct-Trac, or feedback portal. We are happy to assist you!