11

我使用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);

但是这种方法不能正常工作。我可以将页面方向设置为横向,当我在代码中读取页面方向时,我得到横向。好的。但是,如果我打开保存的文档,我就有纵向格式。这个设置实际上不起作用。可能是什么问题呢?

作为一种解决方法,我不得不开始使用以横向或纵向格式手动创建的空白文档。但我想以所需的方向从头开始以编程方式创建文档。

例如,POI HSSF 和 XSSF具有在横向和纵向模式之间切换的功能。它是接口的setLandscape()方法org.apache.poi.ss.usermodel.PrintSetup

但是XWPForHWPF呢?

4

2 回答 2

18

你走在正确的道路上。将方向设置为横向描述了纸张的一般方向,但仍需要纸张的大小。您的 CTPageSz 对象还没有。

这意味着除了您的 setOrient 调用之外,您还需要 setW 和 setH。这些调用采用代表 1/20 点的 BigInteger。因此,对于景观 LETTER 类型的纸张,您只需:

pageSize.setW(BigInteger.valueOf(15840));
pageSize.setH(BigInteger.valueOf(12240));

为了让 Word 将其识别为横向,宽度必须大于高度。如果您希望它在打印时正常运行,您仍然希望保留 setOrient 调用。

这是来自https://www.gnu.org/software/gv/manual/html_node/Paper-Keywords-and-paper-size-in-points.html的一些常见纸张尺寸, 您应该将它们乘以 20在上述方法调用中使用

Letter       612x792
LetterSmall  612x792
Tabloid      792x1224
Ledger       1224x792
Legal        612x1008
Statement    396x612
Executive    540x720
A0           2384x3371
A1           1685x2384
A2           1190x1684
A3           842x1190
A4           595x842
A4Small      595x842
A5           420x595
B4           729x1032
B5           516x729
Folio        612x936
Quarto       610x780
10x14        720x1008
于 2014-06-30T23:58:44.693 回答
1

答案是对的。

我只需要添加额外的依赖项就可以访问 CTPageSz 类。

// SBT config
"org.apache.poi" % "poi-ooxml" % "4.1.0",     // Base library
"org.apache.poi" % "ooxml-schemas" % "1.4",   // required to access CTPageSz
于 2019-04-12T06:46:58.493 回答