精华内容
下载资源
问答
  • 大家好 今天教大家如何批量导出WORD文档中的图片 ...现在进入正题 演示一下批量导出word文档的图片 而且是原图 不重复 接下来看我操作 仔细看 我就不打字了 中间那个提示那个地方选择 “是” 不能选择“否” 这
  • 首先,这个图本身得是个矢量图才能导出高清矢量图,非矢量图则会导出原图 word文档另存为 “网页” 会存储一个.files文件夹 文件夹中的后缀为emz文件,用解压软件解压(解压不好的就把emz改为rar,这样就熟悉了吧...
    1. 首先,这个图本身得是个矢量图才能导出高清矢量图,非矢量图则会导出原图
    2. word文档另存为 “网页”
    3. 会存储一个.files文件夹
    4. 文件夹中的后缀为emz文件,用解压软件解压(解压不好的就把emz改为rar,这样就熟悉了吧~)
    5. 里面的没有后缀名的文件就是矢量图,把它加上后缀.emf 或者.pdf
      1. emf 的图我打不开。但很多教程这么做
      2. pdf 的图绝对是高清的,且能导入photoshop的。我一般用的就是pdf
    6. over
    展开全文
  • 1、找到有一大串这种字符的地方(Base64字符串),word图片转换过的。直接删掉就可以,我们是要后台传值过来的。 2、然后修改这段代码,循环图片,自己缕缕,就能看出来,跟jsp列表循环差不多 如果用的2016...

    一、jar包支持

    1、freemarker

    freemarker-2.3.28.jar

    2、poi

     

    poi-3.9.jar
    poi-examples-3.9.jar
    poi-excelant-3.9.jar
    poi-ooxml-3.9.jar
    poi-ooxml-schemas-3.9.jar
    poi-scratchpad-3.9.jar

    ps:如果项目里poi版本为poi-4.1.0及以上,建议使用poi-tl-1.5.0

      附带地址教程http://deepoove.com/poi-tl/

    二、大概步骤

    1、创建word—调整样式—调整XML代码—修改扩展名ftl,就可以使用了

    我用的office版本是  office专业增强版 2016,不同版本可能有所不同。

    三、创建office2007的重要步骤

    wps没试过,不清楚。就是讨厌wps,没有原因。

    1、表格取值

    1、先用office2007新建一个word文档(一定要!!!),office是向下兼容的,2007及以下版本,无法打开freemarker导出后的2007以上版本的(意思是2007无法打开高版本)

    2、新建好07.docx之后,用高版本或者当前版本打开。

      设定你需要的模板,先把内容都填充了,先调整好样式,在删掉内容后,写好参数 ,后台是以map key的形式往模板里插入的${xxx},尽量不要有个空格。

      需要插入图片的地方插入两张...最好是不同的图片,可以看出来区别(方便修改代码,因为要看懂word的XML语言,也后面多个图片循环),列表同样。见下图

     

    3、表格完成之后,另保存为.xml文件,(是另存为,不是直接修改扩展名),选择Word XML 文档就行,不用2003 XML的。

    4、另存为.XML文件,就可以用Notpad++打开看代码了,如果遇到  ${xxx}  这几个占位符不在一起的情况,都把他们调整放在一起,转xml的时候格式造成的

    譬如这种:直接修改,红圈的样式可以直接删掉,不影响。再看看其他的,有很多占位符有问题。

     

    2、图片循环

    1、找到有一大串这种字符的地方(Base64字符串),word图片转换过的。直接删掉就可以,我们是要后台传值过来的。

    2、然后修改这段代码,循环图片,自己缕缕,就能看出来,跟jsp列表循环差不多

    如果用的2016版本,就需要循环三个地方。有指向性的问题,七标题里面会提到

     

    方便使用,这里粘贴这部分代码。

     

     <!-- 代表一行几列的意思,由图片宽度决定 -->
                                    <w:pict>
                                        <v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
                                            <v:stroke joinstyle="miter"/>
                                            <v:formulas>
                                                <v:f eqn="if lineDrawn pixelLineWidth 0"/>
                                                <v:f eqn="sum @0 1 0"/>
                                                <v:f eqn="sum 0 0 @1"/>
                                                <v:f eqn="prod @2 1 2"/>
                                                <v:f eqn="prod @3 21600 pixelWidth"/>
                                                <v:f eqn="prod @3 21600 pixelHeight"/>
                                                <v:f eqn="sum @0 0 1"/>
                                                <v:f eqn="prod @6 1 2"/>
                                                <v:f eqn="prod @7 21600 pixelWidth"/>
                                                <v:f eqn="sum @8 21600 0"/>
                                                <v:f eqn="prod @7 21600 pixelHeight"/>
                                                <v:f eqn="sum @10 21600 0"/>
                                            </v:formulas>
                                            <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
                                            <o:lock v:ext="edit" aspectratio="t"/>
                                        </v:shapetype>
                                        <!-- office2007 图片循环-->
                                        <#list image as item >
                                            <w:binData w:name="wordml://${item.image_name}" xml:space="preserve">${item.image_base64}</w:binData>
                                        <v:shape id="_x0000_i1027" type="#_x0000_t75" style="width:255pt;height:255pt">
                                            <v:imagedata src="wordml://${item.image_name}" o:title="photo"/>
                                            <o:lock v:ext="edit" aspectratio="f"/>
                                        </v:shape>
                                        </#list>
    
                                    </w:pict>

     

     

    3、列表循环

     1、列表循环同理,找到大致的列表,写个list循环就可以,这里只截图我的结果了

    好了,这部分完事了

     

     

    四、jsp、js代码

      

    <a class="layui-btn" οnclick="exportWord(); return false;">导出word文档</a>
    
    function exportWord() {
        var $form=$('<form action="'+ sys_ctx +'/EventWord/default.do">'+'<input type="hidden" name="method" value="exportWord"/></form>');
        $form.append('<input type="hidden" name="guid" value="' + guid+ '" />');
        $form.append('<input type="hidden" name="source_type_id" value="' + processInstanceId+ '" />');
        $form.appendTo($("body")).submit().remove();
    }

    五、java代码

    1、EventWordController

     

    package sdcncsi.ict.customized.event.EventWord;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.transaction.annotation.Transactional;
    import org.springframework.web.bind.annotation.RequestMapping;
    import sdcncsi.ict.flow.WorkFlowService;
    import sdcncsi.ict.util.RequestUtil;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @Transactional
    @Controller
    @RequestMapping("/EventWord/default.do")
    public class EventWordController {
        @Autowired
        private WorkFlowService workFlowService;
    
    
        // 导出word
        @RequestMapping(params = "method=exportWord")
        public void exportWord(HttpServletRequest request, HttpServletResponse response) {
            try {
                EventWord eventWord = new EventWord(RequestUtil.getMap(request));
                eventWord.exportWord(request, response);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }

     

    2、EventWord

    package sdcncsi.ict.customized.event.EventWord;
    
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    import freemarker.template.TemplateException;
    import sdcncsi.ict.customized.event.common.EventFlow;
    import sdcncsi.ict.util.Base64Util;
    import sdcncsi.ict.util.StringUtil;
    import sdcncsi.ict.util.ZhsqBaseDao;
    import sdcncsi.ict.util.cache.CacheUtil;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.*;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class EventWord extends ZhsqBaseDao {
    
        public EventWord(Map mapIn) {
            super(mapIn);
        }
    
    
    
        private static String _PATH="/customized/event/EventDoc/2007template/";//模板路径
        private static String _PATH_NAME="event.ftl";//模板路径名称
        private static String _NAME="事件详细信息表.doc";//导出后的文件名称
    
    
        public void exportWord(HttpServletRequest request, HttpServletResponse response) throws IOException, TemplateException {
    
    //        // 修改导出模板路径
            String exportTemplatePath = request.getSession().getServletContext().getRealPath(_PATH);
    //
    //        FileUtil fileUtil = new FileUtil();
    //        // 上传路径
    //        String uploadTempPath = CacheUtil.getParamValue("uploadTempPath");
    //        // 插入数据后的文件路径
    //        String dataFilePath = _TYPE + File.separator + DateUtil.getCurrentTime("yyyyMMdd") + File.separator;
    //        fileUtil.Createdir(uploadTempPath + dataFilePath);
    //        // 把模板拷贝到临时目录
    //        fileUtil.copyFile("222.ftl", exportTemplatePath + File.separator, uploadTempPath + dataFilePath, _PATH_NAME);
    
    //        String WordPath = uploadTempPath + dataFilePath + File.separator + downloadName;
    //
            //第一步:创建一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker对于的版本号。
            Configuration configuration = new Configuration();
            // 第二步:设置模板文件所在的路径。
            configuration.setDirectoryForTemplateLoading( new File(exportTemplatePath));
            //第三步:设置模板文件使用的字符集。一般就是utf-8.
            configuration.setDefaultEncoding("utf-8");
            // 第四步:加载一个模板,创建一个模板对象。
            Template template = configuration.getTemplate(_PATH_NAME);
            // 第五步:创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。
            Map dataModel = new HashMap();
    
    
            // 第六步 定义向数据集中添加数据
    
            //--------------从这里开始取所需要的数据 start
            EventFlow eventflow = new EventFlow(map);
            Map EventMap =eventflow.getEventDetail();//这是整个返回值
            eventflow.getAttachmentByEventGuid();//这是图片信息
            Map<String ,Object> detailMap = (Map) EventMap.get("detail");//从返回值里面取出详情数据
            List <Map<String ,Object>> photoList = (List<Map<String, Object>>) EventMap.get("fjurl");//图片信息是多个,所以用list
            map.put("processInstanceId",map.get("source_type_id"));
            List<Map<String, Object>> historyTasks = (List<Map<String, Object>>) eventflow.getHistoricTask().get("historyTasks");
    
    
    
            //开始循环取出多个图片 start
            List<Map<String, Object>> imageList=new ArrayList();
            String ftpIP = CacheUtil.getParamValue("ftpaddress");//缓存里取出ftp地址
            String port = CacheUtil.getParamValue("ftpserverport");//缓存里取出端口
    
            //下面有解释
            int j = 0;
            //需要循环word中的  Relationships标签,Id=  自己定义从rId10开始
            String relationship = "rId";
            int relationship_id = 9;//
            for (int i = 0; i <photoList.size() ; i++) {
                j++;
                relationship_id++;
                Map<String, Object> _map=new HashMap();
                Map map1 = photoList.get(i);
                String imgUrl = "http://"+ftpIP+":"+port+StringUtil.getStringValue(map1.get("remotepath"));
                //获取图片类型
                String type = StringUtil.getStringValue(map1.get("type"));
                //截取图片类型 jpeg
                type = type.substring(type.indexOf("/")+1);
                //获取图片名称,不加扩展名 word里面是image1 image2  ...依次递归
                String filename = "image"+j;
                String imageBase64 = Base64Util.ImageUrlBase64(imgUrl);
    
                _map.put("image_name",filename+"."+type);
                _map.put("image_base64",imageBase64);
                _map.put("image_type",StringUtil.getStringValue(map1.get("type")));
                _map.put("relationship_id",relationship+relationship_id);
                imageList.add(_map);
            }
            //开始循环取出多个图片 end
    
    
            //开始循环流程 start
            List<Map<String, Object>> list=new ArrayList();
            for (int i = 0; i < historyTasks.size(); i++) {
                Map<String, Object> _map=new HashMap();
                Map map1 = historyTasks.get(i);
                String cur_organizationname  = StringUtil.getStringValue(map1.get("cur_organizationname"));
                String cur_opername  =StringUtil.getStringValue(map1.get("cur_opername"));
                if(StringUtil.isNull(cur_organizationname)){
                    cur_organizationname  = "网格员";
                }
                if(StringUtil.isNull(cur_opername)){
                    cur_opername  = cur_organizationname;
                }
                //阶段
                String jied = "由【"+cur_organizationname+":"+cur_opername+"】"+StringUtil.getStringValue(map1.get("dictname"));
                        if(!"".equals(StringUtil.getStringValue(map1.get("to_organizationname")))){
                            jied+= "给【"+StringUtil.getStringValue(map1.get("to_organizationname"))+"】";
                        }
    
                //意见
                String yj = StringUtil.getStringValue(map1.get("content"));
                //操作时间
                String date = StringUtil.getStringValue(map1.get("createtime"));
    
                _map.put("jd",jied);
                _map.put("yj",yj);
                _map.put("date",date);
    
                list.add(_map);
    
            }
            //结束循环流程  end
    
            //--------------从这里开始取所需要的数据 end
    
    
    
            //开始放入数据  map就可以
    
            /**
             *  例如: .ftl里面取的方式
             * <#list image as item >
             *      <v:shape id="_x0000_i1025" type="#_x0000_t75" style="width:250pt;height:250pt">
             *      <v:imagedata r:id="${item.relationship_id}" o:title="photo"/>
             *      </v:shape>
             * </#list>
             *
             *
             */
            dataModel.put("guid",detailMap.get("guid"));//事件编号
            dataModel.put("source_type",detailMap.get("source_type"));//问题来源
            dataModel.put("createdate",detailMap.get("createdate"));//发现时间
            dataModel.put("createopername",detailMap.get("createopername"));//上报人
            dataModel.put("phonenumber",detailMap.get("phonenumber"));//联系电话
            dataModel.put("type_1",detailMap.get("type_1"));//事件类型
            dataModel.put("address",detailMap.get("address"));//坐标
            dataModel.put("position",detailMap.get("position"));//发生地址
            dataModel.put("description",detailMap.get("description"));//案件描述
            dataModel.put("orgname",detailMap.get("orgname"));//所属网格
            dataModel.put("historyTasks",list);//流程
            dataModel.put("image",imageList);//多个图片
    
    
            // 设置下载文档名称
            String fileName = _NAME;
            fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
            response.setHeader("Content-Disposition", "attachment;filename="+ fileName);
            Writer out = new BufferedWriter(new OutputStreamWriter(response.getOutputStream(),"utf-8"));
    
            // 第七步:调用模板对象的process方法输出文件。
            template.process(dataModel, out);
            // 第八步:关闭流。
            out.close();
    
        }
    
    }

    3、Base64Util

    package sdcncsi.ict.util;
    
    import java.io.*;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import javax.imageio.stream.FileImageInputStream;
    
    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;
    
    /**
     * @Description 图片字符串转换
     * @Author wangxa
     * @Date 2019-08-20 10:16
     */
    public class Base64Util{
        /**
         * 字符串转图片
         * @param base64Str
         * @return
         */
        public static byte[] decode(String base64Str){
            byte[] b = null;
            BASE64Decoder decoder = new BASE64Decoder();
            try {
                b = decoder.decodeBuffer(replaceEnter(base64Str));
            } catch (IOException e) {
                e.printStackTrace();
            }
            return b;
        }
    
        /**
         * 图片转字符串
         * @param image
         * @return
         */
        public static String encode(byte[] image){
            BASE64Encoder decoder = new BASE64Encoder();
            return replaceEnter(decoder.encode(image));
        }
    
        public static String encode(String uri){
            BASE64Encoder encoder = new BASE64Encoder();
            return replaceEnter(encoder.encode(uri.getBytes()));
        }
    
        /**
         *
         * @path    图片路径
         * @return
         */
    
        public static byte[] imageTobyte(String path){
            byte[] data = null;
            FileImageInputStream input = null;
            try {
                input = new FileImageInputStream(new File(path));
                ByteArrayOutputStream output = new ByteArrayOutputStream();
                byte[] buf = new byte[1024];
                int numBytesRead = 0;
                while((numBytesRead = input.read(buf)) != -1){
                    output.write(buf, 0, numBytesRead);
                }
                data = output.toByteArray();
                output.close();
                input.close();
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return data;
        }
    
    
    
        public static String replaceEnter(String str){
            String reg ="[\n-\r]";
            Pattern p = Pattern.compile(reg);
            Matcher m = p.matcher(str);
            return m.replaceAll("");
        }
    
        /**
         * 远程读取image转换为Base64字符串
         * @param imgUrl =图片地址全路径
         * @return
         */
        public static String ImageUrlBase64(String imgUrl) {
            URL url = null;
            InputStream is = null;
            ByteArrayOutputStream outStream = null;
            HttpURLConnection httpUrl = null;
            try{
                url = new URL(imgUrl);
                httpUrl = (HttpURLConnection) url.openConnection();
                httpUrl.connect();
                httpUrl.getInputStream();
                is = httpUrl.getInputStream();
    
                outStream = new ByteArrayOutputStream();
                //创建一个Buffer字符串
                byte[] buffer = new byte[1024];
                //每次读取的字符串长度,如果为-1,代表全部读取完毕
                int len = 0;
                //使用一个输入流从buffer里把数据读取出来
                while( (len=is.read(buffer)) != -1 ){
                    //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
                    outStream.write(buffer, 0, len);
                }
                // 对字节数组Base64编码
                return new BASE64Encoder().encode(outStream.toByteArray());
            }catch (Exception e) {
                e.printStackTrace();
            }
            finally{
                if(is != null)
                {
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(outStream != null)
                {
                    try {
                        outStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(httpUrl != null)
                {
                    httpUrl.disconnect();
                }
            }
            return imgUrl;
        }
    
        /**
         * @Description: 获取图片对应的base64码(以文件的形式)
         * @Author: wangxa
         * @throws IOException
         * @Date: 18:25 2019/8/19
         */
        public static String getImageBase64String(File imgFile) throws IOException {
            InputStream inputStream = new FileInputStream(imgFile);
            byte[] data = new byte[inputStream.available()];
            int totalNumberBytes = inputStream.read(data);
            BASE64Encoder encoder = new BASE64Encoder();
            return encoder.encode(data);
        }
    
    
    }

    好了,这就是所有的步骤了。希望需要的人少走弯路。

     

     

    六、效果图展示

     

     

    七、附带office2016的XML

    (记录自己走过的坑o(╥﹏╥)o)  需要修改三个地方!!!图片才能展现,也就是为什么要用07版本的office创建了。

    <!-- 大概是图片一行两列的意思 起 -->
                                    <w:p w:rsidR="00914388" w:rsidRPr="00786262" w:rsidRDefault="00D04BAC">
                                        <w:pPr>
                                            <w:rPr>
                                                <w:rFonts w:ascii="仿宋" w:eastAsia="仿宋" w:hAnsi="仿宋"/>
                                                <w:sz w:val="28"/>
                                                <w:szCs w:val="28"/>
                                            </w:rPr>
                                        </w:pPr>
                                        <w:r>
                                            <w:rPr>
                                                <w:rFonts w:ascii="仿宋" w:eastAsia="仿宋" w:hAnsi="仿宋"/>
                                                <w:sz w:val="28"/>
                                                <w:szCs w:val="28"/>
                                            </w:rPr>
                                            <w:pict>
                                                <v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
                                                    <v:stroke joinstyle="miter"/>
                                                    <v:formulas>
                                                        <v:f eqn="if lineDrawn pixelLineWidth 0"/>
                                                        <v:f eqn="sum @0 1 0"/>
                                                        <v:f eqn="sum 0 0 @1"/>
                                                        <v:f eqn="prod @2 1 2"/>
                                                        <v:f eqn="prod @3 21600 pixelWidth"/>
                                                        <v:f eqn="prod @3 21600 pixelHeight"/>
                                                        <v:f eqn="sum @0 0 1"/>
                                                        <v:f eqn="prod @6 1 2"/>
                                                        <v:f eqn="prod @7 21600 pixelWidth"/>
                                                        <v:f eqn="sum @8 21600 0"/>
                                                        <v:f eqn="prod @7 21600 pixelHeight"/>
                                                        <v:f eqn="sum @10 21600 0"/>
                                                    </v:formulas>
                                                    <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
                                                    <o:lock v:ext="edit" aspectratio="t"/>
                                                </v:shapetype>
                                                <!-- 循环这个图片映射所在位置(自己理解的) <v:shape id="_x0000_i1025"  这个的id好像不用管。 -->
                                                <#list image as item >
                                                    <v:shape id="_x0000_i1025" type="#_x0000_t75" style="width:250pt;height:250pt">
                                                        <v:imagedata r:id="${item.relationship_id}" o:title="photo"/>
                                                    </v:shape>
                                                </#list>
    
                                            </w:pict>
                                        </w:r>
                                    </w:p>
                                    <!-- 大概是图片一行两列的意思 止 -->
                                </w:tc>
    
    ---------------------------------------------------------
    
    
        <pkg:part pkg:name="/word/_rels/document.xml.rels" pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:padding="256">
            <pkg:xmlData>
                <Relationships
                        xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
                    <Relationship Id="rId8" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/>
                    <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings" Target="webSettings.xml"/>
                    <Relationship Id="rId7" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable" Target="fontTable.xml"/>
                    <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings" Target="settings.xml"/>
                    <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>
                    <Relationship Id="rId5" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes" Target="endnotes.xml"/>
                    <Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes" Target="footnotes.xml"/>
    
                    <!-- 要循环这个,每张图片一个Id, 根据上面的Id,我们定义从 rId10开始作为循环图片-->
                    <#list image as item>
                        <Relationship Id="${item.relationship_id}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/${item.image_name}"/>
                    </#list>
    
                </Relationships>
            </pkg:xmlData>
        </pkg:part>
    
    ------------------------------------------------------------------------------------------------
    
    
        <!-- 图片开始 -->
        <#list image as item >
            <pkg:part pkg:name="/word/media/${item.image_name}" pkg:contentType="${item.image_type}" pkg:compression="store">
                <pkg:binaryData>${item.image_base64}</pkg:binaryData>
            </pkg:part>
    
        </#list>
    
    
        <!-- 图片结束 -->

     

    转载于:https://www.cnblogs.com/w-yu-chen/p/11402098.html

    展开全文
  • 不停的复制粘贴,图片要在网站上复制 操作麻烦 易错,为了减轻客服的工作量(MM们出来工作也不容易啊) 17zencart论坛共享一个专门解决这个问题的插件,zencart导出订单word格式(含图片) 不是原创,转载过来。在...
  • java中将ueditor编辑器中内容html转换为word导出(解决图片问题,样式,非常完美) 这几天一直在做将ueditor文本编辑器中内容导出word文档,网上查询了好多资料但是还是有部分缺陷,我这边查阅了很多篇文章综合...

    本文章纯属博主原创,不允许盗窃抄袭,此具有版权效应

    java中将ueditor编辑器中内容html转换为word导出(解决图片问题,样式,非常完美)

    这几天一直在做将ueditor文本编辑器中内容导出为word文档,网上查询了好多资料但是还是有部分缺陷,我这边查阅了很多篇文章综合自己的代码最终写入史册,废话不多说,直接上代码

    1.新建工程,导入依赖包

    <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.10-FINAL</version>
                <type>jar</type>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>3.10-FINAL</version>
                <type>jar</type>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml-schemas</artifactId>
                <version>3.10-FINAL</version>
                <type>jar</type>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-scratchpad</artifactId>
                <version>3.10-FINAL</version>
                <type>jar</type>
                <scope>compile</scope>
            </dependency>
    

    2.编写工具代码类

    public class Html2Word3 {
        public static void main(String[] args) throws IOException {
            //html拼接出word内容
            String content = "<html>";
            //String title = "标题";
            String cx = getBodyString();
            //html拼接出word内容  这个标题没必要
            /*content+="<div style=\"text-align: center\"><span style=\"font-size: 24px\"><span style=\"font-family: 黑体\">"+title+"<br /> <br /> </span></span></div>";
            content+="<div style=\"text-align: left\"><span >"+cx+"<br /> <br /> </span></span></div>";*/
            //插入分页符
            content += "<span lang=EN-US style='font-size:12.0pt;line-height:150%;mso-fareast-font-family:宋体;mso-font-kerning:1.0pt;mso-ansi-language:EN-US;mso-fareast-language:ZH-CN;mso-bidi-language:AR-SA'><br clear=all style='page-break-before:always'></span>";
            content += "<p class=MsoNormal style='line-height:150%'><span lang=EN-US style='font-size:12.0pt;line-height:150%'><o:p> </o:p></span></p>";
            content += "</html>";
            System.out.println(content);
            byte b[] = content.getBytes();
            ByteArrayInputStream bais = new ByteArrayInputStream(b);
            POIFSFileSystem poifs = new POIFSFileSystem();
            DirectoryEntry directory = poifs.getRoot();
            DocumentEntry documentEntry = directory.createDocument("WordDocument", bais);
            bais.close();
            //输出文件,
            /*一般这个是会传到前端去直接下载的,所以这个用的比较多
            response.reset();
            response.setHeader("Content-Disposition",
                    "attachment;filename=" +
                            new String( (name + ".doc").getBytes(),
                                    "iso-8859-1"));
            response.setContentType("application/msword");
            OutputStream ostream = response.getOutputStream();*/
            //输出文件的话,new一个文件流
            FileOutputStream ostream = new FileOutputStream("D:/cccc.doc");
            poifs.writeFilesystem(ostream);
            ostream.flush();
            ostream.close();
            bais.close();
        }
    
        public static String getBodyString() throws IOException {
            File file = new File("D:\\cz\\壮\\桌面资料\\工作资料\\流程复盘节点确定.html");
            InputStream in = new FileInputStream(file);
            InputStreamReader reader = new InputStreamReader(in);
            BufferedReader br = new BufferedReader(reader);
            String s = null;
            StringBuffer buff = new StringBuffer();
            while ((s = br.readLine()) != null) {
                buff.append(s);
            }
            br.close();
            reader.close();
            in.close();
            System.out.println(buff.toString());
            buff.delete(0,buff.indexOf("<head>"));
            buff.deleteCharAt(buff.indexOf("</html>"));
            /*StringBuffer buffStyle = new StringBuffer();
            //截取样式代码
            buffStyle.append(buff.substring(buff.indexOf("<style type=\"text/css\">") + 23, buff.indexOf("style", buff.indexOf("<style type=\"text/css\">") + 23) - 2));
            System.out.println(buffStyle);
            //截取body代码
            String body = buff.substring(buff.indexOf("<body"), buff.indexOf("</body") + 7);
            body = body.replaceAll("body", "div");
            StringBuffer bodyBuffer = new StringBuffer(body);
            System.out.println(bodyBuffer);
            String[] split = buffStyle.toString().split("}");
            Map<String, String> styleMap = new HashMap<>();
            for (String s1 : split) {
                System.out.println(s1);
                String[] split1 = s1.split("\\{");
                styleMap.put(split1[0].substring(1), split1[1]);
            }
            Set<String> strings = styleMap.keySet();
            for (String key : strings) {
                System.out.print("key : " + key);
                System.out.println("   value : " + styleMap.get(key));
                //将嵌入样式转换为行内样式
                if (bodyBuffer.toString().contains(key)) {
                    int length = bodyBuffer.toString().split(key).length - 1;
                    int temp = 0;
                    for (int i = 0; i < length; i++) {
                        temp = bodyBuffer.indexOf(key, temp);
                        //这个是每次查询到的位置,判断此标签中是否添加了style标签
                        String isContaionStyle = bodyBuffer.substring(temp, bodyBuffer.indexOf(">", temp));
                        if (isContaionStyle.contains("style")) {
                            //代表已经存在此style,那么直接加进去就好了
                            //首先找到style的位置
                            int styleTemp = bodyBuffer.indexOf("style", temp);
                            bodyBuffer.insert(styleTemp + 7, styleMap.get(key));
                        } else {
                            //代表没有style,那么直接插入style
                            int styleIndex = bodyBuffer.indexOf("\"", temp);
                            bodyBuffer.insert(styleIndex + 1, " style=\"" + styleMap.get(key) + "\"");
                        }
                        temp++;
                    }
                }
                System.out.println(bodyBuffer.toString());
            }*/
            System.out.println(buff.toString());
            return buff.toString();
        }
    }
    

    3.日期工具类

    public class DateUtil {
        public static final String YYYY_MM_DD = "yyyy-MM-dd";
        public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
        public static final String YYYYMMDD = "yyyyMMdd";
    
        public static String date2str(String pattern){
            DateFormat dateFormat = new SimpleDateFormat(pattern);
            return dateFormat.format(new Date());
        }
    
        public static String date2str(Date date ,String pattern){
            DateFormat dateFormat = new SimpleDateFormat(pattern);
            return dateFormat.format(date);
        }
    
        //获取前一天日期
        public static Date getYesterDay(){
            Calendar calendar = Calendar.getInstance();
            //这个地方别写成了calendar.set(Calendar.DAY_OF_MONTH,-1);
            calendar.add(Calendar.DAY_OF_MONTH,-1);
            return calendar.getTime();
        }
    
        //获取前一天日期的字符串
        public static String getYesterDay(String pattern){
            Calendar calendar = Calendar.getInstance();
            //这个地方别写成了calendar.set(Calendar.DAY_OF_MONTH,-1);
            calendar.add(Calendar.DAY_OF_MONTH,-1);
            return date2str(calendar.getTime(),pattern);
        }
    }
    
    展开全文
  • 制作Word模版 建议使用高版本的office做,尽量不要用WPS做,生成xml会出现乱码 编码要统一,推荐UTF-8 建好模板,将模板另存为xml格式,建议原来模板不要删,xml的如果后期打不开,还有原版参考 (编辑器网上有...

    制作Word模版

    建议使用高版本的office做,尽量不要用WPS做,生成xml会出现乱码

    编码要统一,推荐UTF-8

    建好模板,将模板另存为xml格式,建议原来模板不要删,xml的如果后期打不开,还有原版参考

    (编辑器网上有人说firstobject XML Editor这个好用,本次没用到直接用的是Editplus)

    需要freemarker-2.3.13.jar包

      1 package com.xu.word.export;
      2 
      3 import java.io.BufferedWriter;
      4 import java.io.File;
      5 import java.io.FileInputStream;
      6 import java.io.FileOutputStream;
      7 import java.io.IOException;
      8 import java.io.InputStream;
      9 import java.io.OutputStreamWriter;
     10 import java.io.Writer;
     11 import java.util.ArrayList;
     12 import java.util.HashMap;
     13 import java.util.List;
     14 import java.util.Map;
     15 
     16 import org.junit.Test;
     17 
     18 import sun.misc.BASE64Encoder;
     19 import freemarker.template.Configuration;
     20 import freemarker.template.DefaultObjectWrapper;
     21 import freemarker.template.Template;
     22 import freemarker.template.TemplateException;
     23 import freemarker.template.TemplateExceptionHandler;
     24 
     25 public class DocumentHandler {
     26     private Configuration configuration = null;
     27 
     28     public DocumentHandler() {
     29         configuration = new Configuration();
     30         // 设置默认编码为UTF-8
     31         configuration.setDefaultEncoding("UTF-8");
     32     }
     33     
     34     /**
     35      * 
     36      * @param dir 目录名称
     37      * @param fileName 文件名
     38      * @param savePath 要保存的路径
     39      * @param sDate 数据(键值对形式,Map形式最好)
     40      */
     41     public void createDocForMap(String dir, String fileName, String savePath, Map dataMap) {
     42         // 要填入模本的数据文件 dataMap
     43         // 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
     44         // 这里我们的模板是放在com.xu.word.export.template包下面???好像加不加这句话都一样
     45         configuration.setClassForTemplateLoading(this.getClass(), "/template");
     46         Template t = null;
     47         try {
     48             // 从什么地方加载freemarker模板文件
     49             configuration.setDirectoryForTemplateLoading(new File(dir));
     50 
     51             // 设置对象包装器
     52             configuration.setObjectWrapper(new DefaultObjectWrapper());
     53             // 设置异常处理器
     54             configuration
     55                     .setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
     56             // 装载的模板
     57             t = configuration.getTemplate(fileName, "UTF-8");
     58         } catch (IOException e) {
     59             e.printStackTrace();
     60         }
     61         // 输出文档路径及名称
     62         File outFile = new File(savePath);
     63         Writer out = null;
     64         try {
     65             out = new BufferedWriter(new OutputStreamWriter(
     66                     new FileOutputStream(outFile), "utf-8"));
     67         } catch (Exception e1) {
     68             e1.printStackTrace();
     69         }
     70 
     71         try {
     72             t.process(dataMap, out);
     73         } catch (TemplateException e) {
     74             e.printStackTrace();
     75         } catch (IOException e) {
     76             e.printStackTrace();
     77         }
     78     }
     79     
     80     /**
     81      * 将图片进行BASE64编码
     82      * @param imgFilePath 图片路径
     83      * @return
     84      */
     85     private static String getImageStr(String imgFilePath) {
     86         String imgFile = imgFilePath;
     87         InputStream in = null;
     88         byte[] data = null;
     89         try {
     90             in = new FileInputStream(imgFile);
     91             data = new byte[in.available()];
     92             in.read(data);
     93             in.close();
     94         } catch (IOException e) {
     95             e.printStackTrace();
     96         }
     97         BASE64Encoder encoder = new BASE64Encoder();
     98         return encoder.encode(data);
     99     }
    100     
    101     /**
    102      * 测试方法
    103      */
    104     @Test
    105     public void testImportWord(){
    106         long start = System.currentTimeMillis();
    107         
    108         Map data = new HashMap();
    109         data.put("abcd1", "尼玛");
    110         // 集合数据
    111         List l = new ArrayList();
    112         l.add("aaaaa"); // 此处可以进行换行加到模板中 <w:br />
    113         l.add("abbbb");
    114         l.add("cccc");
    115         l.add("ddd");
    116         data.put("abcd1", l);
    117         
    118         data.put("abcd2", "尼玛1");
    119         data.put("abcd3", "尼玛2");
    120         data.put("abcd4", "尼玛3");
    121         data.put("abcd5", "尼玛4");
    122         data.put("abcd6", "尼玛5");
    123         data.put("abcd7", "尼玛6");
    124         data.put("abcd8", "尼玛7");
    125         data.put("abcd9", "尼玛8");
    126         // 目录获取有点繁琐了
    127         String root = DocumentHandler.class.getClassLoader().getResource("").getPath() + "com/xu/word/export/template/";
    128         
    129         data.put("image", getImageStr(root+"/1.jpg"));
    130         DocumentHandler dh = new DocumentHandler();
    131         dh.createDocForMap(root, "tpl.ftl", "E:/outFile4.doc", data);
    132         
    133         long end = System.currentTimeMillis();
    134         System.out.println("导出成功,用时" + (end - start));
    135     }
    136 
    137 }

    如果你希望在Word文档中插入图片,可以把Word另存为的XML文件中代表图片的那个很长的字符串( BASE64编码 的字符串)换成一个占位符,在将要插入Word文档的图片对象转换成BASE64编码的字符串,用该字符串替换掉占位符就可以了

    转载于:https://www.cnblogs.com/zhuolu/p/5125580.html

    展开全文
  • 不管原图片是png、jpg还是pdf格式,都可以方便的转化为eps格式的矢量,并在Latex中使用。 1、Excel图表导出图片 选中Excel中想要导出的图表(左键点击) 选择 开始 –> 复制 –> 复制为图片 选择 如...
  • 导出的页面 ...1、图片:如果是网络图片导出之后再wps可以查看,word 不行 2、a 标签链接可以 3、内联样式可以 4、flex 布局不可以 code /* 导出方法 */ exportHTML() { let header = "<...
  • echarts导出后的echarts:没有数据 根据官方给出的示例写代码,导出后没有数据 如果有动画效果的话,生成的图片会是在有动画效果出来以前的样子,就是说数据还没渲染上去,因此导出图片没有数据。 ...
  • IE浏览器下,将页面导出word

    千次阅读 2017-01-17 16:26:45
    IE由于其特殊性,很多将页面导出为静态文件的方法对其并不适用,特别是当页面内容较多且复杂(如包含图片等)的时候,大多数情况下只能利用IE的生态js代码进行导出,其具体内容如下: 页面上的代码为: ...
  • 原图片 识别出来结果保存在以识别时间命名的txt文本文件中 将PDF转成png图片的格式导出到一个文件夹中 识别的结果,但是数学公式不能识别 调用360截图软件截取网页图片,点击“完成”开始识别并保存到txt文本文件中 ...
  • word另存为xml,然后通过freemarker来生成文档,处理图片时,把图片转成base64码放入xml,但导出word一直打不开。 各种分析后,通过文本比较工具发现原生含图片word和生成的word,字符完全一样,但生成的...
  • **[NiceXWPFDocument](http://deepoove.com/poi-tl/apache-poi-guide.html#_word%E5%90%88%E5%B9%B6)** 进行word文档合并,文档中的图片、表格、各种统计(饼状、折线、条形...)、文字,都能很NICE的合并、导出
  • asp.net操作word的表格

    千次阅读 2013-08-27 17:06:04
    近日开发中用户要求实现导出数据为Word,本来想使用html保存为word的实现,但因用户要求样式很高,使用html不好控制,并且导出中包括图片,使用页面导出图片还是一个路径,不能把图片包括在word中,所以就必须使用...
  • 原文:.Net中把图片等文件放入DLL中,并...本文就讲述了如何把文件(比如图片WORD文档等等) 隐藏到DLL中,然后在程序中可以自己根据需要导出图片进行处理。 注:本站原创,转载请注明本站网址:http://www.beine...
  • 10、批量导出图片:将当前文档中的所有图片导出到指定的路径下,保存为JPG格式的图片文件。 11、拆分文档:将WORD文件的每一页替换成一个文档,适用于每页之间不存在关联、可以独立成文的文档。例如调查表,文档的每...
  • 将当前文档中的所有图片导出到指定的路径下,保存为JPG格式的图片文件。 所有数值 用红色标示出全文档中的所有数值。 大于参考值 用红色标示出全文档中的大于某个值的数值。 小于参考值 用红色标示出全文档中小于...
  • 本文就讲述了如何把文件(比如图片WORD文档等等) 隐藏到DLL中,然后在程序中可以自己根据需要导出图片进行处理。注:本站原创,转载请注明本站网址:http://www.beinet.cn/blog/【全文】第1步:我们要生成
  • 【保存为图片】将选区或者工作表中的图片导出成JPG文件或者PNG图片 【生成个性化批注】Excel本身只有方形批注,本工具可以生各种花样的变体批注,美观大方 【插入GIF动画】将GIF动画插入到工作表中播放,可以随意...
  • 罗刚君Word精灵 v3.0.rar

    2019-07-13 05:22:16
    批量导出图片:将当前文档中的所有图片导出到指定的路径下,保存为JPG格式的图片文件。 批量替换:对当前文档的内容、页眉、页脚执行批量替换,例如将1替换成A,将2替换成B,将3替换成C...... 多文档批量替换:对...
  • Word转PDF后,排版错乱怎么办?

    千次阅读 2020-03-06 19:07:21
    有时为了不同场合需求,我们会将Word文档转成PDF使用,而office软件都能直接将Word另存为PDF的功能,但如果遇到导出的PDF文档对比原Word文档页数增多了,或排版错乱了应该怎么办呢? 解决办法一:善于利用打印预览 ...
  • 替代草料二维码导出标签 模板示 方案实现示 实现步骤 我使用的wps制作word模板,我的模板路径 在word中输入${qrcodepics}; 通过控制页面布局-分栏调整位置、间距、和大小 通过段落布局可以控制图片...
  • java导出excel 源码下载 Qiniu-wxapp-SDK 基于七牛云 API 开发的微信小程序 SDK 快速导航 最近一次修改: 增加了文件在线查看功能,支持的文件格式:支持的文件格式:pdf, doc, docx, xls, xlsx, ppt, pptx。 增加了...
  • 所有的数学公式保留mathtype文件格式或其他源文件(可导出latex格式的) mathtype转换成tex格式方法:https://www.mathtype.cn/jiqiao/gongshi-daima.html 数学公式注意粗体表示矢量或张量,其他一律用斜体 ...
  • 图片批量尺寸及嵌表格式导、导入多行列图片具备18项可设置参数,多达80种组合导入方式,满足各行业不同需求的图片导入导出与规范排版。表达式计算精灵让数学函数及复杂公式表达式全自动计算一切变得那么轻巧与高效...
  • 【一键导出图形】 将工作表中的图片导出为图片文件。 【导入图片到工作表】 将磁盘中的图片导入到工作表中。 【删除选中区域图形】 将工作表中当前选中区域的所有图片与图形删除。 【删除所有导入图形】 将工作表...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 152
精华内容 60
关键字:

word图片导出原图