当前位置: 首页 > news >正文

做自己的网站logo建筑外观设计网站

做自己的网站logo,建筑外观设计网站,网站需备案吗,网站做众筹需哪些条件java docx文档解析几个月前#xff0c;我需要创建一个包含许多表和段落的动态Word文档。 过去#xff0c;我曾使用POI来实现此目的#xff0c;但是我发现它很难使用#xff0c;并且在创建更复杂的文档时对我来说效果不佳。 因此#xff0c;对于这个项目#xff0c;经过一… java docx文档解析 几个月前我需要创建一个包含许多表和段落的动态Word文档。 过去我曾使用POI来实现此目的但是我发现它很难使用并且在创建更复杂的文档时对我来说效果不佳。 因此对于这个项目经过一番搜索我决定使用docx4j 。 Docx4j根据他们的网站是 “ docx4j是一个Java库用于创建和处理Microsoft Open XMLWord docxPowerpoint pptx和Excel xlsx文件。 它类似于Microsoft的OpenXML SDK但适用于Java。 ” 在本文中我将向您展示几个示例您可以使用这些示例来生成Word文档的内容。 更具体地说我们将看以下两个示例 加载模板Word文档以添加内容并另存为新文档 将段落添加到此模板文档 将表添加到此模板文档 这里的一般方法是首先创建一个Word文档其中包含最终文档的布局和主要样式。 在本文档中您将需要添加占位符简单字符串我们将使用这些占位符来搜索并替换为真实内容。 例如一个非常基本的模板如下所示 在本文中我们将向您展示如何填充此内容以便获得此信息 加载模板Word文档以添加内容并另存为新文档 首先是第一件事。 让我们创建一个简单的Word文档将其用作模板。 为此只需打开Word创建一个新文档并将其另存为template.docx。 这是我们用来向其添加内容的单词模板。 我们需要做的第一件事是用docx4j加载该文档。 您可以使用以下一段Java代码 private WordprocessingMLPackage getTemplate(String name) throws Docx4JException, FileNotFoundException {WordprocessingMLPackage template WordprocessingMLPackage.load(new FileInputStream(new File(name)));return template;} 这将返回一个Java对象该对象表示完整的此时空文档。 现在我们可以使用Docx4J API在此Word文档中添加删除和修改内容。 Docx4J有许多帮助程序类可用于遍历此文档。 我确实写了一些帮助程序尽管它们确实使查找特定的占位符并用实际内容替换它们非常容易。 让我们看看其中之一。 此操作是几个JAXB操作的包装使您可以搜索特定元素及其所有子元素来查找某个类。 例如您可以使用它来获取文档中的所有表表中的所有行等等。 private static ListObject getAllElementFromObject(Object obj, Class? toSearch) {ListObject result new ArrayListObject();if (obj instanceof JAXBElement) obj ((JAXBElement?) obj).getValue();if (obj.getClass().equals(toSearch))result.add(obj);else if (obj instanceof ContentAccessor) {List? children ((ContentAccessor) obj).getContent();for (Object child : children) {result.addAll(getAllElementFromObject(child, toSearch));}}return result;} 没什么复杂的但真的很有帮助。 让我们看看如何使用此操作。 在此示例中我们仅将简单的文本占位符替换为其他值。 例如这是您用来动态设置文档标题的内容。 不过首先在您创建的Word模板中添加一个自定义占位符。 我将为此使用SJ_EX1。 我们将用我们的名字替换这个值。 docx4j中的基本文本元素由org.docx4j.wml.Text类表示。 要替换此简单的占位符我们要做的就是调用此方法 private void replacePlaceholder(WordprocessingMLPackage template, String name, String placeholder ) {ListObject texts getAllElementFromObject(template.getMainDocumentPart(), Text.class);for (Object text : texts) {Text textElement (Text) text;if (textElement.getValue().equals(placeholder)) {textElement.setValue(name);}}} 这将查找文档中的所有Text元素并将匹配的元素替换为我们指定的值。 现在我们要做的就是将文档写回到文件中。 private void writeDocxToStream(WordprocessingMLPackage template, String target) throws IOException, Docx4JException {File f new File(target);template.save(f);} 如您所见并不难。 通过此设置我们还可以将更复杂的内容添加到Word文档中。 确定如何添加特定内容的最简单方法是查看word文档的XML源代码。 这将告诉您需要哪些包装器以及Word如何编组XML。 对于下一个示例我们将研究如何添加完整的段落。   将段落添加到此模板文档 您可能想知道为什么我们需要添加段落 我们已经可以添加文本了一个段落不只是一大段文本吗 好吧是的不是。 一段确实看起来像是一段很大的文字但是您需要考虑的是换行符。 如果您像以前一样添加Text元素并在文本中添加换行符则它们不会显示。 如果需要换行则需要创建一个新段落。 幸运的是使用Docx4j也很容易做到这一点。 我们将通过以下步骤进行操作 从模板中找到要替换的段落 将输入文本分成单独的行 对于每一行根据模板中的段落创建一个新段落 删除原始段落 我们应该已经拥有的辅助方法不应该太难了。 private void replaceParagraph(String placeholder, String textToAdd, WordprocessingMLPackage template, ContentAccessor addTo) {// 1. get the paragraphListObject paragraphs getAllElementFromObject(template.getMainDocumentPart(), P.class);P toReplace null;for (Object p : paragraphs) {ListObject texts getAllElementFromObject(p, Text.class);for (Object t : texts) {Text content (Text) t;if (content.getValue().equals(placeholder)) {toReplace (P) p;break;}}}// we now have the paragraph that contains our placeholder: toReplace// 2. split into seperate linesString as[] StringUtils.splitPreserveAllTokens(textToAdd, \n);for (int i 0; i as.length; i) {String ptext as[i];// 3. copy the found paragraph to keep styling correctP copy (P) XmlUtils.deepCopy(toReplace);// replace the text elements from the copyList texts getAllElementFromObject(copy, Text.class);if (texts.size() 0) {Text textToReplace (Text) texts.get(0);textToReplace.setValue(ptext);}// add the paragraph to the documentaddTo.getContent().add(copy);}// 4. remove the original one((ContentAccessor)toReplace.getParent()).getContent().remove(toReplace);} 在此方法中我们用提供的文本替换段落的内容然后将新段落替换为用addTo指定的参数。 String placeholder SJ_EX1;String toAdd jos\ndirksen;replaceParagraph(placeholder, toAdd, template, template.getMainDocumentPart()); 如果您在Word模板中使用更多内容来运行此程序则会注意到这些段落将出现在文档的底部。 原因是将段落添加回了主文档。 如果您希望将段落添加到文档中的特定位置通常需要这样做则可以将其包装在1×1无边界表格中。 该表被视为段落的父级可以在此处添加新段落。 将表添加到此模板文档 我想展示的最后一个示例是如何向单词模板添加表格。 实际上更好的描述是如何在Word模板中填充预定义的表格。 就像我们对简单的文本和段落所做的一样我们将替换占位符。 对于此示例向您的Word文档中添加一个简单的表格您可以随意设置样式。 向此表添加1个哑行用作内容模板。 在代码中我们将查找该行将其复制并将内容替换为来自Java代码的新行如下所示 查找包含我们的关键字之一的表 复制用作行模板的行 对于每行数据根据行模板向表中添加一行 删除原始模板行 与我们在段落中显示的方法相同。 首先让我们看一下如何提供替换数据。 对于此示例我仅提供了一组哈希图其中包含要替换的占位符的名称和要替换为其的值。 我还提供了可以在表格行中找到的替换令牌。 MapString,String repl1 new HashMapString, String();repl1.put(SJ_FUNCTION, function1);repl1.put(SJ_DESC, desc1);repl1.put(SJ_PERIOD, period1);MapString,String repl2 new HashMapString,String();repl2.put(SJ_FUNCTION, function2);repl2.put(SJ_DESC, desc2);repl2.put(SJ_PERIOD, period2);MapString,String repl3 new HashMapString,String();repl3.put(SJ_FUNCTION, function3);repl3.put(SJ_DESC, desc3);repl3.put(SJ_PERIOD, period3);replaceTable(new String[]{SJ_FUNCTION,SJ_DESC,SJ_PERIOD}, Arrays.asList(repl1,repl2,repl3), template); 现在这个replaceTable方法是什么样的。 private void replaceTable(String[] placeholders, ListMapString, String textToAdd,WordprocessingMLPackage template) throws Docx4JException, JAXBException {ListObject tables getAllElementFromObject(template.getMainDocumentPart(), Tbl.class);// 1. find the tableTbl tempTable getTemplateTable(tables, placeholders[0]);ListObject rows getAllElementFromObject(tempTable, Tr.class);// first row is header, second row is contentif (rows.size() 2) {// this is our template rowTr templateRow (Tr) rows.get(1);for (MapString, String replacements : textToAdd) {// 2 and 3 are done in this methodaddRowToTable(tempTable, templateRow, replacements);}// 4. remove the template rowtempTable.getContent().remove(templateRow);}} 该方法查找表获取第一行并为每个提供的映射向表添加新行。 返回之前它将删除模板行。 此方法使用两个帮助器addRowToTable和getTemplateTable。 我们首先来看最后一个 private Tbl getTemplateTable(ListObject tables, String templateKey) throws Docx4JException, JAXBException {for (IteratorObject iterator tables.iterator(); iterator.hasNext();) {Object tbl iterator.next();List? textElements getAllElementFromObject(tbl, Text.class);for (Object text : textElements) {Text textElement (Text) text;if (textElement.getValue() ! null textElement.getValue().equals(templateKey))return (Tbl) tbl;}}return null;} 此函数只是查看表是否包含我们的占位符之一。 如果是这样则返回该表。 addRowToTable操作也非常简单。 private static void addRowToTable(Tbl reviewtable, Tr templateRow, MapString, String replacements) {Tr workingRow (Tr) XmlUtils.deepCopy(templateRow);List textElements getAllElementFromObject(workingRow, Text.class);for (Object object : textElements) {Text text (Text) object;String replacementValue (String) replacements.get(text.getValue());if (replacementValue ! null)text.setValue(replacementValue);}reviewtable.getContent().add(workingRow);} 此方法复制我们的模板并使用提供的值替换此模板行中的占位符。 该副本将添加到表中。 就是这样。 通过这段代码我们可以在Word文档中填写套利表同时保留表的布局和样式。 至此为止。 使用段落和表您可以创建许多不同类型的文档这与最常生成的文档类型非常匹配。 但是也可以使用这种相同的方法将其他类型的内容添加到Word文档中。 参考来自Smart Java博客的JCG合作伙伴 Jos Dirksen 使用docx4j以编程方式创建复杂的Word.docx文档 。 翻译自: https://www.javacodegeeks.com/2012/07/java-word-docx-documents-with-docx4j.htmljava docx文档解析
http://www.zqtcl.cn/news/931519/

