`

word导出 以及批量导出并压缩

阅读更多

 

package com.hesc.wpc.common.utils;

import java.io.ByteArrayOutputStream;
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.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.mail.internet.MimeUtility;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;

import com.hesc.wpc.web.controller.admin.meeting.view.MeetingView;

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import sun.misc.BASE64Encoder;

/**
 * 生成word文档工具类
 * @author ypf
 * @date 2017-05-17
 */
public class WordUtil {
    
    private static final Logger logger = LoggerFactory.getLogger(MeetingView.class);

   private static Configuration configuration = null;  
    
    static {  
        configuration = new Configuration();  
        configuration.setDefaultEncoding("utf-8");  
        try {  
        	ResourceLoader resourceLoader = new DefaultResourceLoader();
            //指定模板目录在类路径:WEB-INF/classes
			Resource resource = resourceLoader.getResource("/");
			File file = resource.getFile();
			//设置要解析的模板所在的目录,并加载模板文件
			configuration.setDirectoryForTemplateLoading(file);
            ///设置包装器,并将对象包装为数据模型
			configuration.setObjectWrapper(new DefaultObjectWrapper());
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }   
    /**
     * 根据类路径获取模板
     * @param templatePath
     * @param templateName
     * @return
     * @throws IOException
     */
    private static Template getTemplate(String templatePath, String templateName) throws IOException {
         Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);
         configuration.setDefaultEncoding("UTF-8");
         configuration.setDirectoryForTemplateLoading(new File(templatePath));
         return configuration.getTemplate(templateName, "UTF-8");
    }
    /**
     * 导出word 文档
     * @param typeName 会议类型名称
     * @param dataMap 数据
     * @param xmlpath xml 模板路径
     * @param response
     * @param request
     */
    public static void createWord(String typeName,Map<String, Object> dataMap,String xmlpath,HttpServletResponse response, HttpServletRequest request){
        Template t = null;
        try {
            t = getTemplate(request.getSession().getServletContext().getRealPath("/"), xmlpath);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        File file = null;
        InputStream fin = null;
        ServletOutputStream out =null;
        file = createDocx(dataMap,t,request);
        try {
             fin = new FileInputStream(file);
             String filename=encodeFilename(typeName+".doc", request);
             response.setContentType("application/x-msdownload");
             response.setHeader("Content-Disposition", "attachment; filename=\""+filename+"\"");
             out = response.getOutputStream();
             byte [] buffer=new byte[512];
             int byteToRead = -1;
             while((byteToRead = fin.read(buffer)) != -1){
                out.write(buffer, 0, byteToRead);
             }
        } catch (IOException e) {
            logger.error("word文档导出错误:"+e.getMessage());
        }finally{
            try {
            if(null != fin){
            	fin.close();
            }
            if(null != out){
            	out.flush();
            	out.close();
            }
            } catch (IOException e) {
                logger.error("word文档导出错误:"+e.getMessage());
            }
        }
    }
    /**
     * 导出word 文档
     * @param typeName 会议类型名称
     * @param dataMap 数据
     * @param xmlpath xml 模板路径
     * @param response
     * @param request
     */
    public static void createWord(String typeName,List<Map<String, Object>> mapList,String xmlpath,HttpServletResponse response, HttpServletRequest request){
    	Template t = null;
    	try {
    		t = getTemplate(request.getSession().getServletContext().getRealPath("/"), xmlpath);
    	} catch (IOException e1) {
    		e1.printStackTrace();
    	}
    	File file = null;
    	InputStream fin = null;
    	ServletOutputStream out =null;
    	for(int i=0;i<mapList.size();i++) {
     		Map<String, Object> map=mapList.get(i);
     		file = createDocx(map,t,request);
    	}
    	try {
    		fin = new FileInputStream(file);
    		String filename=encodeFilename(typeName+".doc", request);
    		response.setContentType("application/x-msdownload");
    		response.setHeader("Content-Disposition", "attachment; filename=\""+filename+"\"");
    		out = response.getOutputStream();
    		byte [] buffer=new byte[512];
    		int byteToRead = -1;
    		while((byteToRead = fin.read(buffer)) != -1){
    			out.write(buffer, 0, byteToRead);
    		}
    	} catch (IOException e) {
    		logger.error("word文档导出错误:"+e.getMessage());
    	}finally{
    		try {
    			if(null != fin){
    				fin.close();
    			}
    			if(null != out){
    				out.flush();
    				out.close();
    			}
    		} catch (IOException e) {
    			logger.error("word文档导出错误:"+e.getMessage());
    		}
    	}
    }
    /**
     * 生成word文档
     * @param dataMap
     * @param t
     * @param request
     * @return
     */
    public static File createDocx(Map<String, Object> dataMap,Template t, HttpServletRequest request){
        String path = request.getSession().getServletContext().getRealPath("/temlate.docx");
        File f=new File(path);
        Writer out = null;
        try {
            out = new OutputStreamWriter(new FileOutputStream(f),"utf-8");
            t.process(dataMap, out);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                if(null !=out){
                	out.flush();
                	out.close();
                }
            } catch (IOException e) {
                logger.error("创建word文档错误:"+e.getMessage());
            }
        }
        return f;
    }
    /** 
     * 将图片转换为base64存储 
     */  
    public static String getImageStr(String imgfilepath) {
        if (imgfilepath == null || "".equals(imgfilepath.trim())){  
            return "";
         }
        try {
            URL u = new URL(imgfilepath);  
            HttpURLConnection conn = (HttpURLConnection) u.openConnection();  
            conn.setRequestMethod("GET");
            // 设置超时响应时间为10秒  
            conn.setConnectTimeout(10000);  
            // 通过输入流获取图片数据  
            InputStream inStream = conn.getInputStream();  
            // 读取图片字节数组  
            byte[] data = readInputStream(inStream);   
            BASE64Encoder encoder = new BASE64Encoder(); 
            return encoder.encode(data); 
        } catch (Exception e) {
            logger.error("图片转换为base64存储错误:"+e.getMessage());
        }
        return "";  
    }
    
    public static byte[] readInputStream(InputStream inStream) throws Exception{  
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();  
        //创建一个Buffer字符串  
        byte[] buffer = new byte[1024];  
        //每次读取的字符串长度,如果为-1,代表全部读取完毕  
        int len = 0;  
        //使用一个输入流从buffer里把数据读取出来  
        while( (len=inStream.read(buffer)) != -1 ){  
            //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度  
            outStream.write(buffer, 0, len);  
        }  
        //关闭输入流  
        inStream.close();  
        //把outStream里的数据写入内存  
        return outStream.toByteArray();  
    }  
    /**
     * 对文件名进行编码
     * @param filename
     * @param request
     * @return
     */
    private static String encodeFilename(String filename, HttpServletRequest request) {
        String agent = request.getHeader("USER-AGENT");
        try {
            if (agent != null) {
                if (-1 != agent.indexOf("MSIE") || -1 != agent.indexOf("Trident")
                        || -1 != agent.indexOf("Chrome")) { // ie,chrome
                    String newFileName = URLEncoder.encode(filename, "UTF-8");
                    newFileName = StringUtils.replace(newFileName, "+", "%20");
                    if (newFileName.length() > 150) {
                        newFileName = new String(filename.getBytes("GB2312"), "ISO8859-1");
                        newFileName = StringUtils.replace(newFileName, " ", "%20");
                    }
                    return newFileName;
                } else if (-1 != agent.indexOf("Mozilla")) { // firefox
                    return MimeUtility.encodeText(filename, "UTF-8", "B");
                } 
            }
            
            return filename;
        } catch (Exception ex) {
            logger.error(ex.getMessage(), ex);
            return filename;
        }
    }
    /*
     *压缩包方式导出多个word
     *由于一次请求浏览器只能响应一次,想导出多个必须打包,亲测for循环导出只能导一个
     *如果想做到分别单独下载,那就得用插件啦,这里不提供插件的做法
     *思路:生成临时目录-在临时目录生成word-将临时目录打zip包-zip文件下载-删除临时目录和zip包,
     * 回收系统资源
     */
     public static void exportWordBatch(String typeName,List<Map<String, Object>> mapList,String ftlFile
    		 ,HttpServletRequest request,HttpServletResponse response) {
     	File file = null;
     	File zipfile=null;
     	File directory=null;
         InputStream fin = null;  
         ServletOutputStream out = null;
         String filename=encodeFilename(typeName, request);
 		response.setCharacterEncoding("utf-8");  
         response.setContentType("application/octet-stream");
         response .addHeader("Content-Disposition", "attachment;filename="+ filename+".zip");
         
         try {  
         	Template freemarkerTemplate = null;
            try {
            	freemarkerTemplate = getTemplate(request.getSession().getServletContext().getRealPath("/"), ftlFile);
            } catch (IOException e1) {
                e1.printStackTrace();
            }
         	out = response.getOutputStream();
         	//根据当前时间和用户id创建临时目录
         	String time =DateUtil.format(System.currentTimeMillis(), "yyyy-MM-dd");
         	String path=request.getRealPath("/resources/word/"+time+"");
         	directory=new File(path);
         	directory.mkdirs();
         	for(int i=0;i<mapList.size();i++) {
         		Map<String, Object> map=mapList.get(i);
         		//List<Map<String, Object>> list = (List<Map<String, Object>>) map.get("datalist");
         		String title=map.get("title").toString()+"_"+i;
         		// 调用工具类的createDoc方法在临时目录下生成Word文档  
                 file = createDoc(map,freemarkerTemplate,directory.getPath()+"/"+title+".doc");
         	}
         	//压缩目录
         	ZipUtils.createZip(path, path+".zip");
             //根据路径获取刚生成的zip包文件
         	zipfile=new File(path+".zip");
         	fin=new FileInputStream(zipfile);
 			byte[] buffer = new byte[512]; // 缓冲区
 			int bytesToRead = -1;
 			// 通过循环将读入的Word文件的内容输出到浏览器中
 			while ((bytesToRead = fin.read(buffer)) != -1) {
 				out.write(buffer, 0, bytesToRead);
 			}
         }catch (Exception e) {
 			e.printStackTrace();
 		}
         finally {  
         	try {
         		if (fin!=null) fin.close();
             	if (out!=null) out.close();
             	if (zipfile!=null) zipfile.delete();
             	if (directory!=null) {
                     //递归删除目录及目录下文件
             		ZipUtils.deleteFile(directory);
             	}
 			} catch (Exception e2) {
 				e2.printStackTrace();
 			}
         	
         }  
     }
   
     //生成word文档方法
     private static File createDoc(Map<?, ?> dataMap, Template template,String filename) {  
           
         File f = new File(filename);  
         //Template t = template;  
         Writer w =null;
         FileOutputStream fos=null;
         try {  
             // 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开 
         	fos=new FileOutputStream(f);
             w = new OutputStreamWriter(fos, "utf-8");
             //不要偷懒写成下面酱紫: 否则无法关闭fos流,打zip包时存取被拒抛异常
             //w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");   
             template.process(dataMap, w);  
         } catch (Exception ex) {  
             ex.printStackTrace();  
             throw new RuntimeException(ex);  
         } finally {
         	try {
         		fos.close();
     			w.close();
 			} catch (Exception e) {
 				e.printStackTrace();
 			}
 			
 		} 
         return f;  
     }  

}

   

 

package com.hesc.wpc.common.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class ZipUtils {
    

	private static final Logger log = LoggerFactory.getLogger(ZipUtils.class);
	
    private ZipUtils(){
    }
    
    public static void doCompress(String srcFile, String zipFile) throws IOException {
        doCompress(new File(srcFile), new File(zipFile));
    }
    
    /**
     * 文件压缩
     * @param srcFile 目录或者单个文件
     * @param zipFile 压缩后的ZIP文件
     */
    public static void doCompress(File srcFile, File zipFile) throws IOException {
        ZipOutputStream out = null;
        try {
            out = new ZipOutputStream(new FileOutputStream(zipFile));
            doCompress(srcFile, out);
        } catch (Exception e) {
            throw e;
        } finally {
            out.close();//记得关闭资源
        }
    }
    
    public static void doCompress(String filelName, ZipOutputStream out) throws IOException{
        doCompress(new File(filelName), out);
    }
    
    public static void doCompress(File file, ZipOutputStream out) throws IOException{
        doCompress(file, out, "");
    }
    
    public static void doCompress(File inFile, ZipOutputStream out, String dir) throws IOException {
        if ( inFile.isDirectory() ) {
            File[] files = inFile.listFiles();
            if (files!=null && files.length>0) {
                for (File file : files) {
                    String name = inFile.getName();
                    if (!"".equals(dir)) {
                        name = dir + "/" + name;
                    }
                    ZipUtils.doCompress(file, out, name);
                }
            }
        } else {
             ZipUtils.doZip(inFile, out, dir);
        }
    }
    
    public static void doZip(File inFile, ZipOutputStream out, String dir) throws IOException {
        String entryName = null;
        if (!"".equals(dir)) {
            entryName = dir + "/" + inFile.getName();
        } else {
            entryName = inFile.getName();
        }
        ZipEntry entry = new ZipEntry(entryName);
        out.putNextEntry(entry);
        
        int len = 0 ;
        byte[] buffer = new byte[1024];
        FileInputStream fis = new FileInputStream(inFile);
        while ((len = fis.read(buffer)) > 0) {
            out.write(buffer, 0, len);
            out.flush();
        }
        out.closeEntry();
        fis.close();
    }
    /**
	 * 创建ZIP文件
	 * @param sourcePath 文件或文件夹路径
	 * @param zipPath 生成的zip文件存在路径(包括文件名)
	 */
	public static void createZip(String sourcePath, String zipPath) {
		FileOutputStream fos = null;
		ZipOutputStream zos = null;
		try {
			fos = new FileOutputStream(zipPath);
			zos = new ZipOutputStream(fos);
			writeZip(new File(sourcePath), "", zos);
		} catch (FileNotFoundException e) {
			log.error("ZipUtils createZip  Failed to create ZIP file", e);
		} finally {
			try {
				if (zos != null) {
					log.debug("ZipUtils createZip Create a ZIP file successfully! the path in:{}",zipPath);
					zos.close();
					//压缩成功后,删除打包前的文件
					deleteFile( new File(sourcePath) );
				}
			} catch (IOException e) {
				log.error("ZipUtils createZip  Failed to create ZIP file", e);
			}
		}
	}
 
	private static void writeZip(File file, String parentPath,
			ZipOutputStream zos) {
		if (file.exists()) {
			if (file.isDirectory()) {// 处理文件夹
				parentPath += file.getName() + File.separator;
				File[] files = file.listFiles();
				for (File f : files) {
					writeZip(f, parentPath, zos);
				}
			} else {
				FileInputStream fis = null;
				try {
					fis = new FileInputStream(file);
					ZipEntry ze = new ZipEntry(parentPath + file.getName());
					zos.putNextEntry(ze);
					byte[] content = new byte[1024];
					int len;
					while ((len = fis.read(content)) != -1) {
						zos.write(content, 0, len);
						zos.flush();
					}
				} catch (FileNotFoundException e) {
					log.error("ZipUtils createZip  Failed to create ZIP file",e);
				} catch (IOException e) {
					log.error("ZipUtils createZip  Failed to create ZIP file",e);
				} finally {
					try {
						if (fis != null) {
							fis.close();
						}
					} catch (IOException e) {
						log.error("ZipUtils createZip  Failed to create ZIP file",e);
					}
				}
			}
		}
	}
	/**
	 * 删除文件夹
	 * @param file
	 */
	public static void deleteFile(File file) {
		if (file.exists()) {                               // 判断文件是否存在
			if (file.isFile()) {                           // 判断是否是文件
				file.delete();                            
			} else if (file.isDirectory()) {               // 否则如果它是一个目录
				File files[] = file.listFiles();           // 声明目录下所有的文件 files[];
				for (int i = 0; i < files.length; i++) {   // 遍历目录下所有的文件
					deleteFile(files[i]);                  // 把每个文件 用这个方法进行迭代
				}
			}
			file.delete();
		} 
	}
/*    public static void main(String[] args) throws IOException {
        doCompress("D:/java/", "D:/java.zip");
    }*/
    
}

 

 

分享到:
评论

相关推荐

    POI批量导入导出Demo,附带批量压缩

    本项目以"POI批量导入导出Demo,附带批量压缩"为主题,旨在提供一种高效的解决方案,通过Java泛型来处理Excel文件的批量导入和导出,并且包含了批量压缩的功能。 首先,让我们深入理解Apache POI库。它是一个Java ...

    java后台批量下载文件并压缩成zip下载的方法

    Java后台批量下载文件并压缩成zip下载的方法 Java后台批量下载文件并压缩成zip下载的方法是指在Java后台中批量下载文件,并将其压缩成zip文件下载到本地桌面。该方法具有重要的参考价值,感兴趣的小伙伴们可以参考...

    vue生成word打包下载.zip

    在本项目中,我们探讨的是如何利用Vue.js来生成Word文档并实现批量下载的功能。这个“vue生成word打包下载.zip”压缩包文件很可能是包含了一个示例项目或者代码库,用于演示这一特定功能的实现。 首先,Vue.js本身...

    导出WORD文件小结

    【压缩包子文件的文件名称列表】:导出WORD文档.docx 这个文件很可能是博客中提到的一个示例文件,用于展示如何导出Word文档。可能包含了不同的样式、图片、表格等内容,以便在代码示例中进行操作演示,例如如何...

    java POI生成word.zip

    - Java POI常用于报表生成、自动化测试报告、批量数据导出等场景。 - 结合Spring框架,可以构建Web服务,动态生成Word文档供用户下载。 以上就是关于使用Java POI生成Word文档的关键知识点,通过阅读并理解压缩包...

    Word文档批量获取内容更名工具DocBatchRenamer.zip

    5. **批量导入导出**:允许用户批量导入需要处理的Word文档列表,同时也可能支持导出已处理的文件列表,便于后续跟踪和管理。 6. **错误处理**:如果在处理过程中遇到无法打开或格式不正确的文档,工具应能智能跳过...

    word批量打印

    【描述】:“找了很久才找到的,分享下”这句话暗示了这个解决方案可能并不常见,可能是作者在研究如何通过编程方式实现Word文档的批量打印时,经过一番努力后找到的一种有效方法。在实际工作中,批量打印大量Word...

    批量将Excel数据表转为指定模板的Word文档明细表

    这个工具的标题“批量将Excel数据表转为指定模板的Word文档明细表”揭示了它的核心功能:它能够帮助用户快速地、自动地将Excel中的数据应用到预设的Word模板中,生成格式统一的明细文档。 描述中提到的“批量将...

    xml转换导出Word

    使用这个工具,开发者或用户可以将结构化的XML数据批量转换成Word文档,方便报告、报表或文档的生成。例如,一个企业可能有大量XML格式的销售数据,通过这个工具,可以快速生成定制化的销售报告,而无需手动操作。在...

    SQL定时导出数据到Excel

    `BCP`(Bulk Copy Program)是SQL Server提供的一种批量复制工具,主要用于快速地导入导出数据。通过`BCP`命令,可以非常方便地将表中的数据导出到文本文件,再将该文本文件转换为Excel格式。 **示例代码**: ```...

    C#_.NET_Excel转Xml文件流形式导出Excel

    创建一个内存流并写入XML文档,以便于批量导出和打印。 ```csharp using (MemoryStream memoryStream = new MemoryStream()) { xmlDocument.Save(memoryStream); byte[] xmlBytes = memoryStream.ToArray(); } `...

    如何批量提取Word图片?.docx

    如果你使用7-ZIP,可以直接右键拖动DOCX文件,然后在7-ZIP的右键菜单中选择“打开压缩包”,找到Media文件夹并将其导出。 总之,通过理解Word文档的内部结构和使用适当的工具,你可以轻松地批量提取Word文档中的...

    用C#.NET实现生成PDF文档和将WORD转换为PDF

    例如,可以通过创建Word应用程序实例,打开Word文档,然后使用Word的导出功能将内容保存为PDF格式。 然而,调用COM自动化技术存在一些局限性,比如依赖于用户机器上安装的Microsoft Office版本,且性能开销较大。...

    word转BMP JPG

    1. 使用内置功能:Microsoft Word自身并不直接支持导出为BMP、JPG或GIF格式,但可以通过打印功能间接实现。打开Word文档,选择“文件”&gt;“打印”,在打印机列表中选择“Microsoft Print to PDF”或其他虚拟打印机,...

    将word格式成CHM格式

    标题中的“将word格式成CHM格式”是指将Microsoft Word文档转换为CHM(Compiled HTML Help)文件的过程。...同时,这个过程也可以自动化,通过脚本或专门的转换工具批量处理多个Word文档,大大提高了工作效率。

    ppt转word文档

    这个程序很可能是专门用于PPT到Word转换的软件,它可能提供了批量转换、保持原始格式等功能。在使用这类工具时,需要注意兼容性、数据安全和软件许可问题。 在转换过程中可能会遇到以下挑战: 1. **格式丢失**:PPT...

    easypoi-demo.zip

    【标题】"easypoi-demo.zip"是一个包含使用EasyPoi库进行Excel导入导出以及Word导出的示例项目。EasyPoi是Java领域一个功能强大的办公文档处理工具,尤其在处理Excel和Word文档时表现突出。它简化了与这些格式交互的...

    Word转PDF或JPG,PPT转JPG

    - 截图工具:使用系统自带或第三方截图软件(如Snipping Tool, Snip & Sketch, Greenshot等),截取Word页面并保存为JPG。 - 图形编辑软件:例如Photoshop,打开Word文档,导出为JPG。 二、PPT转JPG 1. PPT转JPG...

    文字处理word第一节

    为了实现与其他文字处理软件的互操作性,许多程序如AbiWord、WPS、OpenOffice等都提供了导入和导出Word文档的转换工具。 【Word历史发展】 1. **Word 97**:引入了Office助手(大眼夹),增强了文件兼容性,但同时...

    word转pdf转img.zip

    综上所述,"word转pdf转img.zip"这个过程涵盖了文件格式转换、压缩存储等多个环节,涉及的工具多样,既有桌面应用也有在线服务,对于日常办公和文件处理具有很高的实用性。理解并掌握这些知识点,有助于提升工作效率...

Global site tag (gtag.js) - Google Analytics