精华内容
下载资源
问答
  • Java在线打开word文档实现手写批注

    千次阅读 2019-04-04 13:29:04
    有些OA系统会有用户在线对word文档添加手写批注的需求,这样的需求看似不好实现,其实是可以实现的。 但是这需要开发者具备将activex控件集成到Java环境的能力。对于大部分Java开发工程师来说,仅仅解决单一的功能...

    前言:

    有些OA系统会有用户在线对word文档添加手写批注的需求,这样的需求看似不好实现,其实是可以实现的。

    但是这需要开发者具备将activex控件集成到Java环境的能力。对于大部分Java开发工程师来说,仅仅解决单一的功能就要掌握activex控件,未免学习成本太大。

    所以我们今天就要介绍一个中间件技术——pageoffice,此中间件技术已经将 在web系统操作office文档的大部分功能整合完毕,大家只需要关注自己web系统的业务逻辑即可,学习成本低,且功能很丰富。下面我们来实战用pageoffice实现一下用Java语言在线打开word文档的同时,向word文档中添加手写批注的功能。

    先看效果:

    可以看到,文档在页面中打开的效果和本地office打开的效果差不多,且手写批注的功能也轻松的实现了。

     部署步骤(只需4步)

    1.官网http://www.zhuozhengsoft.com/dowm/下载集成文件,引入jar包,配置web.xml

    去刚才下载的集成文件中找到lib,将里面的内容放在项目web-inf的lib中引入jar包,然后将web.xml的pageoffice配置引入到自己项目的wb.xml中

    2.在父页面aaa.jsp(需要打开文档的页面)放一个a标签或者button

    写a标签之前先引入pageoffice需要的js文件

    <script type="text/javascript" src="/jquery.min.js"></script>
    <script type="text/javascript" src="/pageoffice.js" id="po_js_main"></script>

    然后添加a标签 

    <a href="javascript:POBrowser.openWindowModeless('Word.jsp' , 'width=1200px;height=800px;');">手写批注接口演示</a>

    3.在父页面同级目录下创建一个名为Word.jsp的文件

    <%@ page language="java"
    	import="java.util.*,com.zhuozhengsoft.pageoffice.*"
    	pageEncoding="utf-8"%>
    <%
    	//******************************卓正PageOffice组件的使用*******************************
    	PageOfficeCtrl poCtrl1 = new PageOfficeCtrl(request);
    	poCtrl1.setServerPage(request.getContextPath()+"/poserver.zz"); //此行必须
    	//隐藏菜单栏
    	poCtrl1.setMenubar(false);
    	//添加自定义按钮
    	
    	poCtrl1.addCustomToolButton("开始手写", "StartHandDraw()", 5);
    	poCtrl1.addCustomToolButton("设置线宽", "SetPenWidth()", 5);
    	poCtrl1.addCustomToolButton("设置颜色", "SetPenColor()", 5);
    	poCtrl1.addCustomToolButton("设置笔型", "SetPenType()", 5);
    	poCtrl1.addCustomToolButton("设置缩放", "SetPenZoom()", 5);
    	poCtrl1.addCustomToolButton("访问手写集", "GetHandDrawList()", 6);
    
    	
    	poCtrl1.webOpen("test.doc", OpenModeType.docNormalEdit, "张三");
    %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    	<head>
    		<title></title>
    
    		<script language="JavaScript">
    		
            //开始手写
            function StartHandDraw() {
                document.getElementById("PageOfficeCtrl1").HandDraw.Start();
            }
            //设置线宽
            function SetPenWidth() {
                document.getElementById("PageOfficeCtrl1").HandDraw.SetPenWidth(5);
            }
            //设置颜色
            function SetPenColor() {
    
                document.getElementById("PageOfficeCtrl1").HandDraw.SetPenColor(5292104);
            }
            //设置笔型
            function SetPenType() {
    
                document.getElementById("PageOfficeCtrl1").HandDraw.SetPenType(1);
            }
            //设置缩放
            function SetPenZoom() {
    
                document.getElementById("PageOfficeCtrl1").HandDraw.SetPenZoom(50);
            }
            //撤销最近一次手写
            function UndoHandDraw() {
    
                document.getElementById("PageOfficeCtrl1").HandDraw.Undo();
            }
            //退出手写
            function ExitHandDraw() {
    
                document.getElementById("PageOfficeCtrl1").HandDraw.Exit();
            }
            //访问手写集合
            function GetHandDrawList() {
    
                var handDrawList = null;
                var handDraw = null;
                handDrawList = document.getElementById("PageOfficeCtrl1").HandDraw;
                handDrawList.Refresh();
                document.getElementById("PageOfficeCtrl1").Alert("本文档共有 " + handDrawList.Count + " 个手写批示。");
                var i = 0; //索引从0开始
                for (i = 0; i < handDrawList.Count; i++) {
                    handDraw = handDrawList.Item(i);
                    handDraw.Locate();
                    document.getElementById("PageOfficeCtrl1").Alert("第" + handDraw.PageNumber + "页" + ", " + handDraw.UserName + ", " + handDraw.DateTime);
                }
            }
            
        </script>
    
    	</head>
    	<body>
    		<div
    			style="font-size: 12px; line-height: 20px; border-bottom: dotted 1px #ccc; border-top: dotted 1px #ccc; padding: 5px;">
    			<span style="color: red;">操作说明:</span>若想提前设置线宽、颜色、笔型、缩放等,可先点击自定义工具栏上的相应按钮,然后点击“开始手写”按钮。在尚未关闭手写工具栏时,点“撤销最近一次手写”按钮,可撤销最近一次的手写;点击“退出手写”按钮,可退出手写;还可点“设置线宽”、“设置颜色”等按钮对手写批注的颜色、线宽等进行再次设置。
    			<br />
    			关键代码:点右键,选择“查看源文件”,看js函数
    			<br />
    			<input id="Button3" type="button" value="设置线宽"
    				onclick="SetPenWidth()" />
    			<input id="Button4" type="button" onclick="SetPenColor()"
    				value="设置颜色" />
    			<input id="Button1" type="button" value="撤销最近一次手写"
    				onclick="UndoHandDraw()" />
    			<input id="Button2" type="button" onclick="ExitHandDraw()"
    				value="退出手写" />
    			<span style="background-color: Yellow;"></span>
    		</div>
    		<br />
    		<form id="form1">
    			<div style="height: 700px; width: auto;">
    				        <%=poCtrl1.getHtmlCode("PageOfficeCtrl1")%>
    			</div>
    		</form>
    	</body>
    </html>
    

    4.新建文件

    新建一个名为test.doc的word文件(如果新建的是docx文件就将第三步的poCtrl1.webOpen("test.doc", OpenModeType.docNormalEdit, "张三");代码改为poCtrl1.webOpen("test.docx", OpenModeType.docNormalEdit, "张三");

    将新建的test.doc文件放在Word.jsp同级目录下。

    本地打开test.doc文件,随意编辑一些内容,保存.

    然后启动项目直接访问aaa.jsp点击链接.此时会提示安装插件,点击安装成功后提示注册,填写相关信息,填写注册码Q37LN-W8NI-KFSQ-LEY3Y就可以打开文档.

    注意:此示例只演示了手写批注,没有实现保存功能.如果需要更丰富的功能,可以去pageoffice官网下载示例代码直接将samples4文件夹拷贝到Tomcat的webapps下,启动Tomcat,浏览器访问http://localhost:8080/Samples4/index.html,查看示例中的下面一个链接,直接看samples4文件夹下WordHandDraw文件夹里面的代码.

     

    刚开始接触pageoffice的话,也可以看视频快速上手http://www.zhuozhengsoft.com/Technical/

    如有侵权,请联系博主

    展开全文
  • 使用java获取word文档批注

    千次阅读 2019-01-24 16:17:10
    使用jar poi3.14 public class DocPostil{ private File file;... /** 批注内容数组 */ private XWPFComment[] comments;// /** 批注引用正文map,结构-&lt;批注Id,正文text&gt; */ ...

    使用jar poi3.14

    public class DocPostil{
    	private File file;
    	/** Word document */
    	private XWPFDocument docx;
    	/** 批注内容数组 */
    	private XWPFComment[] comments;//
    	/** 批注引用正文map,结构-<批注Id,正文text> */
    	private Map<String, String> commentRefs;// /** 日期格式化类型 */
    	private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    	/** 批注所引用正文装配Map完毕标识 */
    	private static final String COMMENT_REF_FILLED_OK = "OK";
    	/** 批注最大下标 */
    	private String maxCommentIndex;
    
    	/*
    	 * @param filePath Word文件路径
    	 */
    	public POI_S4_Test(String filePath) throws Exception {
    		file = new File(filePath);
    		initAttributes();
    	} 
    	
    	/*
    	 * 初始化成员变量
    	 * @throws Exception Word缺陷导入异常
    	 */
    	private void initAttributes() throws Exception {
    		try {
    			docx = new XWPFDocument(POIXMLDocument.openPackage(file
    					.getCanonicalPath()));
    			comments = docx.getComments();
    			maxCommentIndex = String.valueOf(comments.length - 1);
    			commentRefs = new HashMap<String, String>();
    			fillCommentRef(docx.getDocument().getDomNode(),
    					new StringBuilder(), new StringBuilder(),
    					new StringBuilder(), commentRefs);
    		} catch (Exception e) {
    			throw new Exception(new StringBuilder().append("Word文件格式错误")
    					.append("-").append(e.getMessage()).toString(), e);
    		}
    	}
    
    	/*
    	 * 获取批注内容
    	 */
    	public XWPFComment[] getComments() {
    		return comments;
    	}
    
    	public Map<String, String> getCommentRefs() {
    		return commentRefs;
    	}
    
    	/*
    	 * 获取日期格式化类型
    	 */
    	public SimpleDateFormat getSdf() {
    		return sdf;
    	}
    
    	/* 获取批注日期List */
    	public List<Date> getSubmitDateList() {
    		Map<String, Date> dateMap = new HashMap<String, Date>();
    		List<Date> dateList = new ArrayList<Date>();
    		try {
    			Iterator<POIXMLDocumentPart> iter = docx.getRelations().iterator();
    			do {
    				if (!iter.hasNext())
    					break;
    				POIXMLDocumentPart p = (POIXMLDocumentPart) iter.next();
    				String relation = p.getPackageRelationship()
    						.getRelationshipType();
    				if (relation.equals(XWPFRelation.COMMENT.getRelation())) {
    					CommentsDocument cmntdoc;
    					cmntdoc = Factory
    							.parse(p.getPackagePart().getInputStream());
    					List<CTComment> commentList = cmntdoc.getComments()
    							.getCommentList();
    					int len = commentList.size();
    					int j = 0;
    					while (j < len) {
    						CTComment ctcomment = commentList.get(j);
    						dateMap.put(ctcomment.getId().toString(), ctcomment
    								.getDate().getTime());
    						j++;
    					}
    				}
    			} while (true);
    		} catch (Exception e) {
    		}
    		if (dateMap != null) {
    			for (XWPFComment comment : comments) {
    				dateList.add(dateMap.get(comment.getId()));
    			}
    		}
    		return dateList;
    	}
    
    	/*
    	 * 获取批注作者List
    	 */
    	public List<String> getSubmitterList() {
    		List<String> list = new ArrayList<String>();
    		for (XWPFComment comment : comments) {
    			list.add(comment.getAuthor().trim());
    		}
    		return list;
    	}
    	/*
    	 * 组装批注引用文本Map,Map结构-<commentId,text>
    	 * @param node WordProcessingML node
    	 * @param id 批注ID
    	 * @param value 批注引用正文文本
    	 * @param convertOK 正文组装完毕标识 ,组装完毕 = "OK"
    	 * @param map 要填充的目标Map
    	 */
    	private void fillCommentRef(Node node, StringBuilder id,
    			StringBuilder value, StringBuilder convertOK,
    			Map<String, String> map) throws Exception {
    		// fillCommentRef方法要求所有参数不能为null,如果为null,抛出异常
    		if (!insureNotNull(node, id, value, convertOK, map)) {
    			throw new IllegalArgumentException(new StringBuilder()
    					.append(this.getClass().getName())
    					.append("fillCommentRef(").append(node).append(",")
    					.append(id).append(",").append(value).append(",")
    					.append(convertOK).append(",").append(map).append(")")
    					.toString());
    		}
    	
    		if ("w:t".equals(node.getNodeName()) && id.length() > 0) {
    			value.append(node.getFirstChild().getNodeValue());
    		} else if ("wp:docPr".equals(node.getNodeName()) && id.length() > 0) {
    			value.append("[").append(getAttribute(node, "name")).append("]");
    		} else if ("w:commentRangeStart".equals(node.getNodeName())) {
    			id.setLength(0);
    			id.append(getAttribute(node, "w:id"));
    			value.setLength(0);
    		} else if ("w:commentRangeEnd".equals(node.getNodeName())
    				&& id.length() > 0) {
    			if (id.toString().equals(getAttribute(node, "w:id"))) {
    				map.put(id.toString(), value.toString());
    				if (id.toString().equals(maxCommentIndex)) {
    					convertOK.setLength(0);
    					convertOK.append(COMMENT_REF_FILLED_OK);
    					id.setLength(0);
    					value.setLength(0);
    				}
    			}
    		}
    		if (node.hasChildNodes()) {
    			NodeList temp = node.getChildNodes();
    			for (int i = 0; i < temp.getLength(); i++) {
    				if (convertOK.toString().endsWith(COMMENT_REF_FILLED_OK)) {
    					break;
    				}
    				fillCommentRef(temp.item(i), id, value, convertOK, map);
    			}
    		}
    	}
    
    	/***
    	 * @param node
    	 *            当前的Node
    	 * @param attName
    	 *            要获取的属性名
    	 * @return 属性值,没有该属性时返回null
    	 */
    	private static String getAttribute(Node node, String attName) {
    		return (node.hasAttributes() && node.getAttributes().getNamedItem(
    				attName) != null) ? node.getAttributes().getNamedItem(attName)
    				.getNodeValue() : null;
    	}
    
    	/*
    	 * 确保此方法的所有参数均不为空
    	 * @param objects 对象参数
    	 * @return 所有参数均不为空返回true 否则为false
    	 */
    	private boolean insureNotNull(Object... objects) {
    		for (Object object : objects) {
    			if (object == null) {
    				return false;
    			}
    		}
    		return true;
    	}
    
    	public static void main(String[] args) throws Exception {
    		StringBuffer value = new StringBuffer();
    		POI_S4_Test wh = new POI_S4_Test(
    				"D:\\example.docx");
    		XWPFComment[] comments = wh.getComments();
    		Map<String, String> commenRefMap = wh.getCommentRefs();
    		List<Date> l = wh.getSubmitDateList();
    		SimpleDateFormat sdf = wh.getSdf();
    		XWPFComment comment;
    		for (int i = 0; i < comments.length; i++) {
    			comment = comments[i];
    			value.append("批注Id:").append(comment.getId()).append(", ")
    					.append("批注作者:").append(comment.getAuthor()).append(", ")
    					.append("批注日期:").append(sdf.format(l.get(i))).append(", ")
    					.append("批注内容:").append(comment.getText()).append(", ")
    					.append("批注引用正文:")
    					.append(commenRefMap.get(comment.getId()));
    			value.append("\n");
    		}
    		System.out.println(value);
    	}
    }
    

    以上代码仅供参考

    展开全文
  • 一、介绍 目前,我国加大了对电子政务的推广力度。信息管理软件技术因此被广泛应用,如:大家所...如果一项任务需要负责人,或需要相关人员签阅、修改、批复,或多人签阅、批注,一般的办公流程所提供的解决方案...

    一、介绍

            目前,我国加大了对电子政务的推广力度。信息管理软件技术因此被广泛应用,如:大家所熟悉的办公自动化(OA)、工作流管理、人事、资源管理等。这样的系统有一个共同点,。如果一项任务需要负责人,或需要相关人员签阅、修改、批复,或多人签阅、批注,一般的办公流程所提供的解决方案会让用户感到难以操作。特别是领导们很难参与使用。人们感叹:打印的纸张反而更多了,成本反而增加了!所以,真正的科学办公流程是需要由不同环节的人参与并协作快捷地完成的。在实际应用中,领导,或相关负责人需要对政务性文档进行手迹批注、圈阅、签字生效等这些很自然的现实问题,这就必然在线手写批注的技术来真正实现无纸化办公。

    二、方案

            pageoffice 的手写批注功能实现在线给 word 文档圈阅、签批。

    三、核心代码

    6121e30c3efceccc3649871ddeb9ebd2fc0.jpg

     

    四:具体的实现过程

    <%@ page language="java"
    	import="java.util.*,com.zhuozhengsoft.pageoffice.*"
    	pageEncoding="utf-8"%>
    <%
    	//******************************卓正PageOffice组件的使用*******************************
    	PageOfficeCtrl poCtrl1 = new PageOfficeCtrl(request);
    	poCtrl1.setServerPage(request.getContextPath()+"/poserver.zz"); //此行必须
    	//隐藏菜单栏
    	poCtrl1.setMenubar(false);
    	//添加自定义按钮
    	poCtrl1.addCustomToolButton("保存","Save()",1);
    	poCtrl1.addCustomToolButton("开始手写", "StartHandDraw()", 5);
    	poCtrl1.addCustomToolButton("设置线宽", "SetPenWidth()", 5);
    	poCtrl1.addCustomToolButton("设置颜色", "SetPenColor()", 5);
    	poCtrl1.addCustomToolButton("设置笔型", "SetPenType()", 5);
    	poCtrl1.addCustomToolButton("设置缩放", "SetPenZoom()", 5);
    	poCtrl1.addCustomToolButton("访问手写集", "GetHandDrawList()", 6);
    
    	poCtrl1.setSaveFilePage("SaveFile.jsp");
    	poCtrl1.webOpen("doc/template.doc", OpenModeType.docNormalEdit, "张三");
    %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    	<head>
    		<title></title>
    
    		<script language="JavaScript">
    		//保存
    		function Save() {
                document.getElementById("PageOfficeCtrl1").WebSave();
            }
            //开始手写
            function StartHandDraw() {
                document.getElementById("PageOfficeCtrl1").HandDraw.Start();
            }
            //设置线宽
            function SetPenWidth() {
                document.getElementById("PageOfficeCtrl1").HandDraw.SetPenWidth(5);
            }
            //设置颜色
            function SetPenColor() {
    
                document.getElementById("PageOfficeCtrl1").HandDraw.SetPenColor(5292104);
            }
            //设置笔型
            function SetPenType() {
    
                document.getElementById("PageOfficeCtrl1").HandDraw.SetPenType(1);
            }
            //设置缩放
            function SetPenZoom() {
    
                document.getElementById("PageOfficeCtrl1").HandDraw.SetPenZoom(50);
            }
            //撤销最近一次手写
            function UndoHandDraw() {
    
                document.getElementById("PageOfficeCtrl1").HandDraw.Undo();
            }
            //退出手写
            function ExitHandDraw() {
    
                document.getElementById("PageOfficeCtrl1").HandDraw.Exit();
            }
            //访问手写集合
            function GetHandDrawList() {
    
                var handDrawList = null;
                var handDraw = null;
                handDrawList = document.getElementById("PageOfficeCtrl1").HandDraw;
                handDrawList.Refresh();
                document.getElementById("PageOfficeCtrl1").Alert("本文档共有 " + handDrawList.Count + " 个手写批示。");
                var i = 0; //索引从0开始
                for (i = 0; i < handDrawList.Count; i++) {
                    handDraw = handDrawList.Item(i);
                    handDraw.Locate();
                    document.getElementById("PageOfficeCtrl1").Alert("第" + handDraw.PageNumber + "页" + ", " + handDraw.UserName + ", " + handDraw.DateTime);
                }
            }
            
        </script>
    
    	</head>
    	<body>
    		
    		<form id="form1">
    			<div style="height: 700px; width: auto;">
    				        <%=poCtrl1.getHtmlCode("PageOfficeCtrl1")%>
    			</div>
    		</form>
    	</body>
    </html>
    

    五:最终效果

    15111be9f3829d03de6c23a29649a442a91.jpg

    操作说明:若想提前设置线宽、颜色、笔型、缩放等,可先点击自定义工具栏上的相应按钮,然后点击“开始手写”按钮。在尚未关闭手写工具栏时,点“撤销最近一次手写”按钮,可撤销最近一次的手写;点击“退出手写”按钮,可退出手写;还可点“设置线宽”、“设置颜色”等按钮对手写批注的颜色、线宽等进行再次设置。

    六、注意事项

    具体的实现方法和其他功能 可以到 http://www.zhuozhengsoft.com/dowm/?v=4 下载完整的试用程序包,

    参考里面的Samples示例,

    d31ee8a728acfb2f60cf05aeed02cd61cec.jpg

     

    http://www.zhuozhengsoft.com/Technical/ 观看视频,快速了解 pageoffice 的集成方法

     

    转载于:https://my.oschina.net/u/3507515/blog/2999608

    展开全文
  • java解析word批注

    千次阅读 热门讨论 2018-08-30 14:42:12
    最近有一个需求,通过java读取word文档,获取里面的批注内容,批注的作者以及被批注的内容,被批注内容所在的章节数和页码数。poi提供的API都是英文的,而且针对word的操作并不是很完善,所以就自己总结了一下。 ...

    最近有一个需求,通过java读取word文档,获取里面的批注内容,批注的作者以及被批注的内容,被批注内容所在的章节数和页码数。poi提供的API都是英文的,而且针对word的操作并不是很完善,所以就自己总结了一下。之前写的有一点问题,最近又做了下优化,不过,目前还是仅支持word2007及以上版本的格式。

    首先,这里使用的是XWPFDocument对象来读取word文档的,XWPFDocument对象提供了一个方法,可以直接获取word文档里所有的批注:

    public XWPFComment[] getComments();
    

    返回的是一个数组,里面包含所有的批注对象。
    通过这种方式获取的XWPFDocument对象,其实是以一种xml格式,可以通过各种方式来验证。批注的格式为:

    <w:commentRangeStart w:id="0" /> 
    <w:t>正文文本</w:t>
    </w:r> 
    <w:commentRangeEnd w:id="0" />
    

    其中w:commentRangeStart表示标注的开始,w:commentRangeEnd表示标注结束了,w:t标签的值就是标注所引用的正文,w:id是标注的唯一标识。如果被引用的正文是图片的话,则标签为:

    <wp:docPr id="1" name="xxx" descr="yyy.png" />
    

    如果仅仅获取标注的信息的话,上面的内容已经足够了。下面介绍一下如何获取章节数和页码数。
    前提条件是整个word的格式正确,否则得不到想要的结果。另外,需要说明的是,因为页码是根据目录来的,所有如果说某一个章节跨页的话,获取的页码可能不准确,存在偏差。
    ##获取目录

    public List<XWPFParagraph> getParagraphs();
    

    通过上面的方法,对整个word文档逐行的进行解析,前面已经提到,解析到的对象是一种xml格式的数据,由各种标签控制着。

    public CTHyperlink[] getHyperlinkArray();
    

    如果所在的行是目录的话,会存在w:hyperlink标签,可通过上面的方法获取整个目录的内容,另外,还会存在w:anchor这样一个标签,也需要获取这个标签的值,因为这个值与下文的标题有关联,可通过这个值找到标题与目录的关联关系。

    CTR[] rArray = ctHyperlink.getRArray();
    
    for(CTR ctr : rArray) {
    	CTText[] tArray = ctr.getTArray();
    	for(CTText t : tArray) {
    			sb.append(t.getStringValue());
    	}
    }
    

    通过上面的方法可获取目录的内容。
    ##获取正文标题
    正文中的标题会有一个w:bookmarkStart标签标识,还有一个w:name标签,该标签的值与目录中的w:anchor的值一致,通过这个值,可以找到目录内容,从而得知该段落所在的章节数和页码数。

    public CTBookmark[] getBookmarkStartArray();
    

    可以通过上面的方法获取正文标题的内容。
    ##END
    上面这些方法已经足够完成需求了。可以先获取所有的标注,然后再解析word,在解析的过程中,保存章节数和页码数,最后通过标注的唯一标识id来封装最终的对象。

    章节数页码数作者批注内容批注引用正文
    1.13Steven_sf批注test
    关于word解析后的xml格式,里面还有很多标签可以使用,有兴趣的请自行了解。 [相关源码下载](https://download.csdn.net/download/steven_sf/11753038 "java poi读取word")
    展开全文
  • java word批注 Java 批注的允许的属性类型刻意非常严格,但是允许的类型也可以使用一些简洁的复合批注类型。 考虑教程站点中的示例注释: package annotation; @interface ClassPreamble { String author(); ...
  • java word批注 如果您一直在用Java编程并且使用诸如Spring和Hibernate之类的任何流行框架,那么您应该对使用注释非常熟悉。 当使用现有框架时,其注释通常就足够了。 但是,您是否发现需要创建自己的注释? 不久...
  • 后台代码 //在线打开预览文档 @RequestMapping("/fileview") public String fileview(Model model,String filepath,String sourceid) throws Exception{ filepath="关.doc"; //sourceid=new Base64Util()....
  • 我们都阅读过 JDK API,但是庞大的API文档是怎么生成的?有谁知道 如何能保持代码的修改与代码文档的同步?这就是 javadoc 的存在目的。 这个文档将详细讲解 代码注释 怎么成为代码说明文档
  • java实现查询Word是否包含批注和修订内容 1.业务需求发送邮件前确认附件word内容是否包含批注和修订内容如果包含不可发送邮件 2.前端代码如下 /获取发送邮件的信用评价报告word是否包含批注修订内容/ function ...
  • 用 pageoffice 实现文档的在线编辑以及文档流转 1: 流程 用修改无痕迹模式起草文件,各个领导批注自己意见的时候使用强制留痕模式打开,文员清稿的时候用核稿模式打开,还有最后只读模式打开发布的正式文件。其中...
  • 本文将通过Java程序代码来展示如何来获取Word批注所标注的文本和图片。这里使用的Word Jar包工具是Free Spire.Doc for Java,在pom.xml中按如下步骤配置内容: 内容如下: <repositories> <...
  • java实现导出Excel多行表头复杂模板 一般我们都会选择poi来导出,选择一个比较好的ExcelUtils 但是对于初学者而言不了解poi的,还需从poi API文档去学习,如果是自学的话更好,如果是公司安排的任务,没有接触过有...
  • POI_添加批注

    2019-02-14 18:37:09
    POI_添加批注
  • Java 给Word指定字符串添加批注。下面将通过Java代码来演示如何读取批注。 工具使用:Word类库(Free Spire.Doc for Java 免费版) Jar文件获取:可通过官网下载,下载后解压文件,并将lib文件夹下...
  • 项目里面要求Word文档接受修订,并要去掉批注,常见的工具库有POI和JXL,但有些功能不太强大,用起来也啰嗦,这里用Aspose.Words这个类库来实现一下。 文档链接 在这里 : ...
  • java poi 获取单元格批注信息

    千次阅读 2020-01-05 18:05:35
    //获取行 HSSFRow row = sheet.getRow(i); //获取单元格 HSSFCell cell = row.getCell(i); if(cell.getCellComment()!=null){ System.out.println(cell.getCellComment().getString().toString());...
  • 点击上方好好学java,选择星标公众号重磅资讯、干货,第一时间送达 今日推荐:分享一个牛逼的 Java 开源后台管理系统,不要造轮子了!个人原创+1博客:点击前往,查看更多 ...
  • 使用aspose-words.jar 实现word文件合并。开源版,下载后可一直使用 1、支持word文档内容部分替换 2、支持word内容合并,包含页眉、页脚、批注等信息 3、doc、docx文件均可支持 4、轻量级,引入jar 包即可引用
  • 该软件包提供了一些Java类,以帮助使用Java批注读取和写入CSV文件。 有关更多信息,请访问。 在源代码中,有一个。 可以在主页上找到在线文档,包括 。 源可以从。 Maven软件包通过发布 Javadocs: 享受,...
  • 需求: 根据学生的各项评价指标,分析计算并输出评价...由于使用纯html构建后生成的网页会带有网络样式,且前端工作量大,又freemark学习成本高,不太灵活,故采用常见poi来实现。 官网文档地址: http://dee...
  • VC读取Word文档中的批注内容 第一步 import office com对象库 Stdafx.h. #import "C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE14\MSO.dll" \ rename("RGB", "_OfficeRGB") #import "C:\Program ...
  • java文档注释和标题注释 Java 5 SE的许多出色功能之一是Annotations构造的引入。 注释是一些标签,可以将其插入到程序源代码中,以使用某种工具对其进行处理并使其变得有意义。 注释处理工具通常使用(Java 5 SE的...
  • 本文将介绍在Java程序中如何给Word文档中的指定字符串添加批注。前文中,主要介绍的是针对某个段落来添加批注,以及回复、编辑、删除批注的方法,如果需要针对特定关键词或指定字符串来设置批注,可以参考本文的方法...
  • POI解析Word批注信息

    千次阅读 2019-08-28 12:44:22
    前言:报告审批后,要求解析Word批注信息获取 作者、引用正文、批注内容 等信息入库,我这边额外加了回复对象(为后续考虑) 先上代码吧: /** * @author : weiheng * @version V1.0 * @date Date : 2019年08...
  • 批注是一种富文本注释,常用于为指定的 Excel 单元格添加提示或附加信息。 Free Spire.XLS for Java 为开发人员免费提供了在... 本文将介绍如何使用 Free Spire.XLS for Java 在 Excel 文档中添加,读取和删除批注。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,543
精华内容 1,417
关键字:

java实现文档批注

java 订阅