java 导出word锁定且部分内容解锁可编辑

使用 Apache POI 创建带编辑限制的 Word 文档

在日常工作中,我们可能需要生成一些带有编辑限制的 Word 文档,例如某些段落只能被查看,而其他段落可以自由编辑。本文介绍如何使用 Apache POI 创建这样的文档,并通过代码实现相应的编辑权限。

示例代码

以下代码演示了如何使用 Apache POI 设置 Word 文档的部分段落为只读,同时创建可以自由编辑的区域。

import org.apache.poi.wp.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.poi.poifs.crypt.HashAlgorithm;import java.io.FileOutputStream;
import java.util.Random;public class WordEditingRestriction {public static void main(String[] args) throws Exception {XWPFDocument document = new XWPFDocument();// 创建一个不可编辑的段落XWPFParagraph lockedParagraph = document.createParagraph();XWPFRun lockedRun = lockedParagraph.createRun();lockedRun.setText("本段已被程序锁定,解锁密码是000000。");// 创建可编辑区域createEditableRegion(document, "这是可以自由编辑的区域");// 再添加一个不可编辑的段落XWPFParagraph anotherLockedParagraph = document.createParagraph();XWPFRun anotherLockedRun = anotherLockedParagraph.createRun();anotherLockedRun.setText("这也是被锁定的内容。");// 设置文档编辑限制document.enforceReadonlyProtection("000000", HashAlgorithm.sha512);String outputPath = "/Users/wtm/Desktop/output/" + System.currentTimeMillis() + ".docx";try (FileOutputStream out = new FileOutputStream(outputPath)) {document.write(out);}System.out.println("Word document created with editing restrictions.");}/*** 创建可编辑区域。** @param document Word 文档对象* @param text     可编辑区域中的文本内容*/private static void createEditableRegion(XWPFDocument document, String text) {// 随机生成一个唯一的权限 IDString id = String.valueOf(new Random().nextInt());// 选择一个段落,创建运行对象并设置文本XWPFParagraph paragraph = document.createParagraph();XWPFRun run = paragraph.createRun();run.setText(text);// 获取段落和运行的底层 XML 节点Node paragraphNode = paragraph.getCTP().getDomNode();Node runNode = run.getCTR().getDomNode();// 添加权限开始标记CTPermStart permStart = paragraph.getCTP().addNewPermStart();permStart.setId(id); // 设置权限 IDpermStart.setEdGrp(STEdGrp.EVERYONE); // 设置编辑权限为所有人Node permStartNode = permStart.getDomNode();// 添加权限结束标记CTPerm permEnd = paragraph.getCTP().addNewPermEnd();permEnd.setId(id); // 设置权限 IDNode permEndNode = permEnd.getDomNode();// 将权限开始标记插入到段落节点中运行节点之前paragraphNode.insertBefore(permStartNode, runNode);// 将权限结束标记插入到段落节点中运行节点的下一个兄弟节点之前paragraphNode.insertBefore(permEndNode, runNode.getNextSibling());}
}

导出效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/489587.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【多模态文档智能】OCR-free感知多模态大模型技术链路及训练数据细节

目前的一些多模态大模型的工作倾向于使用MLLM进行推理任务,然而,纯OCR任务偏向于模型的感知能力,对于文档场景,由于文字密度较高,现有方法往往通过增加图像token的数量来提升性能。这种策略在增加新的语言时&#xff0…

docker快速实现ELK的安装和使用

目录 一、ELK功能原理 二、项目功能展示​ 三、日志查询展示​ 四、ELK安装步骤 1、创建elasticsearch、kibana、filebeat相关data、log、conf目录 2、进入/usr/local/elk目录,并创建一个docker网络 3、启动 elasticsearch容器 4、运行kibana容器 5、启动f…

windows下Qt5自动编译配置QtMqtt环境

原文链接:windows下Qt5自动编译配置QtMqtt环境(11)-CSDN博客 1、概述 Qt默认是不包含mqtt库的,如果需要使用到mqtt库就只能自己编译配置;网络所有的QtMqtt配置的文章都是编译完成手动复制,非常麻烦&#x…

动态高优先权优先进程调度

一、实验目的 目的:了解并掌握动态高优先权优先调度算法的理论,掌握动态优先权的设置方式。 任务:模拟实现动态高优先权优先的调度(若数值越大优先权越高,每运行一个时间单位优先权-n,若数值越小优先权越高…

编程考古-CPU(中)

P5:The First Pentium 奔腾 奔腾(Pentium)处理器于1993年首次亮相,标志着英特尔x86处理器家族的一个新时代的开始。它打破了以往80x86数字命名的传统,成为英特尔首个不沿用此命名规则的x86处理器。内部架构上,奔腾采用…

基于米尔全志T527开发板的OpenCV进行手势识别方案

本文将介绍基于米尔电子MYD-LT527开发板(米尔基于全志T527开发板)的OpenCV手势识别方案测试。 摘自优秀创作者-小火苗 米尔基于全志T527开发板 一、软件环境安装 1.安装OpenCV sudo apt-get install libopencv-dev python3-opencv 2.安装pip sudo apt…

《数据结构之美-- 单链表》

引言: 首先由上次我们实现的顺序表聊起,我们在实现顺序表的时候会发现,在每次插入数据时当空间不够时就会涉及到扩容,而顺序表的扩容一般都是呈二倍的形式来进行,因此这就有可能造成空间的浪费,那该如何解…

薄膜电容的种类与应用

聚酯电容 应用:对稳定性和损耗要求不高的低频电路 聚酯(涤纶)电容(CL)是用两片金属箔作电极,夹在极薄绝缘介质中,卷成圆柱形或扁柱形芯子介质是涤纶。聚酯电容的介电常数较大,体积…

YashanDB演讲实录|王南:YAC集群,核心平替

本文为“2024国产数据库创新生态大会”深算院首席产品官兼崖山科技副总裁王南的演讲实录分享,主题为 《YAC集群,核心平替》,欢迎阅读。 尊敬的各位领导、各位专家、各位来宾:大家下午好!我是王南。今天非常荣幸能够有…

51c大模型~合集89

我自己的原文哦~ https://blog.51cto.com/whaosoft/12815167 #OpenAI很会营销 而号称超强AI营销的灵感岛实测成效如何? OpenAI 是懂营销的,连续 12 天发布,每天一个新花样,如今刚过一半,热度依旧不减。 毫无疑问&…

细说Flash存储芯片W25Q128FW和W25Q16BV

目录 一、Flash存储芯片W25Q128FW 1、W25Q128硬件接口和连接 2、存储空间划分 3、数据读写的原则 4、操作指令 (1)“写使能”指令 (2)“读数据”指令 (3)“写数据”指令 5、状态寄存器SR1 二、Fl…

浩辰CAD教程004:柱梁板

文章目录 柱梁板标准柱角柱构造柱柱齐墙边绘制梁绘制楼板 柱梁板 标准柱 绘制标准柱: ①:点选插入柱子②:沿着一根轴线布置柱子③:指定的矩形区域内的轴线交点插入柱子 替换现有柱子:选择替换之后的柱子形状&#x…

关于Git分支合并,跨仓库合并方式

关于Git合并代码的方式说明 文章目录 关于Git合并代码的方式说明前情提要开始合并方式一:git merge方式二:git cherry-pick方式三:git checkout Git跨仓库合并的准备事项前提拉取源仓库代码 前情提要 同仓库不同分支代码的合并可直接往下看文…

Python Turtle 实现动态时钟:十二时辰与星空流星效果

在这篇文章中,我将带你通过 Python 的 turtle 模块构建一个动态可视化时钟程序。这个时钟不仅具备传统的时间显示功能,还融合了中国古代的十二时辰与八卦符号,并通过动态星空、流星效果与昼夜背景切换,为程序增添了观赏性和文化内…

鸿蒙NEXT开发案例:颜文字搜索器

【引言】 本文将介绍一个名为“颜文字搜索器”的开发案例,该应用是基于鸿蒙NEXT平台构建的,旨在帮助用户快速查找和使用各种风格的表情符号。通过本案例的学习,读者可以了解如何在鸿蒙平台上进行数据处理、UI设计以及交互逻辑的实现。 【环…

Linux进阶·如何在Ubuntu安装、调试、运行gcc/g++,以及如何进行多文件编译

目录 1. 简介 2. 安装gcc 3. gcc的编译流程 3.1 预处理 3.2 编译 3.3 汇编 3.4 链接 4. gcc相关参数 5. 多文件编译 6. gcc和g的区别 1. 简介 gcc是Linux下的编译工具集,是GNU Compiler Collection的缩写,包含gcc, g等编译器。这个工…

Python鼠标轨迹算法(游戏防检测)

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…

【新人系列】Python 入门(十六):正则表达式

✍ 个人博客:https://blog.csdn.net/Newin2020?typeblog 📝 专栏地址:https://blog.csdn.net/newin2020/category_12801353.html 📣 专栏定位:为 0 基础刚入门 Python 的小伙伴提供详细的讲解,也欢迎大佬们…

uni-app实现小程序、H5图片轮播预览、双指缩放、双击放大、单击还原、滑动切换功能

前言 这次的标题有点长,主要是想要表述的功能点有点多; 简单做一下需求描述 产品要求在商品详情页的头部轮播图部分,可以单击预览大图,同时在预览界面可以双指放大缩小图片并且可以移动查看图片,双击放大&#xff0…

计算机网络之传输层协议TCP

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 计算机网络之传输层协议TCP 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交流讨论💌 目…