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 - 将无符号十六进制字符串解析为有符号长整型

    我有一堆十六进制字符串 其中之一是 d1bc4f7154ac9edb 这是 3333702275990511909 的十六进制值 如果执行 Long toHexString d1bc4f7154ac9edb 这与您得到的十六进制相同 现在
  • Selector.close() 是否关闭所有客户端套接字?

    我是 nio 套接字的新手 我已经使用 nio 套接字编写了一个服务器 现在我正在尝试编写关闭钩子以确保通过清理资源正常退出 我的问题是Selector close 方法关闭所有客户端套接字 如果没有 请告诉我如何访问所有客户端套接字 而无
  • Java:为什么.class文件中的方法类型包含返回类型,而不仅仅是签名?

    class 文件的常量池中有一个 NameAndType 结构 它用于动态绑定 该类可以 导出 的所有方法都被描述为 签名 返回类型 喜欢 getVector Ljava util Vector 当某些 jar 中方法的返回类型发生更改时
  • java中高效的输入流到字符串方法

    因此 我在 Java 中的 诚然非常简单 应用程序上运行探查器 令我惊讶的是 仅次于需要在时间上发出 HTTP 请求的方法的是我的方法 inputStreamToString方法 目前它的定义如下 public static String
  • Jenkins 未显示 Maven 编译器错误

    在 Jenkins 中构建多模块 maven 3 项目时 如果出现构建错误 我们会收到一条神秘消息 表明 Maven 编译器插件失败 这在上周才刚刚开始发生 INFO BUILD FAILURE INFO INFO Total time 1
  • 是否可以使用 Apache Tika 提取表信息?

    我正在寻找 pdf 和 MS Office 文档格式的解析器 以从文件中提取表格信息 当我看到 Apache Tika 时 正在考虑编写单独的实现 我能够从任何这些文件格式中提取全文 但我的要求是提取表格数据 我希望有 2 列采用键值格式
  • 我的 Kafka 流应用程序刚刚退出,代码为 0,什么也不做

    为了尝试 Kafka 流 我这样做了 public static void main String args final StreamsBuilder builder new StreamsBuilder final Properties
  • 扩展多个类

    我知道 Java 不支持多重继承 因为不允许扩展多个类 我只是想知道我的问题是否有解决方法 我有一个名为CustomAction需要扩展两个抽象类 BaseAction and QuoteBaseAction 我无法更改这些抽象类中的任何一
  • java绕中心旋转矩形

    我想围绕其中心点旋转一个矩形 它应该保留在应该绘制的位置并在该空间中旋转 这是我的代码 AffineTransform transform new AffineTransform transform rotate Math toRadian
  • BigDecimal汇总统计

    我有一个 BigDecimal 列表 List
  • javadoc 子集/java 库组织

    我自己从来没有运行过javadoc 无论是在命令行还是ant 的 javadoc 任务 http ant apache org manual Tasks javadoc html 我将使用 ant 我需要为我编写的库生成 javadoc 问
  • 为 REST API 生成 Swagger UI 文档

    我使用 Java 中的 JAX RS Jersey 开发了 REST API 我想为其转换 生成基于 Swagger 的 UI 文档 谁能以简单的方式告诉我如何做到这一点的精确 步骤 很抱歉 他们网站上给出的步骤对我来说有点模糊 有多种方法
  • 获取接收者的设备令牌以在 Firebase 中发送通知

    所以我正在学习如何使用 firebase 发送设备到设备的通知 我看到了这个answer https stackoverflow com a 42548586 5237289发送通知 看起来很简单 现在 我知道要获取发件人的令牌 它应该如下
  • 在 Eclipse RCP 应用程序中禁用插件贡献

    我经常遇到这个问题 但尚未找到解决方案 每当我编写一个新的基于 Eclipse RCP 的应用程序并包含来自 Eclipse 平台的插件时 我都会 继承 其中一些插件的 UI 贡献 大多数贡献 菜单项 键盘快捷键 属性页 都很有用 但有时我
  • Java 8:如何创建毫秒、微秒或纳秒的 DateTimeFormatter?

    我需要创建格式化程序来解析具有可选的毫秒 微米或纳秒分数的时间戳 例如 对于我的需求 我看到以下机会 DateTimeFormatter formatter new DateTimeFormatterBuilder append DateT
  • 在 Kotlin 中声明静态属性?

    My Java code public class Common public static ModelPengguna currentModelPengguna public class Common companion object v
  • 向Java类库添加函数

    我使用的 Java 类库在很多方面都不完整 有很多类我认为应该内置其他成员函数 但是 我不确定添加这些成员函数的最佳实践 让我们调用不足的基类A class A public A long arbitrary arguments publi
  • 为什么/何时应该使用泛型方法?

    学习Java的时候遇到过通用方法 public
  • FragmentMap + ActionBar 选项卡

    我一直在尝试插入一个MapView进入一个ActionBar Tab 但我什至无法解决问题 即使谷歌搜索 这是主要活动 Override public void onCreate Bundle savedInstanceState supe
  • MyBatis 枚举的使用

    我知道以前有人问过这个问题 但我无法根据迄今为止找到的信息实施解决方案 所以也许有人可以向我解释一下 我有一个表 状态 它有两列 id 和 name id是PK 我不想使用 POJO Status 而是使用枚举 我创建了这样一个枚举 如下所

