我刚刚发现Apache POI库对于使用Java编辑Word文件非常有用.具体来说,我想使用Apache POI的XWPF类编辑DOCX文件.我发现没有适当的方法/文档,我可以这样做.有人可以分步说明,如何替换DOCX文件中的一些文本.
**文本可以在行/段落或表格行/列中
提前致谢 :)
我正在使用POI创建一个docx生成器,并希望使用预定义的格式.
Word包括多种格式,如标题,标题1..10等.这些格式是在您使用Word创建的每个DOCX中预定义的.
我想在我的docx生成器中使用它们.我尝试了以下但是格式没有应用:
paragraph = document.createParagraph();
lastParagraph.setStyle("Heading1");
Run Code Online (Sandbox Code Playgroud)
我还尝试了"标题1","heading1"和"Heading1"作为样式,但它们都没有奏效.
该API文档不显示任何信息.
我分析了用Word 2007创建的docx文件,发现"Heading1"是正确的.不幸的是,样式没有在docx中定义.我是否必须手动创建此样式?
谁能指出我正确的解决方案?
我正在用apache-poi生成一个docx文件.在wordfile中,我添加了表,其列的宽度我希望看到固定.
目前,我使用此处描述的技术:http://apache-poi.1045710.n5.nabble.com/Is-there-a-way-set-set-the-width-of-a-column-in-XWPFTableCell -td5711491.html
基本上,这需要设置
cell.getCTTc().addNewTcPr().addNewTcW().setW(BigInteger.valueOf(cols[j]));
Run Code Online (Sandbox Code Playgroud)
在该列的每个单元格上.
问题是,当文件在MS Word中完美打开时,open office会以不同的方式将我设置的值解释为列宽.虽然MS Word显然假设20个点为单位,但开放办公室似乎使用点代替,因此当我在OO中打开生成的文档时,所有列都宽20倍.
通常当我在生成的输出中看到一些奇怪的东西时,我解压缩docx文件,查看值应该是什么并更改我的代码.但是开放式办公室似乎无法保存到docx,因此我无法更改OO中的值将其保存回来并查看Word是否仍然正确解释文档以便找到跨应用程序解决方案.
知道如何设置表格列的宽度,以便OO和MS Wordt同样解释它吗?
我正在尝试了解Apache POI的某些部分.例如,我试图从现有的docx文件中获取文本(或表格等).例如,XWPFDocument中有一个方法getParagraph(.. CTP p):
它返回"带有CTP类p的段落".但什么是CTP类?我查看了文档的xml结构,但没有找到类似的东西.因此,我不知道如何首先调用方法.对于相同的XWPFDocument,还有一个方法getTable(CTTbl CTTbl),它通过其CTtbl-Object返回一个表.
对于ooxml文档中的每个部分/类型的数据,似乎都有一个CP*,所以我想了解如何使用它们.此外,从文档中可以看出,这些方法似乎是获取元素而不将其粘贴到集合中或猜测其位置的唯一直接方法.
我想为使用apache poi-3.9创建的word文档设置页边距.我发现它可以使用,CTPageMar
但CTPageMar尚未解决.我正在使用apache poi-3.9
我试过这个
CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
CTPageMar pageMar = sectPr.addNewPgMar();
pageMar.setLeft(BigInteger.valueOf(720L));
pageMar.setTop(BigInteger.valueOf(1440L));
pageMar.setRight(BigInteger.valueOf(720L));
pageMar.setBottom(BigInteger.valueOf(1440L));
Run Code Online (Sandbox Code Playgroud) 我正在使用apache poi 3.8将值写入单词模板.我用单词文件(键)替换所需值的特定字符串,例如word文档有一个包含键%Entry1%的段落,我想用"Entry text line1 \nnew line"替换它.所有替换的键和值都存储在我的实现中的Map中.
Map<String, String> replacedElementsMap;
Run Code Online (Sandbox Code Playgroud)
HWPFDocument的代码是:
Range range = document.getRange();
for(Map.Entry<String, String> entry : replacedElementsMap.entrySet()) {
range.replaceText(entry.getKey(), entry.getValue());
}
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常,我只需要将\n放在换行符的输入字符串中.但是我找不到XWPFDocument的类似方法.我目前的XWPFDocument代码是:
List<XWPFParagraph> xwpfParagraphs = document.getParagraphs();
for(XWPFParagraph xwpfParagraph : xwpfParagraphs) {
List<XWPFRun> xwpfRuns = xwpfParagraph.getRuns();
for(XWPFRun xwpfRun : xwpfRuns) {
String xwpfRunText = xwpfRun.getText(xwpfRun.getTextPosition());
for(Map.Entry<String, String> entry : replacedElementsMap.entrySet()) {
if (xwpfRunText != null && xwpfRunText.contains(entry.getKey())) {
xwpfRunText = xwpfRunText.replaceAll(entry.getKey(), entry.getValue());
}
}
xwpfRun.setText(xwpfRunText, 0);
}
}
Run Code Online (Sandbox Code Playgroud)
现在"\n"-string不会导致回车,如果我使用, xwpfRun.addCarriageReturn();我只是在段落后得到一个换行符.我应该如何正确地在xwpf中创建新行?
当列大小增加时,如何使用apache-poi并将该表对齐到中心,使此表自动适应文档页面宽度.
此代码生成一个单词Document,用于将数据从Java提取到位于c盘中的word文件.我有手动设置宽度,但它现在工作正常.如果提供适当的指导,如果对我有价值
public Word2Doc() throws Exception {
System.out.println("This is Word To Document Class");
File file = null;
FileOutputStream fos = null;
XWPFDocument document = null;
XWPFParagraph para = null;
XWPFRun run = null;
try {
// Create the first paragraph and set it's text.
document = new XWPFDocument();
para = document.createParagraph();
para.setAlignment(ParagraphAlignment.CENTER);
para.setSpacingAfter(100);
para.setSpacingAfterLines(10);
run = para.createRun();
for(int i=1; i<=5; i++)
run.setText("Test Name \009\009\009 Value \t\t\t\t Normal Ranges\013\013");
run.addBreak(); // similar to new line
run.addBreak();
XWPFTable table = document.createTable(4, 3); …Run Code Online (Sandbox Code Playgroud) 在poi中创建一个表非常简单,但它的教程非常有限,我找不到一个可以在生成docx文件的表中创建一个简单的合并单元格.
我使用Apache POI XWPF来创建和处理MS Word文档.但我没有在文档中找到如何更改页面方向.
显然这种方式应该成功:
XWPFDocument doc = new XWPFDocument();
CTDocument1 document = doc.getDocument();
CTBody body = document.getBody();
if (!body.isSetSectPr()) {
body.addNewSectPr();
}
CTSectPr section = body.getSectPr();
if(!section.isSetPgSz()) {
section.addNewPgSz();
}
CTPageSz pageSize = section.getPgSz();
pageSize.setOrient(STPageOrientation.LANDSCAPE);
Run Code Online (Sandbox Code Playgroud)
但是这种方法不能正常工作.我可以将页面方向设置为横向,当我在代码中读取页面方向时,我会获得横向.行.但是,如果我打开保存的文件,我就是肖像格式.此设置实际上不起作用.可能是什么问题呢?
作为一种解决方法,我被迫开始使用横向或纵向格式手动创建的空白文档.但是我希望以所需的方向从头开始以编程方式创建文档.
例如,POI HSSF和XSSF具有在横向和纵向模式之间切换的功能.它是setLandscape()org.apache.poi.ss.usermodel.PrintSetup接口的方法.
但是,我们XWPF还是HWPF?
让我们回顾一下"docx"和"pictures"之间的关系:
据我了解,*.docx存储原始图片(将图片复制/粘贴到Word中时的图片).每次使用该图片时,Word都会对原始图片进行"链接".
但是,如果您对该图片进行一些更改(例如调整大小,裁剪或更改颜色)Word会记住您的更改,修改"链接"(添加一些特殊标记).这很棒,因为你永远不会失去你的画面质量!
让我们从*.docx文件中获取图片.为此,我使用此代码段:
XWPFDocument wordDoc = new XWPFDocument( pathToFile );
for (XWPFParagraph p : wordDoc.getParagraphs()) {
for (XWPFRun run : p.getRuns()) {
for (XWPFPicture pic : run.getEmbeddedPictures()) {
byte [] img = pic.getPictureData().getData()
File outputfile = new File ( pathToOutputFile );
BufferedImage image = ImageIO.read(new ByteArrayInputStream(img));
ImageIO.write(image , "png", outputfile);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是这样我从*.docx获得原始图片.例如,如果您从图片中裁剪出一个部分并给我剩下的部分,那么我总能找到整个图像outputfile.这不好.
有谁知道如何通过Word中有人对其进行的所有更改来获取图片?