使用 apache poi 在文档 .docx 中创建文本框

2023-12-27

I want create a text box in a document .docx but I didn´t find a method that help me do it and any example. Someone know how can i do it?


插入真实的Word文本框不完全可能apache-poi到目前为止。一个真实的Word文本框包含在CTShape from schemasMicrosoftComVml or com.microsoft.schemas.vml。 XML 看起来像:

<w:r>
 <w:pict>
  <v:shape style="width:100pt;height:24pt">
   <v:textbox>
    <w:txbxContent>
     <w:p>
      <w:r>
       <w:t>The TextBox text...</w:t>
      </w:r>
     </w:p>
    </w:txbxContent>
   </v:textbox>
  </v:shape>
 </w:pict>
</w:r>

正如您在中看到的命名空间v:shape and v:textbox与其他人不同。

因此,如果我们了解并尊重这一点,我们目前可以插入这样的CTShape。但仅与文本内联。创建一个CTWrap据我所知,目前这是不可能的,因为CTWrap来自schemasMicrosoftComOfficeWord未在 poi-ooxml-schemas-3.13-*.jar 中提供,并且com.microsoft.schemas.vml and com.microsoft.schemas.officeooxml-schemas-1.3.jar 中的类需要org.apache.poi.POIXMLTypeLoader3.13 版本中未附带该版本。

内嵌文本框的示例:

import java.io.FileOutputStream;

import org.apache.poi.xwpf.usermodel.*;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPicture;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTxbxContent;

import schemasMicrosoftComVml.CTGroup;
import schemasMicrosoftComVml.CTShape;

import org.w3c.dom.Node;

public class CreateWordTextBox {

 public static void main(String[] args) throws Exception {

  XWPFDocument doc= new XWPFDocument();

  XWPFParagraph paragraph = doc.createParagraph();
  XWPFRun run=paragraph.createRun();  
  run.setText("The Body text: ");

  CTGroup ctGroup = CTGroup.Factory.newInstance();

  CTShape ctShape = ctGroup.addNewShape();
  ctShape.setStyle("width:100pt;height:24pt");
  CTTxbxContent ctTxbxContent = ctShape.addNewTextbox().addNewTxbxContent();
  ctTxbxContent.addNewP().addNewR().addNewT().setStringValue("The TextBox text...");

  Node ctGroupNode = ctGroup.getDomNode(); 
  CTPicture ctPicture = CTPicture.Factory.parse(ctGroupNode);
  run=paragraph.createRun();  
  CTR cTR = run.getCTR();
  cTR.addNewPict();
  cTR.setPictArray(0, ctPicture);
    
  doc.write(new FileOutputStream("WordTextBox.docx"));

 }
}

但是定位文本框架是可能的:

import java.io.FileOutputStream;

import org.apache.poi.xwpf.usermodel.*;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtContentBlock;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPBdr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBorder;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFramePr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STHAnchor;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVAnchor;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STXAlign;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STWrap;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBorder;
/*
To
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFramePr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STHAnchor;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVAnchor;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STXAlign;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STWrap;
the fully ooxml-schemas-1.3.jar is needed as mentioned in https://poi.apache.org/faq.html#faq-N10025
*/

import java.math.BigInteger;

public class CreateWordTextFrame {

