Aspose.Words for Java 体验

2023-05-16

公司中要做一些导出word的工作,经别人推荐,使用了Aspose.Words for Java ,感觉很好用,美中不足的地方就是,它是收费软件。

原理吗?比较常规,模板+入参==》aspose引擎==》生成文档。


在里,给大家提供一个简单的DEMO:


1、Maven依赖:

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <dependency>  
  2.         <groupId>com.aspose</groupId>  
  3.         <artifactId>aspose-words</artifactId>  
  4.         <version>14.9.0</version>  
  5.         <classifier>jdk16</classifier>  
  6.     </dependency>  

2、word模板:



3、把license文件放入classpath。如果没有license会有水印。如果不想购买,又想用,请自己想办法。


4、核心代码:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. import java.io.InputStream;  
  2. import java.util.HashMap;  
  3. import java.util.Iterator;  
  4.   
  5. import org.slf4j.Logger;  
  6. import org.slf4j.LoggerFactory;  
  7.   
  8. import com.aspose.words.Document;  
  9. import com.aspose.words.License;  
  10. import com.ths.platform.custom.util.Tool;  
  11.   
  12. public class RepDocTemplate {  
  13.   
  14.     // 默认没有license,会有水印文字  
  15.     private boolean isLicense = false;  
  16.   
  17.     // 初始化日志  
  18.     private static final Logger log = LoggerFactory  
  19.             .getLogger(RepDocTemplate.class);  
  20.   
  21.     /** 
  22.      * 私有构造,用户初始化License 
  23.      */  
  24.     public RepDocTemplate() {  
  25.         InputStream is = RepDocTemplate.class.getClassLoader()  
  26.                 .getResourceAsStream("license.xml");  
  27.         License aposeLic = new License();  
  28.         try {  
  29.             aposeLic.setLicense(is);  
  30.             isLicense = true;  
  31.         } catch (Exception e) {  
  32.             log.error("word模板破解失败!", e);  
  33.         }  
  34.     }  
  35.   
  36.     /** 
  37.      * 替换内容的主要操作 
  38.      *  
  39.      * @param input 
  40.      * @param output 
  41.      * @param datas 
  42.      */  
  43.     public void replaceDocTem(String input, String output,  
  44.             HashMap<String, Object> datas) {  
  45.   
  46.         if (isLicense) {  
  47.             try {  
  48.                 Document doc = new Document(input);  
  49.                 // 遍历要替换的内容  
  50.                 Iterator<String> keys = datas.keySet().iterator();  
  51.                 while (keys.hasNext()) {  
  52.                     String key = keys.next();  
  53.                     String value = String.valueOf(datas.get(key));  
  54.   
  55.                     // 对显示值得修改  
  56.                     if (Tool.isNull(value)) {  
  57.                         value = "";  
  58.                     }  
  59.                     value = value.replace("\r\n"" ");  
  60.   
  61.                     // 要求替换的内容是完全匹配时的替换  
  62.                     doc.getRange().replace("$" + key + "$", value, truefalse);  
  63.                 }  
  64.   
  65.                 // 替换保存后的内容  
  66.                 doc.save(output);  
  67.             } catch (Exception e) {  
  68.                 log.error(e.getMessage(), e);  
  69.             }  
  70.         }  
  71.     }  
  72.   
  73. }  

