当前位置: 首页 > 知识库问答 >
问题:

带有图像和文本的Apache Poi WORD段落

马和硕
2023-03-14

我试图使用APACHE POI创建一个段落,其中包含左边的图像和右边的一些文本。有什么方法可以设置这两个组件之间的对齐方式吗?

下面是在表中执行我想要的操作的代码,但它也呈现了这两个段落。

public void createWord() throws IOException, InvalidFormatException {

    XWPFDocument document = new XWPFDocument();
      XWPFTable table = document.createTable();
      FileOutputStream out = new FileOutputStream(new File("createdocument.docx"));
      File img = new File("C:\\Users\\r4rfgretg\\Pictures\\geregrg.png");
        XWPFParagraph imageParagraph = document.createParagraph();
        imageParagraph.setFontAlignment(ParagraphAlignment.CENTER.getValue());
        XWPFRun imageRun = imageParagraph.createRun();
        imageRun.addBreak();
        imageRun.addBreak();
        imageRun.addBreak();

        imageRun.addPicture(new FileInputStream(img), org.apache.poi.xwpf.usermodel.Document.PICTURE_TYPE_PNG, "test",
                Units.toEMU(100), Units.toEMU(100));

        XWPFParagraph textParagraph = document.createParagraph();
        XWPFRun textRun = textParagraph.createRun();
        textRun.addBreak();
        textRun.addBreak();
        textRun.addBreak();
        imageRun.addBreak();
        imageRun.addBreak();
        imageRun.addBreak();
        textRun.setText("KOU323D342342OUMjuj43432424S");
        textRun.addBreak();
        textRun.addBreak();
        textRun.setText("1/1/2019                           1/1/2020");
        textRun.addBreak();
        textRun.addBreak();
        textRun.setText("GR123456789");

      XWPFTableRow tableRowOne = table.getRow(0);
      tableRowOne.getCell(0).setParagraph(imageParagraph);
      tableRowOne.addNewTableCell().setParagraph(textParagraph);

    document.write(out);
    out.close();
    System.out.println("createdocument.docx written successully");

}

提前谢谢你。

共有1个答案

蒯慈
2023-03-14

代码的主要问题是,它首先在XWPFDocument中创建XWPFPartage,然后将它们设置到XWPFTableCell中。但是XWPFTableCell包含它自己的主体,也可以包含整个文档的内容。因此,在此之后,该段落位于文档体和表格单元格体中。所以别这么做。相反,如果需要,从XWPFTableCell中获取XWPFPartage或在XWPFPartage中创建XWPFPartage

一般来说,您的要求“左边有一个图像,右边有一些文本”可以通过两种方式实现。它可以用一张表来实现,就像你试过的那样。但它也可以只用一个段落来实现,正如你在问题的标题中所说的那样。这一段必须包含制表位设置,然后运行必须由制表符拆分。

下面的代码显示了这两种解决方案:

import java.io.FileOutputStream;
import java.io.FileInputStream;

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

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTabStop;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTabJc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth;

import java.math.BigInteger;

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

  String text = "Text";
  String imgFile="Koala.png";
  int twipsPerInch = 1440; //measurement unit for table cell width and tab stop pos is twips (twentieth of an inch point)

  XWPFDocument document = new XWPFDocument();
  XWPFParagraph paragraph = document.createParagraph();
  XWPFRun run = paragraph.createRun(); 
  run.setText("Image on the left and text on the right");

  paragraph = document.createParagraph();
  run = paragraph.createRun(); 
  run.setText("First using a table:");

  //create table
  XWPFTable table = document.createTable();
  table.setWidth(6*twipsPerInch);
  //create CTTblGrid for this table with widths of the 2 columns. 
  //necessary for Libreoffice/Openoffice to accept the column widths.
  //first column = 2 inches width
  table.getCTTbl().addNewTblGrid().addNewGridCol().setW(BigInteger.valueOf(2*twipsPerInch));
  //second column = 4 inches width
  table.getCTTbl().getTblGrid().addNewGridCol().setW(BigInteger.valueOf(4*twipsPerInch));
  //create first row
  XWPFTableRow tableRow = table.getRow(0);
  //first cell
  XWPFTableCell cell = tableRow.getCell(0);
  //set width for first column = 2 inches
  CTTblWidth tblWidth = cell.getCTTc().addNewTcPr().addNewTcW();
  tblWidth.setW(BigInteger.valueOf(2*twipsPerInch));
  //STTblWidth.DXA is used to specify width in twentieths of a point.
  tblWidth.setType(STTblWidth.DXA);
  //first paragraph in first cell
  paragraph = cell.getParagraphArray(0); if (paragraph == null) paragraph = cell.addParagraph();
  //first run in paragraph having picture
  run = paragraph.createRun();  
  run.addPicture(new FileInputStream(imgFile), XWPFDocument.PICTURE_TYPE_PNG, imgFile, Units.toEMU(100), Units.toEMU(100));
  //second cell
  cell = tableRow.addNewTableCell();
  cell.setText(text);

  paragraph = document.createParagraph();