 public static void main(String[] args) throws Exception {

  XWPFDocument doc= new XWPFDocument();

  XWPFParagraph paragraph = doc.createParagraph();
  XWPFRun run=paragraph.createRun();  
  run.setText("The body text:");

  CTSdtContentBlock ctSdtContentBlock = doc.getDocument().getBody().addNewSdt().addNewSdtContent();

  CTP ctP = ctSdtContentBlock.addNewP();
  ctP.addNewR().addNewT().setStringValue("The TextFrame text...");

  CTPPr ctPPr = ctP.addNewPPr();
  CTFramePr ctFramePr = ctPPr.addNewFramePr();
  ctFramePr.setHAnchor(STHAnchor.TEXT);
  ctFramePr.setVAnchor(STVAnchor.TEXT);
  ctFramePr.setXAlign(STXAlign.CENTER);
  ctFramePr.setWrap(STWrap.AROUND);
  ctFramePr.setW(BigInteger.valueOf(4000));
  ctFramePr.setHSpace(BigInteger.valueOf(400));

  CTPBdr ctPBdr = ctPPr.addNewPBdr();
  CTBorder ctBorder = ctPBdr.addNewLeft(); ctBorder.setColor("000000"); ctBorder.setVal(STBorder.SINGLE); ctBorder.setSz(BigInteger.valueOf(4)); ctBorder.setSpace(BigInteger.valueOf(7));
  ctBorder = ctPBdr.addNewRight(); ctBorder.setColor("000000"); ctBorder.setVal(STBorder.SINGLE); ctBorder.setSz(BigInteger.valueOf(4)); ctBorder.setSpace(BigInteger.valueOf(7));
  ctBorder = ctPBdr.addNewTop(); ctBorder.setColor("000000"); ctBorder.setVal(STBorder.SINGLE); ctBorder.setSz(BigInteger.valueOf(4)); ctBorder.setSpace(BigInteger.valueOf(7));
  ctBorder = ctPBdr.addNewBottom(); ctBorder.setColor("000000"); ctBorder.setVal(STBorder.SINGLE); ctBorder.setSz(BigInteger.valueOf(4)); ctBorder.setSpace(BigInteger.valueOf(7));

  paragraph = doc.createParagraph();
  run=paragraph.createRun();  
  run.setText("Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... ");
     
  doc.write(new FileOutputStream("WordTextFrame.docx"));

 }
}

这需要完整的 ooxml-schemas-1.3.jar,如中所述https://poi.apache.org/faq.html#faq-N10025 https://poi.apache.org/faq.html#faq-N10025.

Edit

如果我们降级到 ooxml-schemas-1.1.jar - 可从http://search.maven.org/#artifactdetails|org.apache.poi|ooxml-schemas|1.1|jar http://search.maven.org/#artifactdetails%7Corg.apache.poi%7Cooxml-schemas%7C1.1%7Cjar- 那么也可以使用免费的可定位文本框apache-poi版本 3.13。

import java.io.FileOutputStream;

import org.apache.poi.xwpf.usermodel.*;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPicture;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTxbxContent;

import schemasMicrosoftComVml.CTGroup;
import schemasMicrosoftComVml.CTShape;
import schemasMicrosoftComOfficeWord.CTWrap;
import schemasMicrosoftComOfficeWord.STWrapType;
/*
To 
import schemasMicrosoftComOfficeWord.CTWrap;
import schemasMicrosoftComOfficeWord.STWrapType;
ooxml-schemas-1.1.jar is needed - available from http://search.maven.org/#artifactdetails|org.apache.poi|ooxml-schemas|1.1|jar
*/

import org.w3c.dom.Node;

public class CreateWordTextBox {

 public static void main(String[] args) throws Exception {

  XWPFDocument doc= new XWPFDocument();

  XWPFParagraph paragraph = doc.createParagraph();
  XWPFRun run=paragraph.createRun();  
  run.setText("The Body text: ");

  CTGroup ctGroup = CTGroup.Factory.newInstance();

  CTShape ctShape = ctGroup.addNewShape();
  ctShape.addNewWrap().setType(STWrapType.SQUARE);
  ctShape.setStyle("position:absolute;mso-position-horizontal:center;margin-top:40pt;width:100pt;height:24pt");
  CTTxbxContent ctTxbxContent = ctShape.addNewTextbox().addNewTxbxContent();
  ctTxbxContent.addNewP().addNewR().addNewT().setStringValue("The TextBox text...");

  Node ctGroupNode = ctGroup.getDomNode(); 
  CTPicture ctPicture = CTPicture.Factory.parse(ctGroupNode);
  run=paragraph.createRun();  
  CTR cTR = run.getCTR();
  cTR.addNewPict();
  cTR.setPictArray(0, ctPicture);

  paragraph = doc.createParagraph();
  run=paragraph.createRun();  
  run.setText("Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... ");
     
    
  doc.write(new FileOutputStream("WordTextBox.docx"));

 }
}

