package ru.habrahabr.spring.view ;
import org.apache.commons.code.binary.Base64 ;
import org.docx4j.XmlUtils ;
import org.docx4j.openpackaging.io.SaveToZipFile ;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage ;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart ;
import org.docx4j.wml.Document ;
import org.springframework.web.servlet.view.AbstractTemplateView ;
import javax.servlet.ServletOutputStream ;
import javax.servlet.http.HttpServletRequest ;
import javax.servlet.http.HttpServletResponse ;
import java.net.URLEncoder ;
import java.util.HashMap ;
import java.util.Locale ;
import java.util.Map ;
')
public class DocxView extends AbstractTemplateView {
public DocxView ( ) {
setContentType ( "application / vnd.openxmlformats-officedocument.wordprocessingml.document" ) ;
}
@ Override
protected boolean generatesDownloadContent ( ) {
return true ;
}
@ Override
protected void renderMergedTemplateModel ( Map < String, Object > model,
HttpServletRequest request, HttpServletResponse response ) throws Exception {
WordprocessingMLPackage wordMLPackage =
WordprocessingMLPackage. load ( getApplicationContext ( ) . getResource ( getUrl ( ) ) . getFile ( ) ) ;
MainDocumentPart documentPart = wordMLPackage. getMainDocumentPart ( ) ;
org. docx4j . wml . Document wmlDocumentEl = ( org. Docx4j . Wml . Document ) documentPart. getJaxbElement ( ) ;
String xml = XmlUtils. marshaltoString ( wmlDocumentEl, true ) ;
HashMap < String, String > mappings = new HashMap < String, String > ( ) ;
for ( Object key: model. keySet ( ) ) {
mappings put ( key. toString ( ) , model. get ( key ) . toString ( ) ) ;
}
Object obj = XmlUtils. unmarshallFromTemplate ( xml, mappings ) ;
documentPart. setJaxbElement ( ( Document ) obj ) ;
String name = model. get ( "filename" ) + ".docx" ;
response. setHeader ( "Content-Disposition" , "attachment" + name ) ;
ServletOutputStream out = response. getOutputStream ( ) ;
( new SaveToZipFile ( wordMLPackage ) ) . save ( out ) ;
out. flush ( ) ;
}
public boolean checkResource ( Locale locale ) {
return getApplicationContext ( ) . getResource ( getUrl ( ) ) . exists ( ) ;
}
}
< bean id = "docxViewResolver" class = "org.springframework.web.servlet.view.UrlBasedViewResolver" >
< property name = "viewClass" value = "ru.habrahabr.spring.view.DocxView" > </ property >
< property name = "order" value = "1" />
< property name = "prefix" value = "/ WEB-INF / views /" />
< property name = "suffix" value = ".docx" />
</ bean >
< bean id = "jspViewResolver" class = "org.springframework.web.servlet.view.InternalResourceViewResolver" >
< property name = "prefix" value = "/ WEB-INF / views /" />
< property name = "suffix" value = ".jsp" />
</ bean >
package ru.habrahabr.spring.controller ;
import org.springframework.stereotype.Controller ;
import org.springframework.ui.Model ;
import org.springframework.util.MultiValueMap ;
import org.springframework.web.bind.annotation.RequestMapping ;
Controller
public class DocxController {
@RequestMapping ( value = "/ get / docx" , method = RequestMethod. GET )
public String doGenerate ( Model model ) {
model. addAttribute ( "filename" , "test" ) ;
model. addAttribute ( "test" , "test" ) ;
return "docx / test" ;
Source: https://habr.com/ru/post/101546/
All Articles