首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Apache poi :在docx文本框中旋转文本

Apache poi :在docx文本框中旋转文本
EN

Stack Overflow用户
提问于 2021-06-22 21:37:20
回答 1查看 68关注 0票数 0

客户要求将可编辑注释添加到由web应用程序自动生成的docx文档中。我通过在文档中添加一些可编辑的文本框来实现这个需求。现在,客户希望其中的一些注释具有垂直文本,但我找不到任何关于如何实现此功能的示例。我应该旋转文本框还是包含的文本?我应该使用哪个类?你能提供任何例子的链接吗,到目前为止我还没有找到任何链接?下面是我用来添加文本框的代码:

代码语言:javascript
运行
复制
try {
                    CTGroup ctGroup = CTGroup.Factory.newInstance();

                    CTRect ctRect = ctGroup.addNewRect();
                    ctRect.setStyle(
                              String.format(
                                      "position:absolute;width: %scm;"   
                                    + "height:%scm;" 
                                    + "top:%scm;"
                                    + "left:%scm;"
                                    + "mso-position-horizontal-relative:page;"
                                    + "mso-position-vertical-relative:page;",
                                    nota.getWordPosition().getWidth()/10,//mm->cm
                                    nota.getWordPosition().getHeight()/10,//mm->cm
                                    nota.getWordPosition().getY(),
                                    nota.getWordPosition().getX()
                            )
                      );
                      CTTxbxContent ctTxbxContent = ctRect.addNewTextbox().addNewTxbxContent();
                      String[] noteLines = nota.getDescription().split("\n|\r\n");
                      CTP noteCTP = ctTxbxContent.addNewP();
                      for(String line : noteLines){
                         CTR noteCTR = noteCTP.addNewR();
                         noteCTR.addNewT().setStringValue(line);
                         noteCTR.addNewCr();
                      }
                      
                      Node ctGroupNode = ctGroup.getDomNode(); 
                      CTPicture ctPicture = CTPicture.Factory.parse(ctGroupNode);
                      
                      XWPFRun noteRun = imageParagraph.createRun(); 
                      
                      CTR cTR = noteRun.getCTR();
                      cTR.addNewPict();
                      cTR.setPictArray(0, ctPicture);
                     
                      
                } catch (Exception e) {
                    logger.warn("failed to add a note " +  e.getMessage(),e);
                    throw new ReportGeneratorException("error adding note on pages " + nota.getPages() + "(id " + nota.getId() +")");
                }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-22 22:38:10

这将是CTTextbox的风格。在那里您可以设置"layout-flow:vertical;mso-layout-flow-alt:bottom-to-top".这意味着文本从下到上垂直排列。

代码语言:javascript
运行
复制
...
CTTextbox ctTextbox = ctRect.addNewTextbox();
ctTextbox.setStyle("layout-flow:vertical;mso-layout-flow-alt:bottom-to-top");
...

如何获取?创建默认文本框。使用Word图形用户界面打开该文件。根据需要设置文本方向。保存文件。解压缩*.docx并查看/word/document.xml。在那里你会发现:

代码语言:javascript
运行
复制
<w:pict>
 <v:rect style="position:absolute;...">
  <v:textbox style="...;layout-flow:vertical;mso-layout-flow-alt:bottom-to-top;...">
   <w:txbxContent>
    ...
   </w:txbxContent>
  </v:textbox>
 </v:rect>
</w:pict>

完整示例(使用apache poi 5.0.0测试并运行):

代码语言:javascript
运行
复制
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.CTRect;
import com.microsoft.schemas.vml.CTTextbox;
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();

  CTRect ctRect = ctGroup.addNewRect();
  //ctRect.addNewWrap().setType(STWrapType.SQUARE);
  ctRect.setStyle("position:absolute;mso-position-horizontal:center;margin-top:10pt;width:36pt;height:100pt");
  
  CTTextbox ctTextbox = ctRect.addNewTextbox();
  ctTextbox.setStyle("layout-flow:vertical;mso-layout-flow-alt:bottom-to-top");

  CTTxbxContent ctTxbxContent = ctTextbox.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();

 }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68084579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档