测试方法:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public void export_word() {  
  2.           
  3.         //准备数据,用于替换模板中的占位符  
  4.         //可以根据业务,从数据库中读取  
  5.         HashMap<String, Object> datas = new HashMap<String, Object>();  
  6.         datas.put("property_a""helloworld_a");   
  7.         datas.put("property_b""helloworld_b");   
  8.         datas.put("property_c""helloworld_c");   
  9.         datas.put("property_d""helloworld_d");   
  10.         datas.put("property_e""helloworld_e");   
  11.         datas.put("property_f""helloworld_f");   
  12.         datas.put("property_g""helloworld_g");   
  13.         datas.put("property_h""helloworld_h");   
  14.         datas.put("property_i""helloworld_i");   
  15.         datas.put("property_j""helloworld_j");   
  16.         datas.put("property_k""helloworld_k");   
  17.         datas.put("property_l""helloworld_l");   
  18.         datas.put("property_m""helloworld_m");   
  19.         datas.put("property_n""helloworld_n");   
  20.         datas.put("property_o""helloworld_o");   
  21.         datas.put("property_p""helloworld_p");   
  22.         datas.put("property_q""helloworld_q");   
  23.         datas.put("property_r""helloworld_r");   
  24.           
  25.           
  26.         String contextPath = request.getSession().getServletContext()  
  27.                 .getRealPath("/");  
  28.           
  29.         //模板文件名  
  30.         String docName="word_template.doc";  
  31.         //模板路径,示例写死饿,可以自行改为可配置的方式  
  32.         //String inPath = (PathUtil.webAppPath() + "/WEB-INF/office/word/").replace("/", File.separator)+ docName;  
  33.         String inPath = (contextPath + "solution/office/word/").replace("/", File.separator)+ docName;  
  34.         //生成word的名称  
  35.         String fileName = "word"+String.valueOf(System.currentTimeMillis())+".doc";  
  36.         //word生成路径  
  37.         String outPath = (contextPath + "solution/office/word-export/").replace("/", File.separator)+ fileName;  
  38.   
  39.         InputStream in = null;  
  40.         OutputStream out = null;  
  41.         byte[] buf = new byte[1024];  
  42.         int len = 0;  
  43.         try {  
  44.               
  45.             //传入参数,根据模板生成word  
  46.             RepDocTemplate doc = new RepDocTemplate();  
  47.             doc.replaceDocTem(inPath, outPath, datas);  
  48.   
  49.             //下载生成的word  
  50.             in = new FileInputStream(new File(outPath));  
  51.             response.setContentType("application/x-download;charset=UTF-8");  
  52.             response.setHeader("Content-Disposition""attachment; filename="  
  53.                     + URLEncoder.encode(fileName, "utf-8"));  
  54.             out = response.getOutputStream();  
  55.   
  56.             while ((len = in.read(buf)) > 0) {  
  57.                 out.write(buf, 0, len);  
  58.             }  
  59.   
  60.             in.close();  
  61.             out.flush();  
  62.             out.close();  
  63.         } catch (Exception e) {  
  64.             log.error(e.getMessage(), e);  
  65.         } finally {  
  66.             if (null != in) {  
  67.                 try {  
  68.                     in.close();  
  69.                 } catch (IOException e) {  
  70.                     e.printStackTrace();  
  71.                 }  
  72.             }  
  73.             if (null != out) {  
  74.                 try {  
  75.                     out.close();  
  76.                 } catch (IOException e) {  
  77.                     e.printStackTrace();  
  78.                 }  
  79.             }  
  80.         }  
  81.   
  82.     }  

5、结果




很简单,很强大。简单的东西一般都很强大。

