Java 使用Freemarker导出word 文档,解决当一段内容中既有文字又有图片的问题

    xiaoxiao2021-03-25  159

    如有对不了解的朋友请看我的上一篇博客

    http://blog.csdn.net/you_are_my_life/article/details/60872786

    详细的我不多说直接上代码,希望对大家有帮组,毕竟我被这个问题难了很久,百度得到的都是不是很清楚的实例

    代码 package com.ty.test; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.codec.binary.Base64; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import freemarker.template.TemplateExceptionHandler; public class ExprotWord { private Configuration configuration = null; private static int i = 9; public ExprotWord() { configuration = new Configuration(); configuration.setDefaultEncoding("UTF-8"); } public static void main(String[] args) throws Exception { ExprotWord test = new ExprotWord(); Map<String, Object> dataMap = new HashMap<String, Object>(); test.getData(dataMap); test.createWord(dataMap); // Thread.sleep(1000*30); } public void createWord(Map<String, Object> dataMap) throws Exception { // Map<String,Object> dataMap=new HashMap<String,Object>(); // getData(dataMap); configuration.setClassForTemplateLoading(this.getClass(), "/com/ty/test"); // FTL文件所存在的位置 configuration.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER); Template t = null; try { t = configuration.getTemplate("demo55.ftl"); // 文件名 } catch (IOException e) { e.printStackTrace(); } File outFile = new File("G:/outFiles" + Math.random() * 10000 + ".doc"); Writer out = null; try { out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8")); // 必须加 "utf-8" 不然在 UserInfoRestController 通过webservice的方式调用 生成的文件 打开 // 不了,会报错(而当做java程序去运行,则没有"utf-8"生成的文件也能正常打开的),原因不详 // 规范编写应该是要加上文件的编码的"utf-8" } catch (Exception e1) { e1.printStackTrace(); } try { t.process(dataMap, out); out.close(); } catch (TemplateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private void getData(Map<String, Object> dataMap) { // 实体类 dataMap.put("name", "小明"); dataMap.put("birthday", "1988.06.02"); dataMap.put("picture", getImageStr()); String aa = "Commerce Jhu常充分。</br> <img src = \"a1.jpg\" class = \"pic\"/>最终,目标人物帮助A与债主达成协议,</br>要求A变卖部分资产、收紧预"; Expro ex = Imageone(nomination); dataMap.put("imageon" + ex.getIi(), ex.getImageon()); dataMap.put("nameon" + ex.getIi(), ex.getNameon()); dataMap.put("imagecenter" + ex.getIi(), ex.getImagecenter()); dataMap.put("nametwo" + ex.getIi(), ex.getNametwo()); dataMap.put("imagetop" + ex.getIi(), ex.getImagetop()); } private String getImageStr() { String imgFile = "G:\\Users\\a1.jpg"; InputStream in = null; byte[] data = null; try { in = new FileInputStream(imgFile); data = new byte[in.available()]; in.read(data); in.close(); } catch (IOException e) { e.printStackTrace(); } String imageCodeBase64 = Base64.encodeBase64String(data); return imageCodeBase64; } private String getImageStrone() { String imgFile = "G:\\Users\\9.jpg"; InputStream in = null; byte[] data = null; try { in = new FileInputStream(imgFile); data = new byte[in.available()]; in.read(data); in.close(); } catch (IOException e) { e.printStackTrace(); } // BASE64Encoder encoder = new BASE64Encoder(); // return encoder.encode(data); // return data != null ? encoder.encode(data) : ""; // System.out.println(new String(data)); String imageCodeBase64 = Base64.encodeBase64String(data); return imageCodeBase64; } public Expro Imageone(String no) { String startname = no.replaceAll("</br>", ""); // 根据<img标签进行分割成两个字符串 String startone[] = startname.split("<img"); System.out.println(startone.length); String onename = startone[0]; String a2; String imagename = null; String imageone = null; if (startone.length != 1) { a2 = startone[1]; // 获取到图片的路径,根据标签/>切割字符串 String b[] = a2.split("/>"); String b1 = b[0]; // 图片后面的文字 imageone = b[1]; // 图片名字 imagename = b1.substring(9, b1.length() - 15); System.out.println(imageone); System.out.println(imagename); } // 图片前面的文字 String onenametwo = onename.substring(0, onename.length() - 0); System.out.println(onenametwo); if (imagename != null) { // 图片的格式 i++; String imagecenter = "" + "<w:r w:rsidR=\"00937E93\">" + "<w:rPr>" + "<w:noProof/><w:sz w:val=\"36\"/><w:szCs w:val=\"36\"/>" + "</w:rPr>" + "<w:drawing>" + "<wp:inline distT=\"0\" distB=\"0\" distL=\"0\" distR=\"0\">" + "<wp:extent cx=\"1257300\" cy=\"1114425\"/>" + "<wp:effectExtent l=\"19050\" t=\"0\" r=\"0\" b=\"0\"/>" + "<wp:docPr id=\"2\" name=\"图片 2\" descr=\"G:\\Users\\a1.jpg\"/>" + "<wp:cNvGraphicFramePr><a:graphicFrameLocks noChangeAspect=\"1\" xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"/>" + "</wp:cNvGraphicFramePr>" + "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">" + "<a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" + "<pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" + "<pic:nvPicPr><pic:cNvPr id=\"0\" name=\"Picture 1\" descr=\"G:\\Users\\a1.jpg\"/>" + "<pic:cNvPicPr><a:picLocks noChangeAspect=\"1\" noChangeArrowheads=\"1\"/>" + "</pic:cNvPicPr>" + "</pic:nvPicPr>" + "<pic:blipFill>" + "<a:blip r:embed=\"rId" + i + "\" cstate=\"print\"/>" + "<a:srcRect/>" + "<a:stretch><a:fillRect/></a:stretch>" + "</pic:blipFill>" + "<pic:spPr bwMode=\"auto\">" + "<a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"1257300\" cy=\"1114425\"/></a:xfrm>" + "<a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom><a:noFill/>" + "<a:ln w=\"9525\"><a:noFill/><a:miter lim=\"800000\"/><a:headEnd/><a:tailEnd/></a:ln>" + "</pic:spPr></pic:pic></a:graphicData></a:graphic></wp:inline></w:drawing></w:r>"; String imageon = "<Relationship Id=\"" + "rId" + i + "\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"media/image." + i + "\"/>"; String imagetop = "<pkg:part pkg:name=\"/word/media/image." + i + "\" pkg:contentType=\"image/" + i + "\" pkg:compression=\"store\"><pkg:binaryData>" + getImageStrone() + "</pkg:binaryData></pkg:part>"; String nametwo = "<w:r><w:rPr><w:rFonts w:hint=\"eastAsia\"/><w:noProof/><w:sz w:val=\"28\"/><w:szCs w:val=\"28\"/></w:rPr><w:t>" + imageone + "</w:t></w:r></w:p>"; // 文字的格式 String nameon = "<w:p w:rsidR=\"009A78FF\" w:rsidRPr=\"00571EF2\" w:rsidRDefault=\"009A78FF\" w:rsidP=\"009A78FF\"><w:pPr>" + "<w:jc w:val=\"left\"/><w:rPr><w:sz w:val=\"28\"/><w:szCs w:val=\"28\"/></w:rPr></w:pPr><w:r w:rsidRPr=\"00571EF2\">" + "<w:rPr><w:rFonts w:hint=\"eastAsia\"/><w:sz w:val=\"28\"/><w:szCs w:val=\"28\"/></w:rPr><w:t>" + onename + "</w:t></w:r>"; Expro expro = new Expro(); expro.setIi(i); expro.setImageon(imageon); expro.setNameon(nameon); expro.setImagecenter(imagecenter); expro.setNametwo(nametwo); expro.setImagetop(imagetop); return expro; } else { // 文字的格式 String nameon = "<w:p w:rsidR=\"009A78FF\" w:rsidRPr=\"00571EF2\" w:rsidRDefault=\"009A78FF\" w:rsidP=\"009A78FF\"><w:pPr>" + "<w:jc w:val=\"left\"/><w:rPr><w:sz w:val=\"28\"/><w:szCs w:val=\"28\"/></w:rPr></w:pPr><w:r w:rsidRPr=\"00571EF2\">" + "<w:rPr><w:rFonts w:hint=\"eastAsia\"/><w:sz w:val=\"28\"/><w:szCs w:val=\"28\"/></w:rPr><w:t>" + onename + "</w:t></w:r></w:p>"; String nametwo = ""; String imagetop = ""; String imageon = ""; String imagecenter = ""; Expro expro = new Expro(); expro.setImageon(imageon); expro.setNameon(nameon); expro.setImagecenter(imagecenter); expro.setNametwo(nametwo); expro.setImagetop(imagetop); return expro; } } }

    其中的为单个文字的格式

    <w:p w:rsidR=\"009A78FF\" w:rsidRPr=\"00571EF2\" w:rsidRDefault=\"009A78FF\" w:rsidP=\"009A78FF\"><w:pPr>" + "<w:jc w:val=\"left\"/><w:rPr><w:sz w:val=\"28\"/><w:szCs w:val=\"28\"/></w:rPr></w:pPr><w:r w:rsidRPr=\"00571EF2\">" + "<w:rPr><w:rFonts w:hint=\"eastAsia\"/><w:sz w:val=\"28\"/><w:szCs w:val=\"28\"/></w:rPr><w:t>" + onename + "</w:t></w:r>

    这个为单个图片的格式

    <pkg:part pkg:name=\"/word/media/image." + i + "\" pkg:contentType=\"image/" + i + "\" pkg:compression=\"store\"><pkg:binaryData>" + getImageStrone() + "</pkg:binaryData></pkg:part>

    这个是导出图片需要在上面添加的地方,具体看截图

    <Relationship Id=\"" + "rId" + i + "\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"media/image." + i + "\"/>

    这个是导出图片需要在下面面添加的地方,具体看截图

    <pkg:part pkg:name=\"/word/media/image." + i + "\" pkg:contentType=\"image/" + i + "\" pkg:compression=\"store\"><pkg:binaryData>" + getImageStrone() + "</pkg:binaryData></pkg:part>

    转载请注明原文地址: https://ju.6miu.com/read-3308.html

    最新回复(0)