精华内容
下载资源
问答
  • qt写word两种方式代码

    2018-07-07 13:56:12
    qt有三种方法写word:通过html、通过qword、通过模版。本文件中包括前两种方式demo。
  • 无 涯 RUP 模版 测试计划 <项目名称> 测试计划 版本 <1.0> [注以下提供的模板用于 Rational Unified Process 其中包括用方括号括起来并以蓝色斜体样式=InfoBlue 显示的文本它们用于向作者提供指导在发布此文档之前...
  • 设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节 通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后...
  • 主要包括Word 2007的基本操作、编辑文档、格式化文档、图文混排等,如设置字体和段落格式、添加项目符号、插入图片、绘制图形等,还介绍了在Word 2007中插入表格和图表对数据进行表现、通过样式和模板处理文档、审阅...
  • 用Delphi开发的,可以根据excel需求跟踪矩阵,按word或excel模板自动转换成需求说明书...通过ole方式来操作word和excel,是作者寻找了众多网上资料包括官方网站的资料才开发出来。学习、参考和直接使用这个工具都可以!
  • Word文档超级保镖

    2012-04-26 17:29:13
    可以加密各种Word文档,如doc, docx, docm, dotx, dotm, dot, rtf等等,加密后的文档可以一机一码授权,保护外发文档,绑定用户电脑、防扩散; 用户必须得到您授权的开启密码后才可以打开,您可以为用户创建开启密码...
  • Word文档加密器 v9.2

    2012-11-09 14:34:53
    加密Word文档,支持doc, docx,docm等格式,防止编辑、防止复制、防止打印;用户打开受加密保护的文档时, 加密文件会弹出验证框要求用户输入阅读密码,这个验证框中同时显示有用户的机器码,用户可以发送他的机器码...
  • 记录一次用Java生成word文档的经验

    千次阅读 2019-02-21 15:15:18
    最近接到一个需求需要将学员的基本信息生成word格式的内容,word的格式如下图所示 开发的任务就是将学员的信息替换掉表格中的** 即可,感觉还蛮简单的。 相信大家以前做的最多的是Java和Excel的转换的功能比较多...

    业务背景

    最近接到一个需求需要将学员的基本信息生成word格式的内容,word的格式如下图所示

    在这里插入图片描述

    开发的任务就是将学员的信息替换掉表格中的** 即可,感觉还蛮简单的。

    相信大家以前做的最多的是Java和Excel的转换的功能比较多吧,我也是如此,之前也没有做过word转换的功能,所以此次接到这个任务我也是一样,从网上找方法,在网上找了一些博客论坛大概有几种方法可以尝试。

    几种解决思路

    1:Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁。使用Jacob自带的DLL动态链接库,并通过JNI的方式实现了在Java平台上对COM程序的调用。DLL动态链接库的生成需要windows平台的支持。该方案只能在windows平台实现,是其局限性。

    2:Apache POI包括一系列的API,它们可以操作基于MicroSoft OLE 2 Compound Document Format的各种格式文件,可以通过这些API在Java中读写Excel、Word等文件。他的excel处理很强大,对于word还局限于读取,目前只能实现一些简单文件的操作,不能设置样式。

    3:Java2word是一个在java程序中调用 MS Office Word 文档的组件(类库)。该组件提供了一组简单的接口,以便java程序调用他的服务操作Word 文档。 这些服务包括: 打开文档、新建文档、查找文字、替换文字,插入文字、插入图片、插入表格,在书签处插入文字、插入图片、插入表格等。填充数据到表格中读取表格数据 ,1.1版增强的功能: 指定文本样式,指定表格样式。如此,则可动态排版word文档。是一种不错的解决方案。

    4:iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。功能强大。

    5:JSP输出样式,该方案实现简单,但是处理样式有点缺陷,简单的导出可以使用。

    6:用XML做就很简单了。Word从2003开始支持XML格式,大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。经测试这样方式生成的word文档完全符合office标准,样式、内容控制非常便利,打印也不会变形,生成的文档和office中编辑文档完全一样。

    综合以上资料的参考,和网上的一些意见,最后我选择了,第6种用xml做导出方案。

    开发流程

    替换word模板

    对照上面发的那个word格式,将** 替换成变量名称,比如用户名称用${userName}表示,全部替换后的格式如下图所示

    在这里插入图片描述

    导出xml格式并重命名ftl格式

    将上图的word文件另存为xml格式,并且重命名为ftl结尾的文件

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    编写Java代码

    项目需要引用到freemaker的jar包,在pom.xml配置文件中,添加下面的依赖

    <!-- freemarker jar -->
    		<dependency>
    	     <groupId>org.freemarker</groupId>
    	     <artifactId>freemarker</artifactId>
    	     <version>2.3.20</version>
    	 	</dependency>
    

    将ftl模板文件复制到项目的指定路径下

    将freemaker的配置文件放到项目的指定目录下

    编写WordUtil.java

    package com.xyq.maventest.util;
    
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.io.Writer;
    import java.util.HashMap;
    import java.util.Map;
    
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    import freemarker.template.TemplateException;
    /***
     * 
    * Project Name:maventest
    * <p>生成word工具类<br> 
    *
    * @ClassName: WordUtil
    * @date 2019年2月20日  下午5:50:49
    *
    * @author youqiang.xiong
    * @version 1.0
    * @since  
    * @see
     */
    public class WordUtil {  
          
        private Configuration configuration = null;  
        
        /****
         * 模板文件存放的目录
         */
        private static final String  baseDir = "F:/study/GIT/maventest/src/main/resources/freemaker";
        /***
         * 模板文件名称
         */
        private static final String  templateFile = "template.ftl";
        /***
         * word生成的输出目录
         */
        private static final String  outputDir = "F:/file/";
          
        public WordUtil(){  
            configuration = new Configuration();  
            configuration.setDefaultEncoding("UTF-8");  
        }  
          
        public static void main(String[] args) {  
            WordUtil test = new WordUtil();  
            test.createWord();  
        }  
         
        /*****
         * 
        * Project Name: maventest
        * <p>转换成word<br> 
        *
        * @author youqiang.xiong
        * @date 2019年2月21日  上午11:22:03
        * @version v1.0
        * @since
         */
        public void createWord(){  
            Map<String,Object> dataMap=new HashMap<String,Object>();  
            //构造参数
            getData(dataMap);  
            
            configuration.setClassForTemplateLoading(this.getClass(), "");//模板文件所在路径
            Template t=null;  
            try {  
            	configuration.setDirectoryForTemplateLoading(new File(baseDir));
            	t = configuration.getTemplate(templateFile);
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
            File outFile = new File(outputDir+Math.random()*10000+".doc"); //导出文件
            Writer out = null;  
            try {  
                out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));  
            } catch (FileNotFoundException e1) {  
                e1.printStackTrace();  
            }  
               
            try {  
                t.process(dataMap, out); //将填充数据填入模板文件并输出到目标文件 
                System.out.println("生成成功...");
            } catch (TemplateException e) {  
                e.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
      
        /****
         * 
        * Project Name: maventest
        * <p>初始化数据map <br> 
        *
        * @author youqiang.xiong
        * @date 2019年2月21日  上午11:26:34
        * @version v1.0
        * @since 
        * @param dataMap
        * 		封装数据的map
         */
        private void getData(Map<String, Object> dataMap) {  
            dataMap.put("userName", "刘德华");  
            dataMap.put("sex", "男");  
            dataMap.put("nation", "汉族");  
            dataMap.put("birthday", "1985-02-26");   
            dataMap.put("nationPlace", "春日部");  
            dataMap.put("politicalStatus", "党员");  
            dataMap.put("graduationSchool", "双叶幼稚园");  
            dataMap.put("lastBackground", "幼稚园");  
            dataMap.put("graduationMajor", "玩泥沙");  
            dataMap.put("workUnit", "NASA");  
            dataMap.put("business", "煮菜的");  
            dataMap.put("postalAddress", "lc");  
            dataMap.put("postalcode", "lc");  
            dataMap.put("mobile", "18898416969");  
            dataMap.put("admissionTicket", "lc");  
            dataMap.put("enterSchoolTime", "lc");  
            dataMap.put("emergencyContact", "lc");  
            dataMap.put("readingInstrouction", "lc");  
            dataMap.put("year", "2019");  
            dataMap.put("month", "02");  
            dataMap.put("day", "20");  
         
        }  
    }
    

    运行main方法,抛出如下异常:

    freemarker.core.ParseException: Parsing error in template "template.ftl" in line 3, column 11570:
    Encountered "<", but was expecting one of:
        <STRING_LITERAL>
        <RAW_STRING>
        "false"
        "true"
        <INTEGER>
        <DECIMAL>
        "."
        "+"
        "-"
        "!"
        "["
        "("
        "{"
        <ID>
    	at freemarker.core.FMParser.generateParseException(FMParser.java:4672)
    	at freemarker.core.FMParser.jj_consume_token(FMParser.java:4543)
    	at freemarker.core.FMParser.UnaryExpression(FMParser.java:340)
    	at freemarker.core.FMParser.MultiplicativeExpression(FMParser.java:452)
    	at freemarker.core.FMParser.AdditiveExpression(FMParser.java:402)
    	at freemarker.core.FMParser.RangeExpression(FMParser.java:573)
    	at freemarker.core.FMParser.RelationalExpression(FMParser.java:528)
    	at freemarker.core.FMParser.EqualityExpression(FMParser.java:493)
    	at freemarker.core.FMParser.AndExpression(FMParser.java:602)
    	at freemarker.core.FMParser.OrExpression(FMParser.java:625)
    	at freemarker.core.FMParser.Expression(FMParser.java:238)
    	at freemarker.core.FMParser.StringOutput(FMParser.java:1076)
    	at freemarker.core.FMParser.Content(FMParser.java:2550)
    	at freemarker.core.FMParser.OptionalBlock(FMParser.java:2761)
    	at freemarker.core.FMParser.Root(FMParser.java:2933)
    	at freemarker.template.Template.<init>(Template.java:193)
    	at freemarker.cache.TemplateCache.loadTemplate(TemplateCache.java:419)
    	at freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:330)
    	at freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:205)
    	at freemarker.template.Configuration.getTemplate(Configuration.java:740)
    	at freemarker.template.Configuration.getTemplate(Configuration.java:665)
    	at com.xyq.maventest.util.WordUtil.createWord(WordUtil.java:75)
    	at com.xyq.maventest.util.WordUtil.main(WordUtil.java:53)
    Exception in thread "main" java.lang.NullPointerException
    	at com.xyq.maventest.util.WordUtil.createWord(WordUtil.java:88)
    	at com.xyq.maventest.util.WordUtil.main(WordUtil.java:53)
    
    

    这个错误估计很人都有遇到过,起初我并不知道报错提示的是什么原因,大概猜测应该是ftl模板出错了,但是又不知道为什么会报错,初步怀疑是不是word编写的变量 格 式 书 写 有 误 ? 后 来 返 回 修 改 w o r d 的 变 量 格 式 逐 步 缩 小 问 题 原 因 所 在 , 经 过 反 复 试 验 才 发 现 , w o r d 转 换 成 x m l 格 式 的 时 候 , 如 果 文 档 中 有 {}格式书写有误? 后来返回修改word的变量格式逐步缩小问题原因所在,经过反复试验才发现,word转换成xml格式的时候,如果文档中有 wordwordxml{}特殊符号的时候,转换成xml格式会出现错位的情况,如下所示:
    在这里插入图片描述

    因为我对word生成xml这个机制并不是很了解,由于时间原因,也没有深究这里的根本原因,于是原因找到了,是生成ftl模板的时候格式有问题。那么既然${}符合会被解析错误的话,那可以换一种思路,将word中的符合全部不需要,只留变量即可,如下所示:

    在这里插入图片描述

    然后重新生成xml文件,修改文件后缀ftl,打开模板文件,将模板文件复制到notepad++文件编辑器打开,
    然后一个个将变量替换成${}即可,比如讲userName 替换成 ${userName} 即可

    在这里插入图片描述

    一个个变量替换完毕后,将模板文件覆盖原有的内容,重新运行WordUtil.java ,运行成功。并且在指定目录下会生成一个新的word文件,打开word文件如下图所示:

    在这里插入图片描述

    至此用Java生成word的功能已经完成,大家可以根据各自所需修改word模板即可。

    展开全文
  • 如何在word中实现连续编号自动打印

    千次阅读 2020-11-06 20:36:48
    在百度上查找相关方法,包括VBA程序都满意,大多有点错误。因此手写了这份代码,现提供同学们参考: Sub PrintCopies() Dim i As Integer Dim b As Integer Dim a As Integer a = InputBox(“打印份数”, “请输入...

    如何在word中实现连续编号自动打印
    因机关工作需要,经常在发文打印时,需要逐份输入连续文件编号。在百度上查找相关方法,包括VBA程序都不满意,大多有点错误。因此手写了这份代码,现提供同学们参考:
    Sub PrintCopies()
    Dim i As Integer
    Dim b As Integer
    Dim a As Integer
    a = InputBox(“打印份数”, “请输入打印份数”, 1)
    b = InputBox(“开始编号”, “请输入开始编号”, 1)
    c = a + b - 1
    For i = b To c
    If i < 10 Then
    Selection.TypeText Text:=“000” & i
    ElseIf i < 100 Then
    Selection.TypeText Text:=“00” & i
    ElseIf i < 1000 Then
    Selection.TypeText Text:=“0” & i
    Else
    Selection.TypeText Text:=i
    End If
    Application.PrintOut
    Selection.TypeBackspace
    Selection.TypeBackspace
    Selection.TypeBackspace
    Selection.TypeBackspace
    Next
    End Sub
    大家复制后,拷入宏后,可以直接使用。

    展开全文
  • Word文档中的指定内容进行替换

    千次阅读 2018-05-12 09:53:42
    不知大家在对Word操作时,有没有遇到需要对指定内容进行替换这种需求。前几天公司有个需求,就是对PDF... 用到的lib包括,特别强调下,jacob使用时需要给C:/WINDOWS/System32目录下添加jacob对应位数的dll文件: ...

        不知大家在对Word操作时,有没有遇到需要对指定内容进行替换这种需求。前几天公司有个需求,就是对PDF邀请函的姓名那部分内容进行替换,因为本人以前对Word的书签有过操作,所以思路就是通过将这部分内容设定为书签,对书签的进行替换保存为新的邀请函。

        用到的lib包括,特别强调下,jacob使用时需要给C:/WINDOWS/System32目录下添加jacob对应位数的dll文件:

    具体的步骤如下:

        1、首先将PDF转化为WORD文档,替换书签个人感觉WORD操作起来比较方便点,替换后的格式或许有稍许错位,重新编译保存下,将该WORD文档作为邀请函模板;

           

        2、对需要替换的部分添加书签,对邀请人的xx添加书签,暂且命名为xm;

        

        3、替换的内容是以EXCEL存储的单列数据,又引入POI操作EXCEL部分的内容,该类就是POI读取EXCEL内容的公共类,包括XLS以及XLSX;

    public class parseExcelFile {
    	public static final String OFFICE_EXCEL_2003_POSTFIX = "xls";
    	public static final String OFFICE_EXCEL_2010_POSTFIX = "xlsx";
    	public static final String EMPTY = "";
    	public static final String POINT = ".";
    	public static final String NOT_EXCEL_FILE = " : Not the Excel file!";
    	public static final String PROCESSING = "Processing...";
    
    	/**
    	 * 读Excel文件
    	 * 
    	 * @param file
    	 *            Ecxel文件
    	 * @param sheetNum
    	 *            第几个sheet 必须大于0或为null(默认1) 否则会报错
    	 * @param startLine
    	 *            开始行(包含本行) 必须大于0或为null(默认1) 否则会报错
    	 * @param endLine
    	 *            结束行(包含本行) 必须大于等于开始行或为null(默认最大行) 否则会报错
    	 * @param startColumn
    	 *            开始列(包含本列) 必须大于0或为null(默认1) 否则会报错
    	 * @param endColumn
    	 *            结束列(包含本列) 必须大于等于开始列或为null(默认第一行列数) 否则会报错
    	 * @return
    	 * @throws IOException
    	 */
    	public Map<String, String> readExcel(File file, Integer sheetNum, Integer startLine, Integer endLine,
    			Integer startColumn, Integer endColumn) throws IOException {
    		if (file == null || EMPTY.equals(file)) {
    			return null;
    		} else {
    			String postfix = this.getPostfix(file.getName());
    			if (!EMPTY.equals(postfix)) {
    				if (OFFICE_EXCEL_2003_POSTFIX.equals(postfix)) {
    					return readXls(file, sheetNum, startLine, endLine, startColumn, endColumn);
    				} else if (OFFICE_EXCEL_2010_POSTFIX.equals(postfix)) {
    					return readXlsx(file, sheetNum, startLine, endLine, startColumn, endColumn);
    				}
    			} else {
    				System.out.println(file + NOT_EXCEL_FILE);
    			}
    		}
    		return null;
    	}
    
    	/**
    	 * 读2010 xlsx Excel文件
    	 * 
    	 * @param 文件路径
    	 * @param sheetNum
    	 *            第几个sheet
    	 * @param startLine
    	 *            开始行
    	 * @param endLine
    	 *            结束行
    	 * @param startColumn
    	 *            开始列
    	 * @param endColumn
    	 *            结束列
    	 * @return
    	 * @throws IOException
    	 */
    	public Map<String, String> readXlsx(File file, Integer sheetNum, Integer startLine, Integer endLine,
    			Integer startColumn, Integer endColumn) throws IOException {
    		System.out.println(PROCESSING + file.getName());
    		InputStream is = new FileInputStream(file);
    		XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);
    		Map<String, String> map = new HashMap<String, String>();
    		// Read the Sheet
    		// for (int numSheet = 0; numSheet < xssfWorkbook.getNumberOfSheets();
    		// numSheet++) {
    		if (sheetNum == null || sheetNum.equals("")) {
    			sheetNum = 1;
    			map.put("sheetNum", sheetNum.toString());
    		}
    		XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(sheetNum - 1);
    		if (xssfSheet != null) {
    			if (startLine == null || EMPTY.equals(startLine)) {
    				startLine = 1;
    				map.put("startLine", startLine.toString());
    			}
    			if (endLine == null || EMPTY.equals(endLine)) {
    				endLine = xssfSheet.getLastRowNum() + 1;
    				map.put("endLine", endLine.toString());
    			}
    			if (startColumn == null || EMPTY.equals(startColumn)) {
    				startColumn = 1;
    				map.put("startColumn", startColumn.toString());
    			}
    			if (endColumn == null || EMPTY.equals(endColumn)) {
    				// 默认获得第一行的列数
    				endColumn = xssfSheet.getRow(0).getPhysicalNumberOfCells();
    				map.put("endColumn", endColumn.toString());
    			}
    			// Read the Row
    			for (int rowNum = startLine - 1; rowNum < endLine; rowNum++) {
    				XSSFRow xssfRow = xssfSheet.getRow(rowNum);
    				if (xssfRow != null) {
    					for (int i = startColumn - 1; i < endColumn; i++) {
    						XSSFCell xc = xssfRow.getCell(i);
    						map.put(sheetNum + "-" + rowNum + "-" + i, getValue(xc));
    					}
    				}
    			}
    		}
    		// }
    		return map;
    	}
    
    	/**
    	 * 读2003 xls Excel文件
    	 * 
    	 * @param 文件路径
    	 * @param startLine
    	 *            开始行
    	 * @param endLine
    	 *            结束行
    	 * @param startColumn
    	 *            开始列
    	 * @param endColumn
    	 *            结束列
    	 * @return
    	 * @throws IOException
    	 */
    	public Map<String, String> readXls(File file, Integer sheetNum, Integer startLine, Integer endLine,
    			Integer startColumn, Integer endColumn) throws IOException {
    		System.out.println(PROCESSING + file.getName());
    		InputStream is = new FileInputStream(file);
    		POIFSFileSystem fs = new POIFSFileSystem(is);
    		HSSFWorkbook hssfWorkbook = new HSSFWorkbook(fs);
    		Map<String, String> map = new HashMap<String, String>();
    		// Read the Sheet
    		// for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets();
    		// numSheet++) {
    		if (sheetNum == null || sheetNum.equals("")) {
    			sheetNum = 1;
    			map.put("sheetNum", sheetNum.toString());
    		}
    		HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(sheetNum - 1);
    		if (hssfSheet != null) {
    
    			if (startLine == null || EMPTY.equals(startLine)) {
    				startLine = 1;
    				map.put("startLine", startLine.toString());
    			}
    			if (endLine == null || EMPTY.equals(endLine)) {
    				endLine = hssfSheet.getLastRowNum() + 1;
    				map.put("endLine", endLine.toString());
    			}
    			if (startColumn == null || EMPTY.equals(startColumn)) {
    				startColumn = 1;
    				map.put("startColumn", startColumn.toString());
    			}
    			if (endColumn == null || EMPTY.equals(endColumn)) {
    				// 默认获得第一行的列数
    				endColumn = hssfSheet.getRow(0).getPhysicalNumberOfCells();
    				map.put("endColumn", endColumn.toString());
    			}
    			// Read the Row
    			for (int rowNum = startLine - 1; rowNum < endLine; rowNum++) {
    				HSSFRow hssfRow = hssfSheet.getRow(rowNum);
    				if (hssfRow != null) {
    					for (int i = startColumn - 1; i < endColumn; i++) {
    //						HSSFCell xc = hssfRow.getCell(i);
    //						System.out.println("xc=" + xc);
    						map.put(sheetNum + "-" + rowNum + "-" + i, getValue(hssfRow.getCell(i)));
    					}
    				}
    			}
    		}
    		// }
    		return map;
    	}
    
    	/**
    	 * 获得后缀名
    	 * 
    	 * @param path
    	 * @return
    	 */
    	public String getPostfix(String path) {
    		if (path == null || EMPTY.equals(path.trim())) {
    			return EMPTY;
    		}
    		if (path.contains(POINT)) {
    			return path.substring(path.lastIndexOf(POINT) + 1, path.length());
    		}
    		return EMPTY;
    	}
    
    	@SuppressWarnings("static-access")
    	private String getValue(XSSFCell xssfRow) {
    		if (xssfRow.getCellType() == xssfRow.CELL_TYPE_BOOLEAN) {
    			return String.valueOf(xssfRow.getBooleanCellValue());
    		} else if (xssfRow.getCellType() == xssfRow.CELL_TYPE_NUMERIC) {
    			if (XSSFDateUtil.isCellDateFormatted(xssfRow)) {
    				return XSSFDateUtil.getJavaDate(xssfRow.getNumericCellValue()).toString();
    			} else {
    				HSSFDataFormatter dateFormatter=new HSSFDataFormatter();
    				String xcssfFormatted=dateFormatter.formatCellValue(xssfRow);
    				return xcssfFormatted;
    			}
    		} else {
    			return String.valueOf(xssfRow.getStringCellValue());
    		}
    	}
    
    	@SuppressWarnings("static-access")
    	private String getValue(HSSFCell hssfCell) {
    		if (hssfCell.getCellType() == hssfCell.CELL_TYPE_BOOLEAN) {
    			return String.valueOf(hssfCell.getBooleanCellValue());
    		} else if (hssfCell.getCellType() == hssfCell.CELL_TYPE_NUMERIC) {
    			if (HSSFDateUtil.isCellDateFormatted(hssfCell)) {
    				return HSSFDateUtil.getJavaDate(hssfCell.getNumericCellValue()).toString();
    			} else {
    				HSSFDataFormatter dateFormatter=new HSSFDataFormatter();
    				String ceccFormatted=dateFormatter.formatCellValue(hssfCell);
    				return ceccFormatted;
    			}
    		} else {
    			return String.valueOf(hssfCell.getStringCellValue());
    		}
    	}
    
    	
    
    	/**
    	 * 删除文件
    	 * 
    	 * @param path
    	 *            文件路径
    	 * @return
    	 */
    	public String deleteTemporaryFile(String path) {
    		if (path != null && !path.equals("")) {
    			File file = new File(path);
    			if (file.exists()) {
    				file.delete();
    			}
    		}
    		return "success";
    	}
    public class XSSFDateUtil extends DateUtil{
    	protected static int absoluteDay(Calendar cal,boolean use1904windowing){
    		return DateUtil.absoluteDay(cal, use1904windowing);
    	}
    }
    

        数据源内容

       

     

        4、通过jacob操作WORD,读取该书签的内容并进行替换,重新保存为PDF文档,核心代码如下:

     

        

    package com.ecservice;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import com.jacob.activeX.ActiveXComponent;
    import com.jacob.com.ComThread;
    import com.jacob.com.Dispatch;
    import com.jacob.com.Variant;
    
    public class PDFRead {
    
    	private static final int wdFormatPDF = 17;// word转PDF 格式
    	
    	
    	//Excel数据导入
    	private List<String> readNameExcel(String path){
    		List<String> NameLists=new ArrayList<String>();
    		// 解析存储数据
    		parseExcelFile pef = new parseExcelFile();
    		try {
    			// 获得表数据中数据,
    			Integer sheetNum = 1;
    			Integer startLine = 0;
    			Integer endLine = null;
    			Integer startColumn = 1;
    			Integer endColumn = 1;
    			Map<String, String> map = pef.readExcel(new File(path.trim()),
    					sheetNum, startLine, endLine, startColumn, endColumn);	
    			if (map != null) {
    				sheetNum = (sheetNum == null ? Integer.parseInt((String) map.get("sheetNum")) : sheetNum);
    				startLine = (startLine == null ? Integer.parseInt((String) map.get("startLine")) : startLine);
    				endLine = (endLine == null ? Integer.parseInt((String) map.get("endLine")) : endLine);
    				startColumn = (startColumn == null ? Integer.parseInt((String) map.get("startColumn")) : startColumn);
    				endColumn = (endColumn == null ? Integer.parseInt((String) map.get("endColumn")) : endColumn);
    				// 存储数据
    				
    				for (int i = startLine; i < endLine; i++) {
    					for(int j = startColumn-1; j < endColumn; j++){
    						String columdata = "";
    						if("*".equals(map.get(sheetNum + "-" + i + "-" + j))){
    							columdata = "0";
    						}else{
    							columdata = map.get(sheetNum + "-" + i + "-" + j).trim();
    						}
    						NameLists.add(columdata);
    					}
    				}
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    			return null;
    		}
    		return NameLists;
    	}
    	
    
    	public static void main(String[] args) {
    		ComThread.InitSTA();
    		List<String> nameList=new PDFRead().readNameExcel("c://1.xlsx");
    		if(nameList!=null){
    			for (int k = 0; k < nameList.size(); k++) {
    				// 要保存的目标文件
    				String tpFile = "";
    	
    				// 启动word,生成一个ActivexComponent对象
    				ActiveXComponent app = new ActiveXComponent("Word.Application");
    				// 要转换的word文件
    				String inFile = "C://1.doc";
    				// 要保存的目标文件
    				tpFile = "C://1/" + nameList.get(k) + ".pdf";
    				File fileDir=new File("C://1");
    				if(!fileDir.exists()){
    					fileDir.mkdirs();
    					fileDir.setWritable(true);
    				}
    				app.setProperty("Visible", false);
    				Dispatch docs = app.getProperty("Documents").toDispatch();
    				Dispatch doc = Dispatch.call(docs, //
    						"Open", //
    						inFile, // FileName
    						false, // ConfirmConversions
    						true // ReadOnly
    				).toDispatch();
    	
    				// Dispatch activeDocument=app.getProperty("ActiveDocument").toDispatch();
    				Dispatch bookMarks = app.call(doc, "Bookmarks").toDispatch();
    				int bCount = Dispatch.get(bookMarks, "Count").getInt(); // 获取书签数
    				// 将书签列表存放到list + map 结构中
    				for (int i = 1; i <= bCount; i++) {
    					// Map bookMark = new HashMap(); //创建Map()
    					Dispatch items = Dispatch.call(bookMarks, "Item", i).toDispatch();
    					String bookMarkKey = String.valueOf(Dispatch.get(items, "Name").getString()).replaceAll("null", ""); // 读取书签命名
    					Dispatch range = Dispatch.get(items, "Range").toDispatch();
    					String bookMarkValue = String.valueOf(Dispatch.get(range, "Text").getString()).replaceAll("null", ""); // 读取书签文本
    					String MarkKey = bookMarkKey;
    					String MarkValue = bookMarkValue;
    					// 书签名并替换的内容
    					if (MarkKey.equals("xm"))// 书签名为xm
    					{
    						MarkValue = nameList.get(k); // 该xm书签处插入张三;
    					}
    	
    					Dispatch.put(range, "Text", new Variant(MarkValue));
    					// 通过打印查看便于debug
    					System.out.println(bookMarkValue);
    					System.out.println(MarkValue);
    					// 保存文件
    					Dispatch.call(doc, //
    							"SaveAs", //
    							tpFile, // FileName
    							wdFormatPDF);
    	
    				}
    				try {
    					Variant f = new Variant(false);
    					Dispatch.call(doc, "Close", f);
    				} catch (Exception e) {
    					e.printStackTrace();
    				} finally {
    					app.invoke("Quit", new Variant[] {});
    					ComThread.Release();
    				}
    	
    			}
    			System.out.println("转化完成......");
    		}else{
    			System.out.println("读取excel失败!");
    		}
    
    	}
    }
    

        5、测试结果:

        

        邀请函内容就这么愉快的替换掉啦

        

     

       Ending!

     

        PS:写的第一篇博文,有什么不足之处欢迎指正!

     

     

    展开全文
  • Word文档在前台页面展示

    千次阅读 2017-02-27 17:43:38
    这篇文章主要是围绕如何实现Word文档在页面上进行预览,以及涉及到相关的技术点,和我们将会在这个功能上使用的插件。插件:Aspose.Total: Aspose.Total是Aspose公司旗下的最全的一套office文档管理方案,主要提供...

    这篇文章主要是围绕如何实现Word文档在页面上进行预览,以及涉及到相关的技术点,和我们将会在这个功能上使用的插件。


    插件:Aspose.Total:
    Aspose.Total是Aspose公司旗下的最全的一套office文档管理方案,主要提供.net跟java两个开发语言的控件套包,通过它,我们可以有计划地操纵一些商业中最流行的文件格式:Word, Excel, PowerPoint, Project,等office文档以及PDF文档。

    在这个功能模块中我们只使用其中的一个强大的类库:Aspose.Words:
    Aspose.Words是一款先进的类库,通过它可以直接在各个应用程序中执行各种文档处理任务。Aspose.Words支持DOC,OOXML,RTF,HTML,OpenDocument, PDF, XPS, EPUB和其他格式。使用Aspose.Words,您可以生成,更改,转换,渲染和打印文档而不使用Microsoft Word。


    上硬货( 前台代码):

    <div id="WordPreview">
       <div class="panel panel-info " id="panel1">
           <div class="panel-heading">
              <h3 class="panel-title">Word浏览</h3>
           </div>
       <div id="main">
        <div id="content">
         <div id="contents">
           <iframe id="myFrame" name="_blank" frameborder="0" scrolling="no" onload="this.height=myFrame.document.body.scrollHeight"></iframe>
          </div>
         </div>
       <div class="col-sm-12 padding-t-5" >
         <div id="name" class="col-sm-6"></div>
         <div id="date" class="col-sm-6"></div>
       </div>
     </div>
    </div>
    </div>

    这里我们会使用HTML5 的 iframe 标签:
    iframe 标签规定一个内联框架,一个内联框架被用来在当前 HTML 文档中嵌入另一个文档,我们将会把Word文档的内容在这个Iframe中显示出来。


    JS:
    我这里的逻辑是首先选中一个文档触发预览事件,所以我需要有一条这样的代码:

    var DocID = getQueryString("DocID");
    
    function getQueryString(name) {
       var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
       var r = window.location.search.substr(1).match(reg);
       if (r != null) return unescape(r[2]); return null;
    }

    其次我需要向后台发送获取文档和处理文档的请求:

    function Preview(id) {
    
    var formData = new FormData();
    
     $.ajax({
         type: "post",
         url: '../Test.ashx?action=TestPreview&DocID=' + DocID,
         async: false,
         dataType: "json",
         data: formData,
         contentType: false,
         processData: false,
         success: function (result) {
          var dataStr = result.Data.split('|');
           if (dataStr[0] != "0") {
      $('#name').text(dataStr[1]);
      document.getElementById('myFrame').src = 
                                  '../WordFile' + dataStr[0] + '.html';
                $('#date').text(dataStr[2]);
                 myStyle();
                 YLID = dataStr[0];
               }
           },
     });
     }

    最后给我们的显示框设置一下高度和宽度

     function myStyle() {
         $("#main").width(960);
         $("#main").height($('#WordPreview').height() - 100);
         $('#content').height($('#main').height() - 50);
         $('#myFrame').width(580);
     }

    现在后台已经拿到我们的请求,并且根据url 解析出我们需要调用的方法
    action:TestPreview 和 DocID:DocID。

    下面的代码省略了try,catch,只展示了Try中的代码:

    //从Session中获取用户基本信息
    BLL.User user = context.Session["User"] as BLL.User;
    string id = context.Request["DateID"];
    int userId = user.UserID;
    string sql = "";
    string ext = "";
    string docName = "";
    string submitDate = "";
    byte[] bytes = { };
    
    //打开并连接数据库
    DBAccess DBA = new DBAccess();
    sql = string.Format(@"SELECT DocName,Length,IOStream,ModifyTime FROM dbo.TestWordInfo WHERE ID={0}", id);
    //获取文档的详细数据,包括保存在SQL中的文件二进制流
    DataTable dt = DBA.GetDataTable(sql);
    if (dt.Rows.Count > 0)
    {
        bytes = new byte[int.Parse(dt.Rows[0]["Length"].ToString())];
        //判断是doc还是docx
        ext = dt.Rows[0]["DocName"].ToString().EndsWith(".doc") ? ".doc" : ".docx";
        //将二进制流保存在byte[]数组中
        bytes = (byte[])dt.Rows[0]["IOStream"];
        string[] docStr = dt.Rows[0]["DocName"].ToString().Split('.');
        docName = docStr[0];
    }
    
    if (bytes.Length > 0)
    {
        //这一步就是具体的格式转制过程(将在下面代码进行分析解释)
        putFile(context, bytes, id, ext);
    }
    else
    {
        id = "0";
    }
    result = id + "|" + docName + "|" + submitDate;

    这里我们基本上已经完成了一大半了,成功的把数据从数据库中读取出来了,接下来我们就会对这些数据进行相应的解析处理,使它们能够满足我们的需要在页面中进行展示。

    //传入四个基本参数
    public void putFile
    (HttpContext context, byte[] bytes, string id, String ext)
    {
        try
        {
            //根据相对路径创建临时文件目录
            string savePath = context.Server.MapPath("~/WeekReport/");
            if (!Directory.Exists(savePath))
            {
                Directory.CreateDirectory(savePath);
            }
            //向空的文件中写入数据流
            using (FileStream fs = new FileStream(savePath + id + ext, FileMode.Create))
            {
                fs.Write(bytes, 0, bytes.Length);
            }
            //使用Aspose.Words的功能配合"Save"进行Word文档到HTML页面的转制工作
            Aspose.Words.Document doc = new Aspose.Words.Document(savePath + id + ext);
            HtmlSaveOptions hso = new HtmlSaveOptions(SaveFormat.Html);
            string htmlPath = savePath + id + ".html";
            doc.Save(htmlPath, hso);
            //转制完成后,删除原有的Word文件
            DeleteFile(savePath + id + ext);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    
     public static void DeleteFile(string fileUrl)
     {
         if (System.IO.File.Exists(fileUrl))
         {
             System.IO.File.Delete(fileUrl);
         }
     }
    }

    注:在使用Aspose的时候别忘记引用这个库
    这里写图片描述


    最后回到前台页面中AJAX这一条语句:

    document.getElementById('myFrame').src = 
                                  '../WordFile' + dataStr[0] + '.html';

    这里写图片描述

    把转制的HTML页面放到IFrame中,这就形成了文档预览。

    小结:文档预览我们使用Iframe标签配合Aspose.Word来开发,还是有很多地方高度和宽度不匹配,以及Google不能很好的支持Iframe显示的问题,希望未来能解决。

    展开全文
  • java读写word文档,完美解决方案

    万次阅读 2018-05-15 11:04:36
    做项目的过程中,经常需要把数据里里的数据读出来,经过加工,以word格式输出。 在网上找了很多解决方案都太理想,偶尔发现了PageOffice,一个国产的Office插件,开发调用非常简单!比网上介绍的poi,jacob等解决...
  • Unity创建和修改本地Word文档

    千次阅读 2019-10-10 17:02:03
    最多搞个截图就行了,最近客户突然提出要将实验报告(UGUI,包括图片、按钮、输入框、文字等),这就有点懵,好在经过一段时间的研究,可以在Unity内通过NPOI类库(没听说的可以找度娘问一下)创建和修改Word文档,...
  • Word2007长篇文档录入

    2013-07-01 20:55:28
    主要内容包括:页面设置,设置样式,多级列表自动编号,使用题注和交叉引用,为奇数页/偶数页/封面设置不同的页眉,自动生成目录,文档打印等。 原始材料收集自网络,主要是针对Word2003的,本人将其改编成针对Word...
  • POI读取Word文档里面的数据

    千次阅读 2019-05-06 10:43:32
    POI在读docx文件的时候也有两种方式,通过XWPFWordExtractor和通过XWPFDocument。在XWPFWordExtractor读取信息时其内部还是通过XWPFDocument来获取的。 导包如下 <dependency> <groupId>org.apache....
  • 二.word Mammoth 旨在将 word文档 将其转换为 HTML。Mammoth 的目标是通过使用文档中的语义信息并忽略其他细节来生成简单干净的 HTML。 Mammoth.js 这个库同时支持 Node.js 和浏览器两个平台。 安装 npm ...
  • java生成word的几种方案 1、Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁。使用Jacob自带的DLL动态链接库,并通过JNI的方式实现了在Java平台上对COM程序的调用。DLL动态链接库的生成...
  • Java将数据写入word文档(.doc)

    千次阅读 2017-07-05 12:01:49
    本文主要讲了如何用Java将数据写入word文档:要用到poi包中的用HWPFDocument类。先是详细说明了将数据写入word文档的各个步骤,然后用代码实现。
  • 该特效提供一组预定义的样式,用于在WEB页面中生成各种尺寸的Word样式的文档效果。它提供的样式包括: sheets-of-paper-a4.css:A4纸(21cm × 29.7cm) sheets-of-paper-a3.css:A3纸(29.7cm × 42cm) sheets-of-...
  • (1)、设计一个学生类Student,包括数据成员:姓名、学号、二门课程(面向对象程序设计、高等数学)的成绩。 (2)、创建一个管理学生的类Management,包括实现学生的数据的增加、删除、修改、按课程成绩排序、保存...
  • C# + OpenXML 生成 Word 文档(VS2015)

    千次阅读 2019-07-11 22:25:11
    本文是 Open XML SDK 的入门文章,将逐步讲解如何生成一个下面这样的 Word 文档: 有关 Open XML SDK 的详细内容,请参阅这个链接:欢迎使用 Open XML SDK 2.5 for Office 创建示例程序 ...
  • 主要介绍 word 文档中插入图片、设置图片大小;插入表格、设置表格样式、字体样式;章节设置:页面大小、边距等;设置页眉页脚等方法。
  • 测试开发笔记

    万次阅读 多人点赞 2019-11-14 17:11:58
    读书选择 166 3.2.Counter 168 3.3:word中的判定表举例 169 3.4.合并判定表 170 3.4.密码修改 171 3.5.进销存 173 3.6.总结 175 因果图 176 4.1.字母判定 177 4.2.自动售货机 179 课前复习: 180 状态迁移 181 5.1....
  • Aspose.Words控件是一个类库,使您可以执行大部分文件处理的工作。...采用Aspose.Words您可以生成,修改,转换,渲染和打印,无需利用Microsoft Word 。Aspose.Words for .NET是一个无图形用户界面的.NET和JAVA Word
  • 一键批量打印EXCEL、WORD文档

    千次阅读 2017-10-24 09:49:00
    一键批量打印EXCEL、WORD文档,本方法也可以打印同一个文档N份,可以批量打印A3、A4文档,包括单、双面打印等。希望能帮到广大朋友。请大家注重原创版权,不得在未经许可的下转载、传播,或者用来对同事装逼等。。。...
  • Word、Excel、Powerpoint、PDF等文档的批量打印软件。 支持Word、Excel、PowerPoint、PDF等文档的批量打印,且可使用虚拟打印机将单个Office文档转换为单个PDF文档。...可以导入/导出文档打印列表,方便下次打印。
  • 可 轻 RUP 模版 测试计划 <项目名称> 测试计划 版本 <1.0> [注以下提供的模板用于 Rational Unified Process 其中包括用方括号括起来并以蓝色斜体样式=InfoBlue 显示的文本它们用于向作者提供指导在发布此文档...
  • ESP8266 wifi模块开发汇总

    千次阅读 多人点赞 2018-10-23 08:35:19
    ESP8266 wifi模块开发汇总 ... 这些问题主要包括以下几大类: 基本概念相关 ESP8266 相关 AiCloud 相关 固件编译调试相关 文档资料相关 以下是各分类的具体问题和解答。 基本概念相关 ESP8266是什...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,216
精华内容 14,486
关键字:

word文档打印方式不包括