相关文章:

  • ppt网站建设教育网站的建设
  • 文化馆网站建设情况网站建设建站公司
  • 自己怎么做dj 视频网站网站推广 济南
  • 2014网站怎么备案怎样建置换平台网站
  • 惠州网站建设信息嘉兴做网站软件
  • 如何做发表文章的网站淮安市建设工程质量监督站网站
  • 做洁净的网站太原便宜做网站的公司
  • 网站设计评级检索标准的网站
  • 做个网站每年都要交域名费吗html静态网页首页模板
  • 网站资源整合与建设wordpress固定链接设置后404
  • 网站历史快照seo推广方法
  • 做淘宝客的的网站有什么要求北京专业网站制作公司
  • 建设网站 知乎个人可以开发app软件吗
  • 网站如何后台管理北京正规网站建设有几种
  • 临沂网站排名高质量的中山网站建设
  • 响应式网站定制开发网络教育全程托管
  • 做网站中的剪辑图片龙岗网站
  • 建设购物网站的意义免费做外贸的网站平台
  • 长沙做电商网站设计重庆观音桥旅游攻略
  • 网站建设的目标与期望动漫设计与制作工资多少
  • 做网站找网站设计公司 长沙
  • 网站维护内容网站代码下载
  • 西安建设主管部门官方网站wordpress返回件
  • 建立免费空间网站南宁seo推广外包
  • 网站初期如何推广用秀米制作h5详细步骤
  • 做网站需要执照嘛开发 网站 团队
  • 怎么提交网站关键词包头人脸检测系统
  • 哪个网站开发是按月付费的婚纱摄影建设网站的目的
  • 站长之家app简单网站制作步骤
  • 网站开发与桌面应用开发wordpress if include