//---------------------------------------------------------------------------------------------------

  paragraph = document.createParagraph();
  run = paragraph.createRun(); 
  run.setText("Second using tabulator having tab stops:");

  //create tab stop at 2 inches position
  paragraph = document.createParagraph();
  paragraph.setAlignment(ParagraphAlignment.LEFT);
  CTTabStop tabStop = paragraph.getCTP().getPPr().addNewTabs().addNewTab();
  tabStop = paragraph.getCTP().getPPr().getTabs().addNewTab();
  tabStop.setVal(STTabJc.LEFT);
  tabStop.setPos(BigInteger.valueOf(2 * twipsPerInch));
  //first run in paragraph having picture
  run = paragraph.createRun();  
  run.addPicture(new FileInputStream(imgFile), XWPFDocument.PICTURE_TYPE_PNG, imgFile, Units.toEMU(100), Units.toEMU(100));
  run.addTab();
  //second run 
  run = paragraph.createRun();  
  run.setText(text);

  FileOutputStream out = new FileOutputStream("CreateWordTabulatorAndTable.docx");
  document.write(out);
  out.close();
  document.close();

 }
}

结果:

 类似资料:
  • 我想创建一个带有JavaFX ChoiceBox的下拉菜单,其中每个条目由一个不同的图标组成,旁边有一个简短的文本。(例如,在语言选择器中,左边有一个小标志,右边有语言名称。) 做这件事最好的方法是什么? 我试着通过CSS来做。下面的几乎管用,但当然它会为所有条目设置相同的图标: 所以我想我可以通过或类似的方式为每个条目赋予自己的图标,但是我尝试的选择器都没有起作用。

  • 我的app里有一些这样的按钮: 我正在尝试创建一个带有文本和图标的按钮。Android:DrawableLeft对我不起作用(也许会,但我不知道如何设置图标的最大高度)。 所以我创建了一个包含ImageView和TextView的LinearLayout,并使其像一个按钮一样运行: 我的新按钮正是我想要的(字体大小,图标和文本放置)。但它看起来不像我的默认按钮: 所以我试着改变新按钮的背景和文本颜

  • 在这里,我将字段数据与FormUrlEncoded一起使用,但我必须在相同的API部分(“user\u image”)RequestBody文件中与多部分一起使用这两种数据。这怎么可能?提前谢谢。

  • 搜索了几个星期的网页,但不能找到满足我所有需求的答案(只有部分),帮助是非常欢迎的。 我想要的和已经完成的: 符合普通HTML5和CSS 在文章中显示图像 图像必须有标题 标题必须位于图像下方 标题必须限制在图像的水平大小 标题可能长于一行,文本应换行到下一行(仍在图像大小范围内) 图像和标题必须作为一组向左或向右浮动(请考虑使用 ) 文章文本必须环绕图像和标题 图像大小不同(第一个图像为200p

  • 我想包括使用FXML的图标和文本按钮。 我知道在FXML中,我可以用以下代码添加图像: 但我想知道如何将其与按钮代码合并:

  • 问题内容: 我正在尝试制作一个用于创建自定义卡片的应用。我想在自定义背景上添加一些文本(jpg图像)。 最好的方法是什么?在将卡片发送到服务器之前,我需要向用户显示该卡片的预览。 谢谢 问题答案: 使用下面的代码来满足您的要求 您必须在清单文件中使用以下权限。 对于我的设备,访问外部SD卡的路径可能会因其他设备而异。某些设备可能是用于内部SD卡的。在使用此代码之前,只需检查一下即可。 实际上,我为