精华内容
下载资源
问答
  • 全部 12 notes 译文原稿Word文档打包.zip 讲义中文版。入门的极佳。
  • html页面导出word文档、批量生成word文档、并且在线生成压缩包并下载
  • Word文档授权打包加密

    2011-05-02 23:47:58
    能通过讲Word加密成EXE文件,从而能警醒一机一码授权,防止文件流失
  • word模板格式,将需要替换的位置用&xx&占位符填上,在后台找到跟数据相同的名称时替换 #region 带模板导出 public HttpResponseMessage ExportWordModel(dynamic obj) { long formId = obj.id; ...

     

    word模板格式,将需要替换的位置用&xx&占位符填上,在后台找到跟数据相同的名称时替换

    #region 带模板导出
            public HttpResponseMessage ExportWordModel(dynamic obj)
            {
                long formId = obj.id;
                string selectedModel = obj.selectedModel;
                string tempFile = HttpContext.Current.Server.MapPath("~/ExcelModel/" + selectedModel).ToString();//获取模板路径
                string filePath = "导出模板文件的文件名"
                string filePathId = filePath + formId * 4564;//文件名加上一个唯一id组成的文件名, 防止表单名称重复,加上表单的唯一值id
                string saveFilePath = HttpContext.Current.Server.MapPath("~/SaveExcel/" + filePathId).ToString(); // 保存表格的路径
                try // 为空的时候会提示找不到文件夹
                {
                    ClearDownloadDirectory(saveFilePath, ""); //清空saveFilePath文件夹下的所有内容 保证每次导出时zip文件都是最新的
                }
                catch { }
                    var result = “你的数据” // 我这里result为json格式的所有后面需要序列号循环出来,具体看自己的数据格式
                    if (result.Count() != 0)
                    {
                        int num = 0; // 导出的时候给word文档命名
                        string fullPath = saveFilePath; //上传路径 
                        if (!Directory.Exists(fullPath))
                        {
                            Directory.CreateDirectory(fullPath); //如果路径不存在则创建
                        }
                        for (int i = 0; i < result.Count(); i++) // 把所有要导出的内容循环出来保存为docx
                        {
                            var formData = result[i].formData;
                            JArray tempData = (JArray)JsonConvert.DeserializeObject(formData);  //序列化(也可使用JToken代替JObject)
                            try
                            {
                                Document doc = new Document(tempFile);
                                int selectedNum = 0;// 循环的次数,第一次不要逗号
                                var dic = new Dictionary<string, string>();
                                dic = CommonFun.JsonToDir(tempData); // 将查到的json转换成dictionary
                                DocumentBuilder builder = new DocumentBuilder(doc);
                                foreach (var key in dic.Keys)//关键点 当模板里面找到和数据相同的字段,将数据写到模板对应的位置
                                {
                                    var repStr = string.Format("&{0}&", key);
                                    doc.Range.Replace(repStr, dic[key], false, false); // 循环出json 中的label 字段和模板里面进行比较 如果相等则替换成对应的value值
                                }
                                string fileName = filePathId + num++;
                                doc.Save(saveFilePath + "/" + fileName + ".docx");//也可以保存为1.doc 兼容03-07
                            }
                            catch
                            {
    
                            }
                        }
                    }
                    else
                    {
                        var response = new HttpResponseMessage();
                        response.StatusCode = HttpStatusCode.OK;
                        return response;
                    }
                    var respose = DownloadZip(filePathId); //将某个文件夹的所有内容导出成zip格式
                    return respose;
                }
              
            }
    
            #endregion

     ClearDownloadDirectory方法,当fileName为空的时候文件夹的所有内容全部删除

     #region 删除指定文件夹下的内容
            private void ClearDownloadDirectory(string directory, string fileName)
            {
                var files = Directory.GetFiles(directory);
                if (fileName == "") // 全部删除
                {
                    foreach (var file in files)
                    {
                        try
                        {
                            File.Delete(file);
                        }
                        catch
                        {
                        }
                    }
                }
                else
                {
                    foreach (var file in files)
                    {
                        if (file == fileName) // 中删除指定文件名
                        {
                            try
                            {
                                File.Delete(file);
                            }
                            catch
                            {
                            }
                        }
                    }
                }
    
            }
            #endregion

    DownZip:

    #region 将整个文件夹打包成zip并下载
            public HttpResponseMessage DownloadZip(string filePath)
            {
                var response = new HttpResponseMessage();
                try
                {
                    var zipFileName = string.Format("{0}.zip", filePath);
                    var downloadDir = HttpContext.Current.Server.MapPath("~/SaveExcel/zip/" + filePath); // 组成的zip文件夹保存路径
                    var archive = $"{downloadDir}/{zipFileName}";
                    var temp = HttpContext.Current.Server.MapPath("~/SaveExcel/" + filePath); // 要组成zip文件的文件夹路径
                    if (!Directory.Exists(downloadDir))
                    {
                        Directory.CreateDirectory(downloadDir);
                    }
                    // 清空zip文件夹中的所有临时文件
                    ClearDownloadDirectory(downloadDir, ""); // 保证每次导出时zip文件都是最新的
                    Thread.Sleep(500);
                    using (var zip = new ZipFile())
                    {
                        // Make zip file
                        zip.AddDirectory(temp); // 组成zip文件
                        zip.Save(archive); // zip 文件保存
                    }
                    response.Content = new StreamContent(new FileStream(archive, FileMode.Open, FileAccess.Read));
                    response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = zipFileName };
                    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
                }
                catch (Exception ex)
                {
                    response.StatusCode = HttpStatusCode.InternalServerError;
                    response.Content = new StringContent(ex.ToString());
                }
                return response;
            }
            #endregion

     前端代码:

     this.$axios({
                method: 'POST',
                url: url, // 你对应后台的url
                responseType: 'blob',
                data: JSON.stringify({ id: this.selectedId, selectedModel: this.ruleForm.selectedModel })
              }).then((response) => {
                console.log(response)
                if (response.data.size === 22) {
                  _this.errorTip('找不到模板文件')
                } else if (response.data.size === 0) {
                  _this.errorTip('无数据')
                } else {
                  var blob = new Blob([response.data])
                  var downloadElement = document.createElement('a')
                  var href = window.URL.createObjectURL(blob) // 创建下载的链接
                  downloadElement.href = href
                  downloadElement.download = '导出模板文件.zip' // 下载后文件名
                  document.body.appendChild(downloadElement)
                  downloadElement.click() // 点击下载
                  document.body.removeChild(downloadElement) // 下载完成移除元素
                  window.URL.revokeObjectURL(href) // 释放掉blob对象
                }
                _this.loading = false
              })

    效果图:

    展开全文
  • (1)可行性研究报告.doc (3)数据要求说明书.doc (4)需求说明书.doc (5)用户手册.doc
  • 二、按照简历模板图新建简历word文件 :${字段名},同时将图片插入到word中,并将建好的word文件另存为xml文件; 三、直接将该xml文件重命名为.ftl文件,并用编辑器(EditPlus)打开并修改 说明:字段取值用Map...

    一、设计出的简历模板图以及给的简历小图标切图

           

    二、按照简历模板图新建简历word文件 :${字段名},同时将图片插入到word中,并将建好的word文件另存为xml文件;

      

    三、直接将该xml文件重命名为.ftl文件,并用编辑器(EditPlus)打开并修改

    说明:字段取值用Map来存取;

       ${pictureAddrees!"...."}    pictureAddress中存的是图片转换后的64位码,!(感叹号)表示当字段值为空时取后面的默认图片的64位码;

          集合数据循环取值形式如图所示。

     

     

    四、项目pom文件中加入freemarker的依赖,将ftl文件放到resource目录下

    		<!--添加freeMarker-->  
                 <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
    		<dependency>
    		    <groupId>org.freemarker</groupId>
    		    <artifactId>freemarker</artifactId>
    		    <version>2.3.23</version>
    		 </dependency>
    

      

    五、工具类代码如下:

    1、createWord(Map dataMap, String templateName, String fileFullPath)   ==>  根据传入的数据、模板文件名、生成文件全路径名(带.doc)来创建word文件到磁盘;

    2、createZip(String zipfullPath,String[] fileFullPaths)    ==>  用流的方式根据生成的文件路径名(带.zip)、要打包的word文件全路径名数组(带.doc)来打包zip文件到磁盘;

    3、createZip(String zipfullPath,String fileFullPath,boolean isKeepDirStr)  ==> 用流的方式生成zip文件,调用compressZip()方法

       compressZip(InputStream inputStream,ZipOutputStream zip, File sourceFile, String fileName,boolean isKeepDirStr) ==> 递归压缩文件夹,被调用

      注意:当生成的zip文件为带文件夹目录级别时,调用3方法;

         当生成的zip文件为纯文件时,调用2方法。

    4、downLoadFile(String fullPath, HttpServletResponse response)  ==> 用流的方式下载生成的word文件、zip文件或其他文件;

    5、createFromUrl(String urlAddress,String fileFullPath) ==> 从网络地址下载文件到磁盘;

      如插入简历的图片需要从网络地址下载到磁盘,再生成base64位码,否则会失败;

      个人的一些视频信息地址、附件地址也需要从网络地址下载到磁盘,保存后再一起和简历word打包成zip文件下载。

    6、getImageBase(String urlAddress,String pathAddress) ==> 生成图片的Base64位码。

      

      1 package com.hs.zp.common.utils;
      2 
      3 import freemarker.template.Configuration;
      4 import freemarker.template.Template;
      5 import freemarker.template.TemplateExceptionHandler;
      6 
      7 import java.io.*;
      8 import java.net.URL;
      9 import java.util.Map;
     10 
     11 import javax.servlet.http.HttpServletResponse;
     12 import javax.xml.soap.Text;
     13 
     14 import org.apache.commons.codec.binary.Base64;
     15 import org.apache.log4j.Logger;
     16 import org.apache.tools.zip.ZipEntry;
     17 import org.apache.tools.zip.ZipOutputStream;
     18 
     19 import com.google.common.io.Files;
     20 
     21 /**
     22  * 
     23  * @Descript TODO (利用freemark生成word及zip)
     24  * @author yeting
     25  * @date 2019年3月19日
     26  *
     27  */
     28 public class WordUtil {
     29     public static Logger logger = Logger.getLogger(WordUtil.class);
     30      
     31     /**
     32      * 生成word文件(全局可用)
     33      * @param dataMap word中需要展示的动态数据,用map集合来保存
     34      * @param templateName word模板名称,例如:test.ftl
     35      * @param fileFullPath 要生成的文件全路径
     36      */
     37     @SuppressWarnings("unchecked")
     38     public static void createWord(Map dataMap, String templateName, String fileFullPath) {
     39         logger.info("【createWord】:==>方法进入");
     40         logger.info("【fileFullPath】:==>" + fileFullPath);
     41         logger.info("【templateName】:==>" + templateName);
     42         
     43         try {
     44             // 创建配置实例
     45             Configuration configuration = new Configuration();
     46             logger.info("【创建配置实例】:==>");
     47             
     48             // 设置编码
     49             configuration.setDefaultEncoding("UTF-8");
     50             logger.info("【设置编码】:==>");
     51             
     52             // 设置处理空值
     53             configuration.setClassicCompatible(true);
     54             
     55             // 设置错误控制器
     56 //            configuration.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
     57             
     58 //            String pathName = Text.class.getResource("/template").getFile();
     59 //            File templateFile = new File(pathName);
     60 //            logger.info("【pathName】:==>" + pathName);
     61 //            logger.info("【templateFile】:==>" + templateFile.getName());
     62 //            configuration.setDirectoryForTemplateLoading(templateFile);
     63             
     64             // 设置ftl模板文件加载方式
     65             configuration.setClassForTemplateLoading(WordUtil.class,"/template");
     66             
     67             //创建文件
     68             File file = new File(fileFullPath);
     69             // 如果输出目标文件夹不存在,则创建
     70             if (!file.getParentFile().exists()) {
     71                 file.getParentFile().mkdirs();
     72             }
     73 
     74             // 将模板和数据模型合并生成文件
     75             Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
     76             // 获取模板
     77             Template template = configuration.getTemplate(templateName);
     78             // 生成文件
     79             template.process(dataMap, out);
     80 
     81             // 清空缓存
     82             out.flush();
     83             // 关闭流
     84             out.close();
     85 
     86         } catch (Exception e) {
     87             logger.info("【生成word文件出错】:==>" + e.getMessage());
     88             e.printStackTrace();
     89         }
     90     }
     91     
     92     /**
     93      * 生成zip文件,根据文件路径不带子文件夹(全局可用)
     94      * @param zipfullPath 压缩后的zip文件全路径
     95      * @param fileFullPaths 压缩前的文件全路径数组
     96      */
     97     public static void createZip(String zipfullPath,String[] fileFullPaths) {
     98         InputStream inputStream = null;
     99         ZipOutputStream zip = null;
    100 
    101         try {
    102             zip = new ZipOutputStream(new FileOutputStream(zipfullPath));
    103             zip.setEncoding("gbk");
    104             
    105             for(String fullPath:fileFullPaths) {
    106                 logger.info("【createZip:fullPath】:==>" + fullPath);
    107                 
    108                 if(StringUtil.isNullOrEmpty(fullPath)) {
    109                     continue;
    110                 }
    111                 
    112                 //创建文件
    113                 File file = new File(fullPath);
    114                 String fileName = file.getName();
    115                 
    116                 //读文件流
    117                 inputStream = new BufferedInputStream(new FileInputStream(file));
    118                 byte[] buffer = new byte[inputStream.available()];
    119                 inputStream.read(buffer);
    120                 inputStream.close();
    121                 
    122                 //将读取的文件输出到zip中
    123                 zip.putNextEntry(new ZipEntry(fileName)); 
    124                 zip.write(buffer);
    125                 zip.closeEntry(); 
    126             }
    127             
    128         } catch (Exception e) {
    129             e.printStackTrace();
    130         } finally {
    131             try {
    132                 if (inputStream != null) {
    133                     inputStream.close();
    134                 }
    135             } catch (Exception e) {
    136                 e.printStackTrace();
    137             }
    138             
    139             try {
    140                 if (zip != null) {
    141                     zip.close();
    142                 }
    143             } catch (Exception e) {
    144                 e.printStackTrace();
    145             }
    146 
    147         }
    148     }
    149     
    150     /**
    151      * 生成的zip文件带子文件夹(全局可用)
    152      * @param zipfullPath 压缩后的zip文件全路径
    153      * @param fileFullPath 压缩前的文件全路径
    154      * @param isKeepDirStr 是否保留原来的目录结构,true:保留目录结构; false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
    155      */
    156     public static void createZip(String zipfullPath,String fileFullPath,boolean isKeepDirStr) {
    157         InputStream inputStream = null;
    158         ZipOutputStream zip = null;
    159 
    160         try {
    161             zip = new ZipOutputStream(new FileOutputStream(zipfullPath));
    162             zip.setEncoding("gbk");
    163             
    164             File file = new File(fileFullPath);
    165             
    166             compressZip(inputStream,zip,file, file.getName(), isKeepDirStr);//递归压缩
    167             
    168         } catch (Exception e) {
    169             e.printStackTrace();
    170         } finally {
    171             try {
    172                 if (inputStream != null) {
    173                     inputStream.close();
    174                 }
    175             } catch (Exception e) {
    176                 e.printStackTrace();
    177             }
    178             
    179             try {
    180                 if (zip != null) {
    181                     zip.close();
    182                 }
    183             } catch (Exception e) {
    184                 e.printStackTrace();
    185             }
    186 
    187         }
    188     }
    189     
    190     /**
    191      * 递归压缩方法(仅限于此类中用于压缩zip文件)
    192      * @param inputStream 输入流
    193      * @param zip zip输出流
    194      * @param sourceFile 源文件
    195      * @param fileName 文件夹名或文件名
    196      * @param isKeepDirStr 是否保留原来的目录结构,true:保留目录结构; false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
    197      * @throws Exception
    198      */
    199     private static void compressZip(InputStream inputStream,ZipOutputStream zip, File sourceFile, String fileName,boolean isKeepDirStr) throws Exception{
    200         logger.info("【compressZip:sourceFile】:==>" + sourceFile.getPath());
    201         logger.info("【compressZip:fileName】:==>" + fileName);
    202         
    203         if(sourceFile.isFile()){
    204             //读文件流
    205             inputStream = new BufferedInputStream(new FileInputStream(sourceFile));
    206             byte[] buffer = new byte[inputStream.available()];
    207             inputStream.read(buffer);
    208             inputStream.close();
    209             
    210             //将读取的文件输出到zip中
    211             zip.putNextEntry(new ZipEntry(fileName));
    212             zip.write(buffer);
    213             zip.closeEntry(); 
    214         } else {
    215             File[] listFiles = sourceFile.listFiles();
    216             if(listFiles == null || listFiles.length == 0){
    217                 // 需要保留原来的文件结构时,需要对空文件夹进行处理
    218                 if(isKeepDirStr){
    219                     zip.putNextEntry(new ZipEntry(fileName + "/"));//空文件夹的处理
    220                     zip.closeEntry();// 没有文件,不需要文件的copy
    221                 }
    222             }else {
    223                 for (File file : listFiles) {
    224                     // 判断是否需要保留原来的文件结构,注意:file.getName()前面需要带上父文件夹的名字加一斜杠,不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了
    225                     if (isKeepDirStr) { 
    226                         compressZip(inputStream,zip,file,  fileName + "/" + file.getName(),isKeepDirStr);
    227                     } else {
    228                         compressZip(inputStream,zip, file, file.getName(),isKeepDirStr);
    229                     }
    230                 }
    231             }
    232         }
    233     }
    234     
    235     /**
    236      * 下载生成的文件(全局可用)
    237      * @param fullPath 全路径
    238      * @param response
    239      */
    240     public static void downLoadFile(String fullPath, HttpServletResponse response) {
    241         logger.info("【downLoadFile:fullPath】:==>" + fullPath);
    242         
    243         InputStream inputStream = null;
    244         OutputStream outputStream = null;
    245 
    246         try {
    247             //创建文件
    248             File file = new File(fullPath);
    249             String fileName = file.getName();
    250             
    251             //读文件流
    252             inputStream = new BufferedInputStream(new FileInputStream(file));
    253             byte[] buffer = new byte[inputStream.available()];
    254             inputStream.read(buffer);
    255             
    256             //清空响应
    257             response.reset();
    258             response.setCharacterEncoding("UTF-8");
    259             response.setContentType("application/octet-stream; charset=utf-8");
    260             // response.setContentType("application/msword");
    261             response.setHeader("Content-Disposition","attachment; filename=" + new String(fileName.getBytes(), "ISO8859-1"));
    262             response.setHeader("Content-Length", "" + file.length());
    263             
    264             //写文件流
    265             outputStream = new BufferedOutputStream(response.getOutputStream());
    266             outputStream.write(buffer);
    267             outputStream.flush();
    268         } catch (Exception e) {
    269             e.printStackTrace();
    270         } finally {
    271             try {
    272                 if (outputStream != null) {
    273                     outputStream.close();
    274                 }
    275             } catch (Exception e) {
    276                 e.printStackTrace();
    277             }
    278             try {
    279                 if (inputStream != null) {
    280                     inputStream.close();
    281                 }
    282             } catch (Exception e) {
    283                 e.printStackTrace();
    284             }
    285 
    286         }
    287     }
    288     
    289     /**
    290      * 下载网络文件到本地(主要用于下载简历附件)
    291      * @param urlAddress 网络url地址,为空时直接返回
    292      * @param fileFullPath 文件全路径
    293      */
    294     public static void createFromUrl(String urlAddress,String fileFullPath) {
    295         logger.info("【service:开始下载网络文件】:==> 网上文件地址:" + urlAddress + "文件保存路径:" + fileFullPath);
    296         
    297         if(StringUtil.isNullOrEmpty(urlAddress)) {
    298             return ;
    299         }
    300         
    301         DataInputStream dataInputStream = null;
    302         FileOutputStream fileOutputStream =null;
    303         try {
    304             
    305             URL url = new URL(urlAddress);
    306             
    307             dataInputStream = new DataInputStream(url.openStream());//打开网络输入流
    308 
    309             //创建文件
    310             File file = new File(fileFullPath);
    311             // 如果输出目标文件夹不存在,则创建
    312             if (!file.getParentFile().exists()) {
    313                 file.getParentFile().mkdirs();
    314             }
    315             
    316             fileOutputStream = new FileOutputStream(file);//建立一个新的文件
    317             
    318             byte[] buffer = new byte[1024];
    319             int length;
    320             
    321             while((length = dataInputStream.read(buffer))>0){//开始填充数据
    322                 fileOutputStream.write(buffer,0,length);
    323             }
    324             
    325             fileOutputStream.flush();        
    326         } catch (Exception e) {
    327             e.printStackTrace();
    328         } finally {
    329             try {
    330                 if(dataInputStream!=null) {
    331                     dataInputStream.close();
    332                 }
    333             } catch (IOException e) {
    334                 e.printStackTrace();
    335             }
    336             
    337             try {
    338                 if(fileOutputStream!=null) {
    339                     fileOutputStream.close();
    340                 }
    341             } catch (IOException e) {
    342                 e.printStackTrace();
    343             }
    344         }
    345     }
    346 
    347     /**
    348      * 从网上或本地获得图片的base64码(主要用于插入生成word中的图片)
    349      * @param urlAddress 网络路径,二选一,目前有问题
    350      * @param pathAddress 本地路径,二选一
    351      * @return 返回base64码或null
    352      */
    353     public static String getImageBase(String urlAddress,String pathAddress) {        
    354         byte[] buffer = null;
    355         InputStream inputStream = null;
    356         String imageCodeBase64 = null;
    357         
    358         try {
    359             if(!StringUtil.isNullOrEmpty(urlAddress)){
    360                 URL url = new URL(urlAddress);
    361                 inputStream = new DataInputStream(url.openStream());//打开网络输入流
    362                 buffer = new byte[inputStream.available()];
    363                 inputStream.read(buffer);
    364             }else if(!StringUtil.isNullOrEmpty(pathAddress)){
    365                 inputStream = new BufferedInputStream(new FileInputStream(new File(pathAddress)));//读文件流
    366                 buffer = new byte[inputStream.available()];
    367                 inputStream.read(buffer);
    368             }else {
    369                 return null;
    370             }
    371             
    372             imageCodeBase64 = Base64.encodeBase64String(buffer);
    373 //            System.out.println(imageCodeBase64);
    374         }catch (Exception e) {
    375             e.printStackTrace();
    376         }finally {
    377             try {
    378                 if(inputStream!=null) {
    379                     inputStream.close();
    380                 }
    381             } catch (IOException e) {
    382                 e.printStackTrace();
    383             }
    384         }
    385         return imageCodeBase64;
    386     }
    387     
    388     
    389 
    390 
    391 }

    六、调用处代码如下

     逻辑:循环开始 ==>  

          取出简历数据封装到Map中  ==>  生成word文件到磁盘 ==>  下载附件等到磁盘 ==> 将word文件、下载好的文件 的全路径名放入到路径数组中

          ==>  循环中....

        循环结束 ==>

        根据路径数组打包生成zip到磁盘 ==>

        下载zip文件 ==>

        删除原文件和zip文件,下载完毕 ==>

     

     

     

      

      
    1
    @Transactional(rollbackFor=Exception.class) 2 @Override 3 public void exportWordResume(List<ResumeDelivery> resumeDeliveryList,int userId, HttpServletResponse response) throws Exception { 4 logger.info("【service:exportWordResume】:==> 服务层请求开始"); 5 6 String[] fileFullPaths = new String[resumeDeliveryList.size()];//文件全路径数组 7 String[] folderFullPaths = new String[resumeDeliveryList.size()];//文件夹全路径数组 8 String[] addUrls = new String[resumeDeliveryList.size()];//附件全路径数组 9 String[] videoFullPaths = new String[resumeDeliveryList.size()];//视频全路径数组 10 11 boolean flag = false;//该批文件是否存在附件 12 String templateName = "jlmb.ftl";//模板名称 13 Resume resume = null;//简历 14 Map<String, Object> map = null;//获取数据信息 15 String fileName = null;//文件名称:应聘者姓名+应聘职位名称+简历唯一标识号+下载人ID 16 String zipFullPath = filePath + File.separator + "小马HR_求职者简历下载_" +userId;要压缩的文件夹路径 17 String folderFullPath = null;//子文件夹全路径 18 String fileFullPath = null;//文件全路径 19 String addFullPath = null;//附件全路径 20 String addSuffix = null;//附件后缀 21 String videoFullPath = null;//视频全路径 22 String videoSuffix = null;//视频后缀 23 String headImagePath = null;//头像全路径 24 25 String validString = null; 26 Map<Integer,String> validMap = new HashMap<>();//简历字串 key:resumeId,value:resumeId+positionName 27 28 int index = 1;//简历下载数 29 int count = 0;//循环次数 30 for(ResumeDelivery resumeDeliveryBean:resumeDeliveryList) { 31 count++; 32 33 logger.info("【service:循环投递记录】:==> " + count); 34 35 //判断是否重复的简历不予下载 36 validString = resumeDeliveryBean.getResumeId() + resumeDeliveryBean.getPositionName(); 37 if(validString.equals(validMap.get(resumeDeliveryBean.getResumeId()))){ 38 logger.info("【重复简历】:==> " + validString); 39 continue; 40 }else { 41 validMap.put(resumeDeliveryBean.getResumeId(), validString); 42 } 43 44 Assert.notNull(resumeDeliveryBean.getResumeId(), "第" + count +"份简历投递记录不存在!投递ID:" + resumeDeliveryBean.getId()); 45 resume = resumeMapper.selectByPrimaryKey(resumeDeliveryBean.getResumeId()); 46 Assert.notNull(resume, "第" + count +"份简历不存在!投递ID:" + resumeDeliveryBean.getId()); 47 48 //隐藏手机号 49 if(resumeDeliveryBean.getStatus() != null 50 && (resumeDeliveryBean.getStatus() == 0 51 || resumeDeliveryBean.getStatus() == 2 52 || resumeDeliveryBean.getStatus() == 3)) { // 已投递、已过期、已淘汰 ==>隐藏手机号 53 if(!StringUtil.isNullOrEmpty(resumeDeliveryBean.getMobile())) { 54 resume.setMobile(resume.getMobile().substring(0, 3) + "****" + resume.getMobile().substring(resume.getMobile().length() - 4)); 55 } 56 }else if(resumeDeliveryBean.getEmployStatus() != null 57 && (resumeDeliveryBean.getEmployStatus() == 2 58 || resumeDeliveryBean.getEmployStatus() == 4 59 || resumeDeliveryBean.getEmployStatus() == 10)) { // 不合适、申诉中、已终止 60 if(!StringUtil.isNullOrEmpty(resumeDeliveryBean.getMobile())) { 61 resume.setMobile(resume.getMobile().substring(0, 3) + "****" + resume.getMobile().substring(resume.getMobile().length() - 4)); 62 } 63 } 64 65 fileName = resume.getHunterName() + "_" + resumeDeliveryBean.getPositionName() + "_" + resume.getId()+"_" + userId; 66 folderFullPath = zipFullPath + File.separator + fileName; 67 fileFullPath = folderFullPath + File.separator + fileName + ".doc"; 68 addSuffix = StringUtil.isNullOrEmpty(resume.getEnclosureAddress()) ? "" : resume.getEnclosureAddress().substring(resume.getEnclosureAddress().lastIndexOf(".")); 69 addFullPath = folderFullPath + File.separator + fileName + "_附件"+ addSuffix; 70 videoSuffix = StringUtil.isNullOrEmpty(resume.getVideoAddress()) ? "" : resume.getVideoAddress().substring(resume.getVideoAddress().lastIndexOf(".")); 71 videoFullPath = folderFullPath + File.separator + fileName + "_个人视频"+ videoSuffix; 72 headImagePath = folderFullPath + File.separator + fileName + "_头像.jpg"; 73 74 WordUtil.createFromUrl(resume.getPictureAddress(), headImagePath);//先下载头像到本地,再插入到word中 75 map = this.getResumeData(resume,headImagePath); 76 77 logger.info("【service:开始生成word文件】:==> 文件名:" + fileFullPath); 78 WordUtil.createWord(map, templateName, fileFullPath);//生成word文件 79 logger.info("【service:生成word文件 完毕】:==>"); 80 81 FileUtil.deleteFile(headImagePath);//删除头像图片 82 83 WordUtil.createFromUrl(resume.getEnclosureAddress(), addFullPath);//下载附件 84 WordUtil.createFromUrl(resume.getVideoAddress(), videoFullPath);//下载视频 85 86 87 //赋值 88 fileFullPaths[index - 1] = fileFullPath; 89 folderFullPaths[index - 1] = folderFullPath; 90 if(!StringUtil.isNullOrEmpty(addSuffix)) { 91 addUrls[index - 1] = addFullPath; 92 flag = true; 93 } 94 if(!StringUtil.isNullOrEmpty(videoSuffix)) { 95 videoFullPaths[index - 1] = videoFullPath; 96 flag = true; 97 } 98 99 index++; 100 if(index == 20) {//设置最多一次下载10份简历 101 break; 102 } 103 } 104 105 if(!flag) { 106 if(resumeDeliveryList.size()==1) { 107 logger.info("【打包下载一】:==>"); 108 109 WordUtil.downLoadFile(fileFullPaths[0], response);//下载单个word文件 110 FileUtil.deleteFile(fileFullPaths[0]); 111 }else { 112 logger.info("【打包下载二】:==>"); 113 114 String zipFileFullPath = zipFullPath + ".zip";//压缩后的文件名 115 116 WordUtil.createZip(zipFileFullPath, fileFullPaths);//生成zip不带附件不带子文件夹 117 WordUtil.downLoadFile(zipFileFullPath, response);//下载zip文件 118 119 FileUtil.deleteFile(zipFileFullPath); 120 } 121 }else { 122 if(resumeDeliveryList.size()==1) { 123 logger.info("【打包下载三】:==>"); 124 125 String zipFileFullPath = folderFullPaths[0] + ".zip";//压缩后的文件名 126 String[] newfileFullPaths = new String[]{fileFullPaths[0],addUrls[0],videoFullPaths[0]};//需要下载的文件 127 128 WordUtil.createZip(zipFileFullPath, newfileFullPaths);//生成zip带附件不带子文件夹 129 WordUtil.downLoadFile(zipFileFullPath, response);//下载zip文件 130 }else { 131 logger.info("【打包下载四】:==>"); 132 133 String zipFileFullPath = zipFullPath + ".zip";;//压缩后的文件名 134 135 WordUtil.createZip(zipFileFullPath, zipFullPath , true);//生成zip带附件 136 WordUtil.downLoadFile(zipFileFullPath, response);//下载zip文件 137 138 FileUtil.deleteFile(zipFileFullPath); 139 } 140 } 141 142 FileUtil.deleteFileDir(zipFullPath); 143 } 144 145 /** 146 * 简历信息转Map 147 * @param resume 简历对象 148 * @param headImagePath 头像全路径 149 * @return 返回map集合 150 * @throws Exception 出生日期转年龄可能会抛出异常 151 */ 152 public Map<String, Object> getResumeData(Resume resume,String headImagePath) throws Exception{ 153 Map<String, Object> map = new HashMap<>(); 154 map.put(Resume.EXPORT_HUNTER_NAME, resume.getHunterName()); 155 map.put(Resume.EXPORT_SEX_STR, resume.getSexStr()); 156 map.put(Resume.EXPORT_AGE, AgeUtil.getAgeByBirth(resume.getDateOfBirth()) + "岁"); 157 map.put(Resume.EXPORT_WORHING_LENGTH_STR, resume.getWorkingLengthStr()==null ? "" : resume.getWorkingLengthStr()); 158 map.put(Resume.EXPORT_MOBILE, resume.getMobile()); 159 map.put(Resume.EXPORT_CREDENTIALS, resume.getCredentials()); 160 map.put(Resume.EXPORT_INTRODUCE, resume.getIntroduce()); 161 map.put(Resume.EXPORT_PICTURE_ADDRESS, StringUtil.isNullOrEmpty(resume.getPictureAddress()) ? null : WordUtil.getImageBase(null, headImagePath));//头像 162 163 map.put(Resume.EXPORT_INTENTION_POSITION, resume.getIntentionPosition()); 164 map.put(Resume.EXPORT_INTENTION_LOCALE_STR, resume.getIntentionLocaleStr()); 165 map.put(Resume.EXPORT_SALARY_UNIT_STR, resume.getSalaryExpectation()); 166 map.put(Resume.EXPORT_RESUME_STATUS_STR, resume.getResumeStatusStr()); 167 168 map.put(Resume.EXPORT_STUDY_BEGIN_END_DATE, null); 169 map.put(Resume.EXPORT_GRADUATE_SCHOOL, resume.getGraduateSchool()); 170 map.put(Resume.EXPORT_PROFESSION, resume.getProfession()); 171 map.put(Resume.EXPORT_EDUCATIONAL_BACKGROUND_STR, resume.getEducationalBackgroundStr()); 172 173 map.put(Resume.EXPORT_HONORS, resume.getHonors()); 174 175 if(resume.getResumeExperience()!=null && resume.getResumeExperience().size()>0) { 176 List<Map<String,Object>> list = new ArrayList<>(); 177 Map<String, Object> exprMap = null; 178 for(ResumeExperience re:resume.getResumeExperience()) { 179 exprMap = new HashMap<>(); 180 exprMap.put(ResumeExperience.EXPORT_COMPANY_NAME, re.getCompanyName()); 181 exprMap.put(ResumeExperience.EXPORT_POSITION, re.getPosition()); 182 exprMap.put(ResumeExperience.EXPORT_WORD_DESC, re.getWorkDesc()); 183 exprMap.put(ResumeExperience.EXPORT_WORK_BEGIN_END_DATE, (re.getStartDate().replace("-", "/") + "-" + re.getEndDate().replace("-", "/"))); 184 list.add(exprMap); 185 } 186 187 map.put(Resume.EXPORT_EXPERIENCE, list); 188 } 189 190 return map; 191 }

     

     

     

     

    七、从测试环境下载后的简历如下

     

    八、过程中出现的问题:

    1、模板文件路径找不到  ==> 相对路径问题,检查后解决;

    2、空值字段报错或显示错误 ==> 工具类代码中已解决;或修改.ftl文件中,字段接受时设置默认值;

    3、多个工作经历只显示一个 ==> 数据传值有误,检查后解决;

    4、头像不显示 ==> 生成的图片的base64位码有误,工具类代码中已解决;

    5、doc文件不生成 ==> 模板文件字段值有问题,检查后解决;

    6、下载速度问题 ==> 目前限制只能一次下载20个。

    转载于:https://www.cnblogs.com/wlxslsb/p/10622745.html

    展开全文
  • 接下来是批量导出word文档和批量打印word文件,批量导出word文档和批量打印word文件的思路差不多,只是批量打印不用打包压缩文件,而是把所有文件合成一个word,然后通过js来调用word,提交打印机,把word文档的内容...
          接下来是批量导出word文档和批量打印word文件,批量导出word文档和批量打印word文件的思路差不多,只是批量打印不用打包压缩文件,而是把所有文件合成一个word,然后通过js来调用word,提交打印机,把word文档的内容都打印出来。
         批量导出word文档需要用到ICSharpCode.SharpZipLib.dll 插件,思路是,先单独导出所勾选的数据的单个文档,保存到生成的临时目录下,再把同一个的人相关文档合并一个word文档,并删除已经合并的那个文档(不是合并后生成的文档),以姓名和编号命名生成后的文档,最后将临时目录下的所有文件打包压缩下载,并删除临时目录和临时目录下的所有文件(都是生成在服务器上,所以若文件太大,可能会慢)。批量导出是用form来提交所传的参数,并下载。(因为懒,不解释代码了)
          首先新建一个空文档,插入书签,书签名为“p”(随便定义的),命名文件名为“test.doc”,保存在项目目录下。       
          相关js代码为:     
      1  /***************************************
      2  * @methodname→批量导出word文档
      3  * @createtime 2015-05-11
      4  ***************************************/
      5 function AllExportWord(objid, tfile) {
      6     var ckvalue = "", ntid = "", code = "", name = "";
      7     var chkbox = $("input[type=checkbox][name=chk]:checked");
      8     for (var i = 0; i < chkbox.length; i++) {
      9         ckvalue = ckvalue + chkbox[i].value + ",";  //主键值
     10         ntid = ntid + $(chkbox[i]).attr("data-ntid") + ","; //学生主键
     11         code = code + $(chkbox[i]).attr("data-code") + ","; //胸卡号
     12         name = name + $(chkbox[i]).attr("data-name") + ","; //姓名
     13     }
     14     if (ckvalue != "") {
     15         ntid = ntid.substring(0, ntid.length - 1);
     16         code = code.substring(0, code.length - 1);
     17         name = name.substring(0, name.length - 1);
     18         $.ajax({
     19             type: "POST",
     20             url: "/NewStudent/BatchExportWord",
     21             dataType: "json",
     22             data: { tempFile: tfile, ntid: ntid },
     23             async: false,
     24             success: function (data) {
     25                 if (data.isOK) {
     26                     var count = ntid.split(',').length;
     27                     if (count == data.ls.length && count > 0) {
     28                         DownLoadWord(objid, tfile, ntid, code, name, true);
     29                     }
     30                     else {
     31                         if (confirm("选择导出的数据中包含没有学习记录的数据,是否确认导出或打印?")) {
     32                             DownLoadWord(objid, tfile, ntid, code, name, true);
     33                         }
     34                     }
     35                 }
     36                 else {
     37                     alert(data.msg);
     38                 }
     39             }
     40         });
     41     }
     42     else {
     43         alert("请选择数据!");
     44     }
     45 }
     46 /***************************************
     47  * @methodname→批量导出word文档
     48  * @createtime 2015-05-11
     49  ***************************************/
     50 function BatchExportWord(objid, tfile) {   
     51     var ckvalue = "", ntid = "", code = "", name = "";
     52     var chkbox = $("input[type=checkbox][name=chk]:checked");
     53     for (var i = 0; i < chkbox.length; i++) {
     54         ckvalue = ckvalue + chkbox[i].value + ",";  //主键值
     55         ntid = $(chkbox[i]).attr("data-ntid"); //学生主键
     56         code = $(chkbox[i]).attr("data-code"); //胸卡号
     57         name = $(chkbox[i]).attr("data-name"); //姓名
     58     }
     59     if (ckvalue != "") {
     60         ckvalue = ckvalue.substring(0, ckvalue.length - 1); //去掉最后一个逗号
     61         $.ajax({
     62             type: "POST",
     63             url: "/NewStudent/BatchExportWord",
     64             dataType: "json",
     65             data: { tempFile: tfile },
     66             async: false,
     67             success: function (data) {
     68                 if (data.isOK) {
     69                     DownLoadWord(objid, tfile, ntid, code, name, false)
     70                 }
     71                 else {
     72                     alert(data.msg);
     73                 }
     74 
     75             }
     76         });
     77     }
     78     else {
     79         alert("请选择数据!");
     80     }
     81 }
     82 /*************************************************
     83  * @methodname→只能通过流的方式批量导出word文档
     84    在页尾添加form,通过提交form表单才能下载
     85  * @createtime 2015-05-12
     86  *************************************************/
     87 function DownLoadWord(idName, tfile, ntid, code, name, isAll) {   
     88     $("body").find("form.#form1").remove();
     89     var form = "<form id='form1'></form>";
     90     var input = "<input />";
     91     var input1 = "", input2 = "", input3 = "", input4 = "", input5 = "", input6 = "";
     92     input1 = $(input); input1.attr("type", "hidden"); input1.attr("name", "tempFile"); input1.attr("value", tfile);
     93     input2 = $(input); input2.attr("type", "hidden"); input2.attr("name", "ntid"); input2.attr("value", ntid);
     94     input3 = $(input); input3.attr("type", "hidden"); input3.attr("name", "code"); input3.attr("value", code);
     95     input4 = $(input); input4.attr("type", "hidden"); input4.attr("name", "name"); input4.attr("value", name);
     96     input5 = $(input); input5.attr("type", "hidden"); input5.attr("name", "isAll"); input5.attr("value", isAll);
     97     input6 = $(input); input6.attr("type", "hidden"); input6.attr("name", "idName"); input6.attr("value", idName);
     98     $("body").append(form); //将表单放置在web中
     99     //添加表单属性
    100     $("#form1").attr("style", "display:none");
    101     $("#form1").attr("target", "");
    102     $("#form1").attr("method", "post");   
    103     $("#form1").attr("action", "/NewStudent/DownLoadWord");  
    104   
    105     //添加input到表单里
    106     $("#form1").append(input1)
    107     $("#form1").append(input1);
    108     $("#form1").append(input2);
    109     $("#form1").append(input3);
    110     $("#form1").append(input4);
    111     $("#form1").append(input5);
    112     $("#form1").append(input6);
    113     $("#form1").submit();
    114 }
    js

         相关后台代码如下: 

      1 #region 压缩文件及文件夹
      2     /// <summary>
      3     /// 压缩文件及文件夹
      4     /// </summary>
      5     public class CompressFileZip
      6     {
      7         private ZipOutputStream zos = null;
      8         private string strBaseDir = "";
      9 
     10         #region 临时文件夹名称
     11         /// <summary>
     12         /// 临时文件夹名称
     13         /// </summary>
     14         /// <param name="name">学生名称</param>
     15         /// <param name="value">学生卡号</param>
     16         /// <returns></returns>
     17         public string FolderName(string name, string value)
     18         {
     19             string tempName = "";
     20             if (!string.IsNullOrEmpty(name))
     21             {
     22                 tempName = name;
     23                 if (!string.IsNullOrEmpty(value))
     24                     tempName += "_" + value;
     25                 tempName += "_" + DateTime.Now.ToString("yyyyMMddHHmm");
     26             }
     27             else
     28             {
     29                 tempName = DateTime.Now.ToString("yyyyMMddHHmmss"); //临时文件夹名称
     30             }
     31             return tempName;
     32         }
     33         #endregion
     34 
     35         #region 创建临时文件夹
     36         /// <summary>
     37         /// 创建临时文件夹
     38         /// </summary>
     39         /// <param name="name">学生名称</param>
     40         /// <param name="value">学生卡号</param>
     41         /// <returns></returns>
     42         public string CreateTempFolder(string name, string value = null)
     43         {
     44             //遍历服务器指定文件夹下的所有文件
     45             string path = "UploadFile";
     46             string serverPath = WordFilePath.GetFilePath(path);
     47             string tempName = "";
     48             if (!string.IsNullOrEmpty(value))
     49                 tempName = FolderName(name, value);
     50             else
     51                 tempName = name;
     52             string tempFolder = Path.Combine(serverPath, tempName);
     53             Directory.CreateDirectory(tempFolder); //创建临时文件夹
     54             //DirectoryInfo folder = new DirectoryInfo(serverPath);
     55             return tempFolder + "\\";
     56         }
     57         #endregion
     58 
     59         #region 添加文件到压缩文件中
     60         /// <summary>
     61         /// 添加文件到压缩文件中
     62         /// </summary>
     63         /// <param name="PathStr">路径</param>
     64         public void addZipEntry(string PathStr)
     65         {
     66             DirectoryInfo di = new DirectoryInfo(PathStr);
     67             foreach (DirectoryInfo item in di.GetDirectories())
     68             {
     69                 addZipEntry(item.FullName);
     70             }
     71             foreach (FileInfo item in di.GetFiles())
     72             {
     73                 FileStream fs = System.IO.File.OpenRead(item.FullName);
     74                 byte[] buffer = new byte[fs.Length];
     75                 fs.Read(buffer, 0, buffer.Length);
     76                 string strEntryName = item.FullName.Replace(strBaseDir, "");
     77                 ZipEntry entry = new ZipEntry(strEntryName);
     78                 zos.PutNextEntry(entry);
     79                 zos.Write(buffer, 0, buffer.Length);
     80                 fs.Close();
     81             }
     82         }
     83         #endregion
     84 
     85         #region 输出下载压缩包
     86         /// <summary>
     87         /// 输出下载压缩包
     88         /// </summary>
     89         /// <param name="response">页面响应</param>
     90         /// <param name="strPath">文件所在的路径</param>
     91         /// <param name="strFileName">压缩文件名</param>
     92         /// <param name="strExt">压缩文件的扩展名</param>
     93         public void dlZipDir(HttpResponseBase response, string strPath, string strFileName, string strExt = null)
     94         {
     95             if (string.IsNullOrEmpty(strExt))
     96                 strExt = ".zip"; //默认压缩文件扩展名
     97             MemoryStream ms = null;
     98             response.ContentType = "application/octet-stream";
     99             strFileName = HttpUtility.UrlEncode(strFileName).Replace('+', ' ');
    100             response.AddHeader("Content-Disposition", "attachment; filename=" + strFileName + strExt);
    101             ms = new MemoryStream();
    102             zos = new ZipOutputStream(ms);
    103             strBaseDir = strPath + "\\";
    104             addZipEntry(strBaseDir);
    105             zos.Finish();
    106             zos.Close();
    107             response.Clear();
    108             response.BinaryWrite(ms.ToArray());
    109             //删除临时目录下的所有文件
    110             DeleteTempFiles(strPath);
    111             //删除空目录
    112             Directory.Delete(strPath);
    113             response.End();
    114         }
    115         #endregion
    116 
    117         #region 保存文件到临时文件夹中
    118         /// <summary>
    119         /// 保存文件到临时文件夹中
    120         /// </summary>
    121         /// <param name="content">将流内容写入字节组</param>
    122         /// <param name="SaveName">保存的文件名</param>
    123         /// /// <param name="dirPath">保存路径</param>
    124         /// <param name="fileExtend">保存的文件扩展名</param>
    125         /// <returns></returns>
    126         public void SaveFile(byte[] content, string SaveName, string dirPath, string fileExtend = null)
    127         {
    128 
    129             if (string.IsNullOrEmpty(fileExtend))
    130                 fileExtend = ".doc"; //文件扩展名默认是word文档
    131             try
    132             {
    133                 DateTime dt = DateTime.Now;
    134                 //设置文件夹路径
    135                 //directory = CreateTempFolder(strName, strCode);
    136                 //文件保存完整路径
    137                 string path = dirPath + SaveName + fileExtend;
    138                 //验证文件夹是否存在   不存在则创建
    139                 if (!Directory.Exists(dirPath))
    140                 {
    141                     Directory.CreateDirectory(dirPath);
    142                 }
    143                 //以创建文件的方式写入内容
    144                 FileStream fs = new FileStream(path, FileMode.CreateNew, FileAccess.Write);
    145                 BinaryWriter w = new BinaryWriter(fs);
    146                 w.Write(content);
    147                 w.Close();
    148                 fs.Close();
    149             }
    150             catch (Exception ex)
    151             {
    152                 throw new System.IO.FileNotFoundException("目录:" + dirPath + "没有找到!");
    153             }
    154         }
    155         #endregion
    156 
    157         #region 删除临时目录下的所有文件
    158         /// <summary>
    159         /// 删除临时目录下的所有文件
    160         /// </summary>
    161         /// <param name="tempPath">临时目录路径</param>
    162         private void DeleteTempFiles(string tempPath)
    163         {
    164             DirectoryInfo directory = new DirectoryInfo(tempPath);
    165             try
    166             {
    167                 foreach (FileInfo file in directory.GetFiles())
    168                 {
    169                     if (file.Attributes.ToString().IndexOf("ReadOnly") != -1)
    170                     {
    171                         file.Attributes = FileAttributes.Normal;
    172                     }
    173                     System.IO.File.Delete(file.FullName);
    174                 }
    175             }
    176             catch (Exception)
    177             {
    178                 throw;
    179             }
    180         }
    181         #endregion
    182 
    183         #region 获取指定文件夹下的所有文件
    184         /// <summary>
    185         /// 获取指定文件夹下的所有文件
    186         /// </summary>
    187         /// <param name="Folder">文件夹名称</param>
    188         /// <param name="strName">文件夹下所包含指定文件名的文件</param>
    189         /// <returns></returns>
    190         public List<string> GetFileList(string Folder, string strName = null)
    191         {
    192             List<string> lsFile = new List<string>();
    193             if (!string.IsNullOrEmpty(Folder))
    194             {
    195                 Folder = WordFilePath.GetFilePath("UploadFile", Folder + "\\");
    196                 DirectoryInfo di = new DirectoryInfo(Folder);
    197                 foreach (FileInfo item in di.GetFiles())
    198                 {
    199                     if (!string.IsNullOrEmpty(strName))
    200                     {
    201                         if (item.FullName.Contains(strName))
    202                             lsFile.Add(item.FullName);
    203                     }
    204                     else
    205                         lsFile.Add(item.FullName);
    206                 }
    207             }
    208             return lsFile;
    209         } 
    210         #endregion
    211 
    212     }
    213     #endregion 
    214 
    215     #region 插入文档
    216     public class InsertFile
    217     {
    218         #region 在书签位置插入另一个文档的内容
    219         /// <summary>
    220         /// 使用DocumentBuilder对象插入一些文档对象,如插入书签,插入文本框,插入复选框
    221         /// 插入一个段落,插入空白页,追加或另一个word文件的内容等。
    222         /// </summary>
    223         /// <param name="doc">载入模板</param>
    224         /// <param name="tempFile"></param>
    225         /// <param name="mark">载入模版名称</param>
    226         /// <param name="lsFile"></param>
    227         public static void InsertDoc(Document doc, string mark, List<string> lsFile, string SaveName = null)
    228         {
    229             string savePath = "";
    230             var builder = new DocumentBuilder(doc);
    231             if (!string.IsNullOrEmpty(SaveName))
    232                 SaveName = SaveName.Substring(0, SaveName.LastIndexOf("_"));
    233             Document doc1;
    234             for (int i = 0; i < lsFile.Count; i++)
    235             {
    236                 if (i == 0)
    237                     savePath = lsFile[i].Substring(0, lsFile[i].LastIndexOf('\\') + 1);
    238                 doc1 = new Document(lsFile[i]);//新文档
    239                 var bookmark = doc.Range.Bookmarks[mark];
    240                 //清空书签的文本
    241                 //bookmark.Text = "";
    242                 //定位到指定位置进行插入操作
    243                 builder.MoveToBookmark(mark, false, false);
    244                 InsertDocument(bookmark.BookmarkStart.ParentNode, doc1);
    245                 //doc.FirstSection.PageSetup.SectionStart = SectionStart.NewPage;
    246                 //doc1.AppendDocument(doc, ImportFormatMode.KeepSourceFormatting);
    247 
    248                 System.IO.File.Delete(lsFile[i]); //删除已经插入的文件                
    249             }
    250             if (!string.IsNullOrEmpty(SaveName))
    251                 doc.Save(savePath + SaveName + ".doc");
    252         }
    253         #endregion
    254 
    255         #region 插入文档
    256         /// <summary>
    257         /// 插入文档
    258         /// </summary>
    259         /// <param name="insertAfterNode">节点在目标文件中的内容后插入。这个节点应该是一个块级节点(段落或表格)。</param>
    260         /// <param name="srcDoc">插入文档</param>
    261         private static void InsertDocument(Node insertAfterNode, Document srcDoc)
    262         {
    263             // 确保插入点是一个段落或表格。
    264             if ((!insertAfterNode.NodeType.Equals(NodeType.Paragraph)) &
    265               (!insertAfterNode.NodeType.Equals(NodeType.Table)))
    266                 throw new ArgumentException("插入的目的节点应该是一个段落或表格。");
    267 
    268             // 插入到目标段落
    269             CompositeNode dstStory = insertAfterNode.ParentNode;
    270             NodeImporter importer = new NodeImporter(srcDoc, insertAfterNode.Document, ImportFormatMode.KeepSourceFormatting);
    271 
    272             //在源文件中循环
    273             foreach (Section srcSection in srcDoc.Sections)
    274             {
    275                 foreach (Node srcNode in srcSection.Body)
    276                 {
    277                     // 跳过空节点
    278                     if (srcNode.NodeType.Equals(NodeType.Paragraph))
    279                     {
    280                         Paragraph para = (Paragraph)srcNode;
    281                         if (para.IsEndOfSection && !para.HasChildNodes)
    282                             continue;
    283                     }
    284                     // 插入到目标文档
    285                     Node newNode = importer.ImportNode(srcNode, true);
    286                     // 参考节点后插入新节点
    287                     dstStory.InsertAfter(newNode, insertAfterNode);
    288                     insertAfterNode = newNode;
    289                 }
    290             }
    291         }
    292         #endregion
    293     }
    294     #endregion 
    Code

        页面调用的方式如下:

    1 <input id="Export" type="button" class="s_btn" value="批量导出" onclick="AllExportWord(this.id, '接收进修生手册导出模板')" />
    2  <input id="Print" type="button" class="s_btn" value="批量打印" onclick="AllExportWord(this.id, '接收进修生手册导出模板')" />
    3  <input type="checkbox" name="chk" id="chk" value='@item.CardNo' data-ntid="@item.NTID" data-code="@item.CardNo" data-name="@item.NTName" /></td>
    Html

        这里的this.id是传当前请求的按钮的id,因为调用的方法都一样,所以同时传id,加以区分页面的请求,以实现不同的功能。
    controller调用的方法: 

      1        #region 批量下载文件前的验证
      2       /// <summary>
      3         /// 批量下载文件前的验证
      4      /// </summary>
      5         /// <param name="tempFile">模板</param>
      6         /// <param name="ntid">学生主键</param>
      7         /// <returns></returns>
      8         public JsonResult BatchExportWord(string tempFile, string ntid = null)
      9         {
     10             bool isOK = false;
     11             string msg = "";
     12             string strpath = "Content/templates";
     13             List<string> ls = new List<string>();
     14             if (!string.IsNullOrEmpty(tempFile))
     15             {
     16                 if (Path.GetExtension(tempFile) != ".doc")
     17                     tempFile = tempFile + ".doc";
     18                 isOK = WordFilePath.ExistFile(strpath, tempFile);
     19                 if (!isOK)
     20                     msg = "导出的模板不存在!";
     21                 else
     22                 {
     23                     if (!string.IsNullOrEmpty(ntid))
     24                     {
     25                         string[] strNTID = ntid.Split(',');
     26                         for (int i = 0; i < strNTID.Length; i++)
     27                         {
     28                             NameValueCollection nvc = new NameValueCollection();
     29                             nvc.Add(GetPropertyName<Model.MajorCycle>(m => m.NTID), strNTID[i]);
     30                             IList<Model.MajorCycle> lsMCycle = new BLL.MajorCycle().GetModelList<Model.MajorCycle>(nvc);
     31                             if (lsMCycle.Count > 0)
     32                                 ls.Add(string.Join(",", lsMCycle.Select(m => m.ID)));
     33                         }
     34                     }
     35                 }
     36             }
     37             else
     38             {
     39                 msg = "导出的模板为空!";
     40             }
     41             return Json(new { isOK = isOK, msg = msg, ls = ls });
     42         }
     43         #endregion
     44 
     45         #region 下载压缩包
     46         /// <summary>
     47         /// 下载压缩包
     48         /// </summary>
     49         /// <param name="tempFile">模板</param>
     50         /// <param name="ntid">学生主键</param>
     51         /// <param name="code">学生编号</param>
     52         /// <param name="name">学生名称</param>
     53         /// <param name="isAll">是否全部导出</param>
     54         /// <param name="idName">请求按钮id名称</param>
     55         /// <returns></returns>
     56         public FileContentResult DownLoadWord(string tempFile, string ntid, string code, string name, string isAll, string idName)
     57         {
     58             CompressFileZip fileZip = new CompressFileZip();
     59             string saveName = "", dirPath = "", GzipFileName = "", mid = "", stype = "", sequence = "";
     60             Document doc = new Document();
     61             var docStream = new MemoryStream();
     62             if (!string.IsNullOrEmpty(ntid))
     63             {
     64                 string[] strNTID = ntid.Split(',');
     65                 string[] strCode = code.Split(',');
     66                 string[] strName = name.Split(',');
     67                 for (int i = 0; i < strNTID.Length; i++)
     68                 {
     69                     if (i == 0) //第一次时创建临时文件夹
     70                     {
     71                         if (!string.IsNullOrEmpty(isAll) && isAll == "true")
     72                             GzipFileName = fileZip.FolderName(tempFile.Substring(0, tempFile.IndexOf("") + 1), "");
     73                         else
     74                             GzipFileName = fileZip.FolderName(strName[i], strCode[i]);
     75                         dirPath = fileZip.CreateTempFolder(GzipFileName);
     76                     }
     77                     NameValueCollection nvc = new NameValueCollection();
     78                     nvc.Add(GetPropertyName<Model.MajorCycle>(m => m.NTID), strNTID[i]);
     79                     IList<Model.MajorCycle> lsMCycle = new BLL.MajorCycle().GetModelList<Model.MajorCycle>(nvc);
     80                     if (lsMCycle.Count > 0) //如果不以这方式,则没有学习记录的数据导出来会是一个空的压缩包,什么文件也没有
     81                     {
     82                         mid = string.Join(",", lsMCycle.Select(m => m.MajorID)); // 轮转科室id
     83                         stype = lsMCycle[0].StudentType.ToString().Trim(); // 学生类型
     84                         sequence = string.Join(",", lsMCycle.Select(m => m.Sequence)); // 轮转次数
     85                     }
     86                     string[] midArr = mid.Split(',');
     87                     string[] sequenceArr = sequence.Split(',');
     88                     mid = ""; sequence = "";
     89                     for (int j = 0; j < midArr.Length; j++)
     90                     {
     91                         saveName = strName[i] + "_" + strCode[i] + "_" + DateTime.Now.ToString("yyyyMMddHHmmssfff");
     92                         WordHelper wordhelper = new WordHelper(tempFile);
     93                         getWordInfo(wordhelper, tempFile, strNTID[i], stype, midArr[j], sequenceArr[j]);
     94                         fileZip.SaveFile(wordhelper.ExportDoc().ToArray(), saveName, dirPath);
     95                     }
     96                     if (!string.IsNullOrEmpty(isAll) && isAll == "true" && idName == "Export")
     97                     {
     98                         doc = new Document(WordFilePath.GetFilePath("Content/templates", "test.doc"));
     99                         InsertFile.InsertDoc(doc, "p", fileZip.GetFileList(GzipFileName, strName[i]), saveName);
    100                     }
    101 
    102                 }
    103                 if (idName == "Export")
    104                     fileZip.dlZipDir(Response, WordFilePath.GetFilePath("UploadFile", GzipFileName), GzipFileName); //压缩下载
    105             }
    106 
    107             if (idName == "Print") //打印
    108             {
    109                 doc = new Document(WordFilePath.GetFilePath("Content/templates", "test.doc"));
    110                 InsertFile.InsertDoc(doc, "p", fileZip.GetFileList(GzipFileName));                
    111                 doc.Save(docStream, SaveOptions.CreateSaveOptions(SaveFormat.Doc));
    112                 Directory.Delete(WordFilePath.GetFilePath("UploadFile", GzipFileName));
    113             }
    114             return base.File(docStream.ToArray(), "application/msword", GzipFileName);
    115         }
    116         #endregion 
    View Code

      导出的效果如下图:             图片              生成的临时文件夹:          

    图片

          同一人的首先生成单个文件

    图片

            将两个文件合并成一个文件,以姓名和编号命名,同时删除合并前生成的那两个文件:

    图片

          循环生成 下一个人的单个文档

    图片

         合并文件,以姓名和编号命名,同时删除合并前的文件:

    图片
         打包压缩合并后的这两个文件,并下载:
    图片   
     

           打印的效果如下图:         将所有人的有关文档都生成单个文件 

    图片

           最后合并成一个文件,并输出:

    图片

    转载于:https://www.cnblogs.com/jingshuisihan/p/4604321.html

    展开全文
  • 接上一篇[http://blog.csdn.net/mr_liud/article/details/78468643]来实现多个word文档打包生成压缩文件并下载。 话不多说:下面是代码 import java.io.BufferedInputStream; import java.io.ByteArrayInputStream...

    接上一篇[http://blog.csdn.net/mr_liud/article/details/78468643]来实现多个word文档打包生成压缩文件并下载。
    话不多说:下面是代码

    import java.io.BufferedInputStream;
    import java.io.ByteArrayInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;
    
    import org.apache.poi.poifs.filesystem.POIFSFileSystem;
    
    /**
     * Created by LiuD on 2017/11/7
     */
    public class TestZip {
    
        /**
         * 批量下载
         */
        @ResponseBody
        @RequestMapping("/download.ajax")
        public class download(HttpServletResponse response) {
            List<File> list = new ArrayList<>();
            String s1 = "好好学习";
            String fileName1 = s1 + ".doc";
            File file1 = new File(fileName1);
            htmlToDoc(s1, file1);
            list.add(file1);
    
            String s2 = "天天向上";
            String fileName2 = s2 + ".doc";
            File file2 = new File(fileName2);
            htmlToDoc(s2, file2);
            list.add(file2);
    
            String s3 = "好好学习12321AA";
            String fileName3 = s3 + ".doc";
            File file3 = new File(fileName3);
            htmlToDoc(s3, file3);
            list.add(file3);
    
            try {
                // 要压缩的文件路径
                File file = new File("e:\\1.zip");
                if (file.exists()) {
                    System.out.println("该文件名已存在。");
                } else {
                    boolean newFile = file.createNewFile();
                    if (newFile) {
                        System.out.println("恭喜你,下载成功");
                    } else {
                        System.out.println("下载失败。请稍后再试···");
                    }
                }
                //创建文件输出流
                FileOutputStream fileOutputStream = new FileOutputStream(file);
                // ZipOutputStream输出流转换
                ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream);
                // 接收文件集合、压缩流
                zipFileAll(list, zipOutputStream);
                zipOutputStream.close();
                fileOutputStream.close();
                downloadZip(file, response);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 把接收的全部文件打成压缩包 
         *
         * @param files (文件集合)
         * @param outputStream (压缩流、输出)
         */
        private static void zipFileAll(List files, ZipOutputStream outputStream) {
            for (Object file1 : files) {
                File file = (File) file1;
                zipFile(file, outputStream);
            }
        }
    
        /**
         * 根据输入的文件与输出流对文件进行打包
         *
         * @param file (单个文件对象)
         * @param outputStream (压缩流、输出)
         */
        private static void zipFile(File file, ZipOutputStream outputStream) {
            try {
                if (file.exists()) {
                    if (file.isFile()) {
                        FileInputStream IN = new FileInputStream(file);
                        BufferedInputStream bins = new BufferedInputStream(IN, 1024);
                        // 将文件名写入压缩文件中
                        ZipEntry entry = new ZipEntry(file.getName());
                        outputStream.putNextEntry(entry);
                        // 向压缩文件中输出数据   
                        int nNumber;
                        byte[] buffer = new byte[1024];
                        while ((nNumber = bins.read(buffer)) != -1) {
                            outputStream.write(buffer, 0, nNumber);
                        }
                        outputStream.flush();
                        bins.close();
                        IN.close();
                    } else {
                        File[] files = file.listFiles();
                        for (File file1 : files) {
                            zipFile(file1, outputStream);
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    
        /**
         * 下载文件,支持跨域
         *
         * @param file (要下载的文件)
         * @param response
         */
        privtal static void downloadZip(File file, HttpServletResponse response) {
            try {
                // 以流的形式下载文件。
                InputStream fis = new BufferedInputStream(new FileInputStream(file.getPath()));
                byte[] buffer = new byte[fis.available()];
                fis.read(buffer);
                fis.close();
                response.reset();
                OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
                response.setContentType("application/octet-stream");
                response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
                toClient.write(buffer);
                toClient.flush();
                toClient.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            } finally {
                try {
                    File f = new File(file.getPath());
                    f.delete();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
    }
    
    展开全文
  • 这里用到了两个dll,一个是aspose.word.dll,另外一个是ICSharpCode.SharpZipLib.dll,ICSharpCode.SharpZipLib.dll是用于批量导出word文档的,通过把文件打包成压缩包,以文件流的方式输出下载。aspose.word.dll...
  • 目录: 实例讲解.doc JAVA SE基础部分.doc 面向对象(基础).doc 面向对象(基础)_02.doc 面向对象(高级)_01.doc 面向对象(高级)_02.doc 异常的捕获及处理.doc 包及访问控制权限.doc 多线程.doc ...
  • 获取文档的相对路径多个地方要用到,比如批量导出时要先保存文件到指定路径下,再压缩打包下载,所以专门写了个关于获取文档的相对路径的类。 1 #region 获取文档的相对路径 2 public class WordFilePath ...
  • 使用POI导出为word打包为zip下载

    千次阅读 2018-04-12 10:10:35
    先前要做一个功能:导出并压缩多个word文档,于是发现了导出word的6种方式:http://www.cnblogs.com/lcngu/p/5247179.html 虽然都说poi不适合用来导出word,但是还是义无反顾的用了poi,下面正题。 package ...
  • 20套软件开发设计文档模板,软件开发说明必备word设计文档,已打包
  • 导出word文档(docx) 前言 我们常常在代码中读取一些资源文件(比如word文档、导出模版等)。在开发工具中单独运行,这些简单读取不会有问题。但是,如果我们把代码打成一个jar包发布到服务器,运行程序时就会抛出找...
  • Android使用POI打开word文档

    千次阅读 2017-06-15 10:54:20
    Android使用POI打开word文档最近使用Apache的POI包解析打开word文档,遇到不少问题。各种报错。折腾了两天,发现主要问题在WordToHtmlCOnverter.java这个类存在各种问题(好歹这么大的公司,代码太不严谨了吧,最...
  • 包括的ppt介绍和具体开发的word文档介绍,对ibm mq的结构和开发,已经websphere也进行了详细的介绍
  • word文档编辑技巧

    2014-05-20 13:39:32
    Word文档精确“减肥”五小招 68 如何用Word实现在网上开会 72 七种办法减少Word容量 74 隐藏在word汉字里面的玄机 75 Word技巧:一次特殊的查找和替换 78 在Word中为三位数字设置带圈字符 80 巧用Word输入生僻字 81...
  • Unity创建和修改本地Word文档

    千次阅读 2019-10-10 17:02:03
    最多搞个截图就行了,最近客户突然提出要将实验报告(UGUI,包括图片、按钮、输入框、文字等),这就有点懵,好在经过一段时间的研究,可以在Unity内通过NPOI类库(没听说的可以找度娘问一下)创建和修改Word文档,...
  • 加密word文档,支持*.doc;*.rtf;*.docx;*.docm; 保护word文档分发,防止编辑、防止复制、防止打印;用户打开受加密保护的文档时,加密文件会弹出验证框要求用户输入阅读密码,这个验证框中同时显示有用户的机器码,...
  • word打包批量下载

    2018-03-07 11:32:11
    div设置可编辑,复制word文档后用base64存储 /** * * 概要说明 : 设置模板 &lt;br&gt; * 详细说明 : 设置模板 &lt;br&gt; * * @param ledm 执法文书实体 * @return ReturnMap 类型返回值...
  • 大几率破解word文档密码

    千次阅读 2019-10-13 21:32:22
    1.将扩展名 .docx 改为 .zip 压缩包 2.打开压缩包,名字为“word”的文件夹 3.用记事本等修改里面的 settings.xml,把<w:documentProtection一段删掉 4.重新打包,并把扩展名改回 .docx ...
  • python在word文档里插入文件对象

    千次阅读 热门讨论 2020-05-28 12:31:05
    工作需要制作每周一次的汇总报表,除了正文以外,还需要把上周的各种报表以附件的方式打包到报表里,有word文档,有excel表格,手工操作是这样的:插入-对象-由文件创建-勾选显示为图标-选择文件-确认,如图:!...
  • word解密软件 使用前请您先阅读以下条款: please read the following items before using: 1.本站仅对原软件包“依样”打包,未做过任何改动,但不保证所提供软件或程序的完整性和安全性。 1.Our website only pack...
  • word文档生成CHM格式

    千次阅读 2015-01-15 09:33:52
    在下载或安装一些软件的时候大家是否有注意到这些...这样的文件其实我们每个人都可以制作,不过需要专业的软件才可以完成,本章Word联盟就教大家如何制作“.chm”格式的文件,如何将Word文件转换成Chm格式的帮助文件
  • 作者:小小明 文章目录doc格式批量转为docx批量提取docx文档的图片批量图片格式转换完整代码GUI图形化工具开发打包exe...即使你知道可以把word文档用压缩文件打开,逐个解压的话依然会耗时较长时间,另外里面掺杂了d.
  • 比如服务器端生成word文档转pdf文档,因为linux没有某些字体导致生成端pdf出现乱码。 安装步骤 服务器目录 /usr/share/fonts 下新建目录 cd /usr/share/fonts mkdir xin_fond 将本地系统字体打包,上传至服务器...
  • Word文档加密器v4.1

    2007-10-11 19:04:06
    可以将doc打包成exe格式文件,用以加密DOC文件、RTF格式文档,绝非office自带的加密方法,本系统有以下特色---- <br>1、加密时可以设置是否不同电脑需要不同的阅读密码-您可以为不同用户设置不同的阅读密码,...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 339
精华内容 135
关键字:

word文档打包