在poi中创建一个表非常简单,但它的教程非常有限,我找不到一个可以在生成docx文件的表中创建一个简单的合并单元格.
我已经在使用NPOI库创建Excel文档(这是POI Java项目的.NET版本),但现在我还想创建一个Word(Docx文档).
我想在文档中添加一个图像,但不知何故它不起作用.看起来它正在添加图像,但是当我打开下载的文档时
“The file <document filename> cannot be opened because there are problems with the contents”
这是在文档中添加图像的代码:
XWPFParagraph p2 = wordDoc.CreateParagraph();
XWPFRun r2 = p2.CreateRun();
r2.AddPicture(pictureData, (int)PictureType.PNG, "image1", 800, 600);
Run Code Online (Sandbox Code Playgroud)
其中pictureData是pictureData的memoryStream.memoryStrean是正确的,因为我可以从中获取base64字符串并显示正确的输出,但我想要的只是将此图像转换为word文档.
所以我的问题是,我错过了什么,我做错了什么?无法在XWPF文档中找到有关图像的任何文档.
提前致谢
如何在Java中使用POI中的XWPFTable合并2行或更多行(行跨度)上的单元格?
我知道如何在一行合并单元格,但我不知道它是如何做到的,我没有找到任何这样的例子.
提前致谢.
我已经阅读了许多与我的要求相关的博客和论坛,但到目前为止,我能够在我得到的所有帮助下为第一级生成子弹或编号.任何人都可以指导我如何使用apache poi创建多级编号.
想知道Apache POI XWPFDocument是否支持这样的功能?
以下是我的要求
编辑1:
这是我的示例代码,适用于单级编号
public class TestNumbering {
String fileName="";
InputStream in = null;
CTAbstractNum abstractNum = null;
public TestNumbering() {
try {
in = CreateWordDocument.class.getClassLoader().getResourceAsStream("numbering.xml");
abstractNum = CTAbstractNum.Factory.parse(in);
} catch (XmlException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public String createDocument(String fileName, String content) {
this.fileName=fileName;
XWPFDocument doc = new XWPFDocument();
doc.createNumbering();
XWPFNumbering numbering=null;
numbering=doc.createNumbering();
for(String value: content.split("@")) {
XWPFParagraph para = doc.createParagraph();
para.setVerticalAlignment(TextAlignment.CENTER);
para.setNumID(addListStyle(abstractNum, doc, numbering)); …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个包含一列的简单表格。
我创建一个新行,并在每行中创建一个新段落。问题是每一行都以一个空行开头 - 我猜是新段落创建了它。
我之前尝试设置间距、缩进等,但没有成功。
for (int i=0; i<questions.size(); i++) {
Question question = questions.get(i);
XWPFTableRow row = table.getRow(i);
XWPFTableCell cell = row.getCell(0);
XWPFParagraph paragraph = cell.addParagraph();
XWPFRun run = paragraph.createRun();
run.setText(question.getQuestion());
}
Run Code Online (Sandbox Code Playgroud)
新段落是否会创建新的空行?
该表看起来像这样:
上面是 .docx 的快照,下面是代码示例代码,我想a在它被替换后改变颜色@。r.setColor("DC143C")不起作用:
for (XWPFParagraph p : docx.getParagraphs()) {
List<XWPFRun> runs = p.getRuns();
if (runs != null) {
for (XWPFRun r : runs) {
String origText = r.getText(0);
if (origText != null && origText.contains("a")) {
origText = origText.replace("a", "@");
r.setText(origText, 0);
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我使用 apache-poi 突出显示 docx 中的句子。XWPFFieldRun我在下面编写了代码,如果我必须突出显示的句子中(或之前)没有该代码,则该代码有效。AXWPFFieldRun 可以是章节参考之类的东西。
private void highlightSentence(XWPFParagraph p, String sentence, HighlighterColor color, XWPFDefaultRunStyle defaultRunStyle) {
List<XWPFRun> oldRuns = new ArrayList<>(p.getRuns());
PositionInParagraph pos = new PositionInParagraph();
TextSegement searchText = p.searchText(sentence, pos);
while (searchText != null) {
int beginPosIndex = searchText.getBeginPos().getRun();
int endPosIndex = searchText.getEndPos().getRun();
int offsetRuns = highlightInvolvedRuns(beginPosIndex, endPosIndex, oldRuns, sentence, p, color, defaultRunStyle);
searchText = p.searchText(sentence, new PositionInParagraph(endPosIndex + offsetRuns + 1, 0, 0));
}
}
Run Code Online (Sandbox Code Playgroud)
如果 aXWPFFieldRun位于包含该句子的运行中,则该searchText方法不会在文本中找到该句子。如果 aXWPFFieldRun位于句子之前的 …
我们使用 Apache POI 来操作 Microsoft Word 文档。
到目前为止,我们可以使用以下 API 访问文档中所有必需的段落(包括页眉、页脚、表格)XWPFDocument
val allBodyElements = bodyElements
.plus(headerList.flatMap { it.bodyElements })
.plus(footerList.flatMap { it.bodyElements })
val allParagraphs = allBodyElements.flatMap {
when (it) {
is XWPFParagraph -> listOf(it)
is XWPFTable -> it.rows
.flatMap { row -> row.tableCells }
.flatMap { cell -> cell.paragraphs }
else -> emptyList()
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这遗漏了文本框中包含的段落。查看底层word/document.xml这些 TextBox 的嵌入方式如下:
<w:body>
<w:p>
<w:r>
<mc:AlternateContent>
<mc:Choice>
<w:drawing>
<wp:anchor>
<a:graphic>
<a:graphicData>
<wps:wsp>
<wps:txbx>
<w:txbxContent>
<!-- DESIRED PARAGRAPH -->
</w:txbxContent>
...
</mc:Choice> …Run Code Online (Sandbox Code Playgroud) 我想在 .doc 文件中查找两个关键字之间的文本内容,并有条件地呈现该文本内容或隐藏它。例如:
${if condition}Lorem Ipsum 是印刷和排版行业的简单虚拟文本。自 1500 年代以来,Lorem Ipsum 一直是行业标准虚拟文本${endif}
当我使用 Apache - POI 解析文档时,我希望能够以某种方式在文档中发现这些块引用 ${if condition} ${endif}之间的每个内容,并有条件地在我想要生成的下一个文档中呈现或不呈现它。
所以上面的文本经过我的解析后应该有以下两种不同的形式:
1) 满足条件时
Lorem Ipsum 是印刷和排版行业的简单虚拟文本。自 1500 年代以来,Lorem Ipsum 一直是行业标准虚拟文本
或者
2)如果不满足条件
Lorem Ipsum 只是虚拟文本
我尝试通过使用XWPFParagraph对象来做到这一点,XWPFRun但是这不是可靠的方法,因为在不可预测的条件下,运行可以在单词中间随机分割。
您能否提出任何可靠的方法来实现我的用例?提前致谢。
我试图为此搜索太多,但没有得到想要的结果。我正在使用 Apache POI 使用 XWPF 将特定数据从 Excel 工作表复制到 MS Word 2010 文件中的表格。我已经完成了。
我想做的最后一件事是为每个单元格添加一个小的左右边距,以便文本不会粘在单元格边框上。我在互联网上搜索了所有内容,但无法这样做。也许我错过了一些东西。