随机推荐

  • ViewBinding - Jetpack 视图绑定委托封装及使用示例

    通过视图绑定功能 xff0c 您可以更轻松地编写可与视图交互的代码 在模块中启用视图绑定之后 xff0c 系统会为该模块中的每个 XML 布局文件生成一个绑定类 绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用 在大多数情况下
  • LiveData 的生命周期 - viewLifecycleOwner / this

    在给定所有者的生命周期内将给定的观察者添加到观察者列表中 事件在主线程上调度 如果 LiveData 已经有数据集 xff0c 它将被传递给观察者 方法 xff1a observe LifecycleOwner Observer 使用示例
  • 设计模式——生产者消费者模式

    1 基本概括 2 主要介绍 2 1 概念 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题 生产者和消费者彼此之间不直接通讯 xff0c 而通过阻塞队列来进行通讯 xff0c 所以生产者生产完数据之后不用等待消费者处理 xff
  • Arch linux安装deepin-wine和微信(wechat)

    一 保证有国内的镜像源 xff0c 不然下载很慢 xff0c 没有国内包的镜像源 xff0c 则软件列表会少很多国内的软件 如果没有国内镜像源 xff0c 请修改镜像源 sudo vim etc pacman d mirrorlist s
  • KVM虚拟化(一)

    一 KVM虚拟化架构 1 主流虚拟机架构 图中对比了几种主流虚拟化技术架构 xff1a ESXi Xen与KVM xff0c 其主要差别在与各组件 xff08 CPU 内存 磁盘与网络IO xff09 的虚拟化与调度管理实现组件有所不同 在
  • docker Centos 7 安装 xfce4 桌面 + x11vnc + novnc

    docker Centos 7 安装 xfce4 桌面 43 x11vnc 43 novnc 启动容器环境变量xfce4 桌面安装 启动 Xvfb安装 启动 xfce4 桌面 x11vnc安装 x11vnc启动 x11vnc novnc 上
  • linux C++ 环境下的ActiveMQ学习

    ActiveMQ 1 概述 ActiveMQ 是Apache出品 xff0c 最流行的 功能强大的即时通讯和集成模式的开源服务器 ActiveMQ 是一个完全支持JMS1 1和J2EE 1 4规范的 JMS Provider实现 提供客户端
  • LUbuntu16.10安装及自动使用root登录(Ubuntu类似)

    LUbuntu是一款新的轻量级Ubuntu发行版 xff0c 结合LXDE使得LUbuntu安装 运行速度极快 xff0c 硬件资源要求很低 xff0c 支持X86和ARM架构处理器 可以在http lubuntu net 根据自己电脑的系
  • 【源码分享】-wpf界面源代码分享

    好久以前做过一段时间的界面编程 C 43 43 C Wpf的都做过一点 xff0c 见 个人博客中UI类目 所以资料里面关于界面编程的代码会多一些 xff0c 有时间就整理发出来共享学习 13年的时候用WPF写过一个简单的小程序作爬虫来获取
  • 十大 Python GUI 框架比较

    图形用户界面 GUI 是任何 Web 应用程序中最重要的部分之一 有人会说最重要的部分 xff0c 因为今天的老练用户很快就会放弃可用性差的应用程序 Python 应用程序也是如此 新手 Python 程序员在掌握了 Python 编程的基
  • 如何用ps将图片修改成指定大小

    这篇文章主要介绍如何用ps将图片修改成指定大小 xff1a 一 按原像素比例 修改图片的尺寸 1 先来看看它原来的尺寸 xff0c 如图所示 500X481px 2 首先用ps将图片文件打开 xff0c 使用ps菜单命令 xff1a lt
  • docker 安装rabbitMQ(最详细)

    docker 安装rabbitMQ 1 rabbitMQ介绍 RabbitMQ是一套开源 xff08 MPL xff09 的消息队列服务软件 xff0c 是由 LShift 提供的一个 Advanced Message Queuing Pr
  • 阿里云-ECS云服务器跨地域部署k8s集群

    阿里云 ECS云服务器跨地域部署k8s集群 一 背景介绍二 环境准备2 1 ECS云服务资源清单2 2 K8s软件列表 三 阿里云ECS服务器网络问题3 1 问题阐述3 2 解决方案 四 服务节点调整 xff08 master xff0c
  • 代码命名规范是一种责任也是一种精神(工匠精神)

    代码命名规范之美 规范概述命名规范管理类命名BootstrapProcessorManagerHolderFactoryProviderRegistrarEngineServiceTask 传播类命名ContextPropagator 回调
  • Kubernetes集群搭建(高可用)附全自动脚本

    高可用Kubernetes集群搭建 一 前言介绍 1 1 重要概念 二 系统架构 2 1 架构基本需求 2 2 架构图 三 环境准备 3 1 云服务或虚拟机清单 3 2 网络配置 针对使用vmware虚拟机用户需要操作 3 3 虚拟机网络设
  • k8s 集群部署ingress-nginx

    k8s 集群部署ingress nginx 环境准备 helm方式安装ingress nginx master边缘节点 创建命名空间和部署ingress 第一个ingress 例子 查看ingress controller配置 其实就是对应
  • k8s 集群部署traefik

    k8s 集群部署traefik k8s 集群部署traefik 环境准备 下载traefik helm方式安装traefik master边缘节点 执行安装 查看安装结果 安装traefik dashboard dashboard安装和查看
  • Linux系统(Centos)安装tomcat和部署Web项目

    文章结构 1 准备工作 2 在Linux下安装Tomcat8 0 3 Linux中配置tomcat的服务器启动和关闭和配置tomcat的开机启动 4 给tomcat配置用户名和密码登录 5 使用IDEA打包Maven托管的WEB项目 6 将
  • 如何判断蓝牙设备类型

    我们在开发Android的蓝牙应用时 xff0c 可能需要知道扫描到的蓝牙设备是什么类型 xff0c 然后过滤掉不符合要求的设备 xff0c 只保留符合要求的设备 xff0c 例如我们在车载系统上开发蓝牙电话应用时 xff0c 我们希望只显
  • Aspose.Words for Java 体验

    公司中要做一些导出word的工作 xff0c 经别人推荐 xff0c 使用了Aspose Words for Java xff0c 感觉很好用 xff0c 美中不足的地方就是 xff0c 它是收费软件 原理吗 xff1f 比较常规 xff0