想生成和操作内容复杂的word文档,请去参看官网,导出word,推荐使用Aspose.Words。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Aspose.Words for Java 体验 的相关文章

  • Java将字符串解析为double

    如何解析字符串中的这个 Double 00034800 变成 Double 值 最后两位数字实际上是小数点 所以我正在寻找的结果是348 00 是否有这样的格式可以与十进制格式一起使用 Well String s 00034800 doub
  • 非易失性领域的出版与阅读

    public class Factory private Singleton instance public Singleton getInstance Singleton res instance if res null synchron
  • Java 中的 <-- 是什么? [复制]

    这个问题在这里已经有答案了 我遇到了下面的片段 它输出到4 3 2 1 我从来没有遇到过 lt 在爪哇 Is lt 使 var1 的值变为 var2 的运算符 public class Test public static void mai
  • 为什么在 10 个 Java 线程中递增一个数字不会得到 10 的值?

    我不明白 a 的值为0 为什么 a 不是10 那段代码的运行过程是怎样的 是否需要从Java内存模型来分析 这是我的测试代码 package com study concurrent demo import lombok extern sl
  • 使用 Exec Maven 插件分叉 Java,而不使用“exec”目标

    来自文档 https www mojohaus org exec maven plugin exec exec在单独的进程中执行程序和Java程序 exec java在同一虚拟机中执行 Java 程序 我想 fork 一个 java 程序
  • 有人用过 ServiceLoader 和 Guice 一起使用吗?

    我一直想通过我们的应用程序 构建系统进行更大规模的尝试 但更高的优先级不断将其推到次要地位 这似乎是加载 Guice 模块的好方法 并且避免了关于 硬编码配置 的常见抱怨 单个配置属性很少会自行更改 但您几乎总是会有一组配置文件 通常用于不
  • 什么是内部类的合成反向引用

    我正在寻找应用程序中的内存泄漏 我正在使用的探查器告诉我寻找这些类型的引用 但我不知道我在寻找什么 有人可以解释一下吗 Thanks Elliott 您可以对 OUTER 类进行合成反向引用 但不能对内部类实例进行合成 e g class
  • JOOQ 忽略具有默认值的数据库列

    看来JOOQ完全忽略了数据库列的默认值 既不会更新 ActiveRecord 对象 也不会在 INSERT 时跳过此列 相反 它尝试将其设置为 NULL 这在 NOT NULL 列上失败 Example CREATE TABLE bug f
  • 如何使用 Java 引用释放 Java Unsafe 内存?

    Java Unsafe 类允许您按如下方式为对象分配内存 但是使用此方法在完成后如何释放分配的内存 因为它不提供内存地址 Field f Unsafe class getDeclaredField theUnsafe Internal re
  • ThreeTen 向后移植与 JSR-310 的比较

    由于某些原因 我们现在无法使用 java 8 我们仍然停留在 java 7 上 不过 我想使用新的JSR 310 date time APIs现在 使用官方向后移植 ThreeTen http www threeten org threet
  • 在光标所在行强制关闭!

    嘿 我正在尝试创建一个应用程序来查找存储在 SQlite 数据库中的 GPS 数据 但我面临一个问题 我构建了一个 DbAdapter 类来创建数据库 现在我尝试使用以下函数从另一个类获取所有数据上的光标 public Cursor fet
  • 在 Spring 中为 @Pathvariable 添加类级别验证

    在发布这个问题之前 我已经做了很多研究并尝试了很多可用的解决方案 这是我陷入的棘手情况 我有一个 Spring 控制器 它有多个请求映射 它们都有 PathVariables 控制器如下所示 Controller EnableWebMvc
  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • 类更改(例如字段添加或删除)是否保持 Serialized 的向后兼容性?

    我有一个关于 Java 序列化的问题 在这种情况下 您可能需要修改可序列化类并保持向后兼容性 我有丰富的 C 经验 所以请允许我将 Java 与 NET 进行比较 在我的Java场景中 我需要使用Java的运行时序列化机制序列化一个对象 并
  • 我们如何使用 thymeleaf 绑定对象列表的列表

    我有一个表单 用户可以在其中添加任意数量的内容表对象这也可以包含他想要的列对象 就像在 SQL 中构建表一样 我尝试了下面的代码 但没有任何效果 并且当我尝试绑定两个列表时 表单不再出现 控制器 ModelAttribute page pu
  • 用于请求带有临时缓存的远程 Observable 的 RxJava 模式

    用例是这样的 我想暂时缓存最新发出的昂贵的Observable响应 但在它过期后 返回到昂贵的源Observable并再次缓存它 等等 一个非常基本的网络缓存场景 但我真的很难让它工作 private Observable
  • Java 中清除嵌套 Map 的好方法

    public class MyCache AbstractMap
  • Selenium 单击在 Internet Explorer 11 上不起作用

    我尝试在 Internet Explorer 上单击 selenium 但它不起作用 我努力了element click moveToElement element click build perform javascript没事了 事实上
  • 关闭扫描仪是否会影响性能

    我正在解决一个竞争问题 在问题中 我正在使用扫描仪获取用户输入 这是 2 个代码段 一个关闭扫描器 一个不关闭扫描器 关闭扫描仪 import java util Scanner public class JImSelection publ
  • GAE 无法部署到 App Engine

    我正在尝试从 Eclipse 发布 Web 应用程序 我在 GAE 上创建了四个项目 可以通过登录我的帐户并查看控制台来查看它们 我已经改变了appengine web xml到项目的应用程序 ID 如果我将其更改为 GAE 上第一个创建的

随机推荐