Edit

使用电流apache poi 5.0.0以下是可能的:

import java.io.FileOutputStream;

import org.apache.poi.xwpf.usermodel.*;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPicture;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTxbxContent;

import com.microsoft.schemas.vml.CTGroup;
import com.microsoft.schemas.vml.CTShape;
import com.microsoft.schemas.office.word.CTWrap;
import com.microsoft.schemas.office.word.STWrapType;

import org.w3c.dom.Node;

public class CreateWordTextBox {

 public static void main(String[] args) throws Exception {

  XWPFDocument doc= new XWPFDocument();

  XWPFParagraph paragraph = doc.createParagraph();
  XWPFRun run=paragraph.createRun();  
  run.setText("The Body text: ");

  CTGroup ctGroup = CTGroup.Factory.newInstance();

  CTShape ctShape = ctGroup.addNewShape();
  ctShape.addNewWrap().setType(STWrapType.SQUARE);
  ctShape.setStyle("position:absolute;mso-position-horizontal:center;margin-top:40pt;width:100pt;height:24pt");
  CTTxbxContent ctTxbxContent = ctShape.addNewTextbox().addNewTxbxContent();
  ctTxbxContent.addNewP().addNewR().addNewT().setStringValue("The TextBox text...");

  Node ctGroupNode = ctGroup.getDomNode(); 
  CTPicture ctPicture = CTPicture.Factory.parse(ctGroupNode);
  run=paragraph.createRun();  
  CTR cTR = run.getCTR();
  cTR.addNewPict();
  cTR.setPictArray(0, ctPicture);

  paragraph = doc.createParagraph();
  run=paragraph.createRun();  
  run.setText("Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... ");

  FileOutputStream out = new FileOutputStream("WordTextBox.docx");
  doc.write(out);
  out.close();
  doc.close();

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

使用 apache poi 在文档 .docx 中创建文本框 的相关文章

随机推荐

  • ios 7 MKMapView 可拖动注释在地图滚动时更改其位置

    我正在将我的应用程序 MyWorld 更新到 iOS 7 该应用程序的功能之一是您可以在地图视图上拖动图钉 iOS7下好像坏了 重现问题的步骤 向地图添加注释 工作正常 移动注释 拖动 工作正常 滚动地图 问题 每当我滚动地图视图注释时 地
  • 具有验证错误样式的 WPF Datagrid 单元格

    当出现验证错误时 我试图更改 DataGridCell 在 WPF 工具包 DataGrid 中 的默认样式 默认为红色边框 我怎样才能放置自己的模板 Thanks 尝试这个
  • Node.js 中的批量请求

    我的程序正在与每秒仅接受约 10 个请求的 Web 服务进行通信 有时 我的程序会向 Web 服务发送超过 100 个并发请求 导致我的程序崩溃 如何将 Node js 中的并发请求限制为每秒 5 个 我正在使用请求库 IF EVENT A
  • javax.persistence.TransactionRequiredException:@Lock 注释上没有正在进行任何事务

    我面临着一个我以前从未遇到过的问题 我正在尝试使用 Lock on a repository避免并发问题的方法 我收到标题中描述的错误 数据库配置 Configuration EnableTransactionManagement Enab
  • ValidationSummary 显示重复消息

    如果两个文本框同时验证失败 则 ValidationSummary 会显示相同的消息两次 难道我做错了什么 或者我可以更改设置来隐藏重复的消息 我把它分解为最简单的例子 View model MyModel Html ValidationS
  • 如何在两个不同的 dplyr 输出上运行 chisq.test ,然后将其汇总在表中?

    我的问题与我不久前发布的一个问题有关here https stackoverflow com questions 26294297 how do you summarize columns based on unique ids witho
  • WebApi2 何时使用 OnAuthorizationAsync 与 OnAuthorization

    我们最近通过使用存储在 Azure Document DB 中的凭据实现自定义 AuthorizationFilterAttribute 来实现 API 身份验证 DocDB 要求一切都使用异步 通过实验我们发现WebApi2同步控制器将使
  • 如何使用现代 Spring Boot + Data JPA 和 Hibernate 设置生成 ddl 创建脚本?

    目前我使用的是默认的 SpringBootApplication具有以下属性的注释application properties spring datasource url jdbc mysql localhost dbname spring
  • 如何获取 dag 状态,例如运行或成功或失败

    我想知道dag的状态是运行还是失败还是成功 我通过 CL 参数气流触发器触发 dag 在执行作业后 我想知道运行的状态 我找不到任何办法 我尝试了气流 dag state 但它没有给出任何结果 如果一天中有多次运行来通过命令行参数或 pyt
  • 使用 mysql_query 成功但使用 mysqli_query 失败的注入攻击

    Update 对此有一些有启发性的回应 要点是mysql函数已被弃用 而且mysqli允许您使用准备好的语句 这很有意义 而且很有帮助 而在我看来 仅仅 使用 mysqli 既没有建设性 也没有帮助 任何时候在 SO 上询问 PHP 和 M
  • 如何让Sprite遵循贝塞尔曲线

    我对 Objective C 和 Sprite Kit 还很陌生 但我已经做了一段时间的游戏开发 我目前正在开发一款 2D 游戏 敌舰在屏幕上从右向左移动 我一直在关注游戏不同部分的教程 然后在必要时进行添加 我找到了一个教程 其中游戏中的
  • XQuery 不同值与 where 子句问题

    我对 XQuery 很陌生 所以如果我遗漏了什么 请原谅 我正在尝试提取元素的某些子节点不同的数据 以及某个同级节点等于某个预定义字符串的数据 for product in fn distinct values document cpwdo
  • C++ 中的指针使用 NULL 或 0(零)吗?

    在 C 的早期 当它固定在 C 之上时 您不能使用 NULL 因为它被定义为 void 0 您不能将 NULL 分配给除void 这使得它有点无用 在那些日子里 人们普遍认为你使用0 零 表示空指针 直到今天 我仍然继续使用零作为空指针 但
  • 基于服务器 url 路径的条件标头源

    Problem 我想为每种内容类型加载自定义头文件 categoryId 在我的 CMS 上 例如 如果网址是 action archive categoryId 1 我希望它包含我的 header medicine html 文件 我绝对
  • SQL:用查询分割逗号分隔的字符串列表?

    这是我的表结构 id PaymentCond 1 ZBE1 AP1 LST2 CC1 2 VB3 CC1 ZBE1 我需要拆分列PaymentCond 并且很乐意通过简单的 sql 查询来做到这一点 因为我不知道如何使用函数并且希望保持一切
  • 使用 Mono 将 C# .NET 应用程序移植到 OS X?

    好吧 伙计们 我正在编写一个我想要跨平台的应用程序 直到最近 我一直在尝试使用 C 在 Silverlight 中执行此操作 因为它也可以在 OS X 上运行 但由于我对 C 相当生疏 而且对 Silverlight 还很陌生 所以我遇到了
  • 在文件中查找模式并重命名它们[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我使用此命令查找具有给定模式的文件 然后将它们重命名为其他名称 find name GHBAG exec bash c echo
  • asp.net 中的 url.content

    MVC 中的 url content 我可以使用什么与 ASP NET Web 表单相同的功能 如果您需要一种接受相对路径并为 ASP NET Web 表单生成 URL 的方法 请参阅Page ResolveUrl or Page Reso
  • MAC OS X El Capitan 上的 Mono:LSOpenURLsWithRole

    我有一个 NET 软件 它在 Linux 和 MAC 上的 Mono 上运行 该软件打包为 appMacpack在 OSX Lion 下的 Mono 3 6 0 上 并使用 PackageMaker 创建了一个安装程序 它在所有新版本的 O
  • 使用 apache poi 在文档 .docx 中创建文本框

    I want create a text box in a document docx but I didn t find a method that help me do it and any example Someone know h