8

如何使该表自动适应文档页面宽度,当列大小增加时,使用 apache-poi 并将该表对齐到中心。

此代码生成一个 word 文档,将 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);

               table.setRowBandSize(1);
               table.setWidth(1);
               table.setColBandSize(1);
               table.setCellMargins(1, 1, 100, 30);

               table.setStyleID("finest");


               table.getRow(1).getCell(1).setText("EXAMPLE OF TABLE");
               table.getRow(2).getCell(1).setText("fine");
               XWPFParagraph p1 = table.getRow(0).getCell(0).getParagraphs().get(0);
               p1.setAlignment(ParagraphAlignment.CENTER);
                       XWPFRun r1 = p1.createRun();
                       r1.setBold(true);
                       r1.setText("Test Name");
                       r1.setItalic(true);
                       r1.setFontFamily("Courier");
                       r1.setUnderline(UnderlinePatterns.DOT_DOT_DASH);
                       r1.setTextPosition(100);

              //Locating the cell values
                        table.getRow(0).getCell(1).setText("Value"); 
                        table.getRow(0).getCell(2).setText("Normal Ranges"); 

                       table.getRow(2).getCell(2).setText("numeric values");

                        table.setWidth(120);

               file = new File("c:\\nwhpe.docx"); 
               if(file.exists())
                   file.delete();


               FileOutputStream out = new FileOutputStream(file);
               document.write(out);
               out.close();
           } 

       } 
public static void main(String ar[]) throws Exception{
    new Word2Doc();
}

}

4

4 回答 4

11

将表格设置为 auto fit ,基本上它只是将宽度扩展到特定大小。例子

CTTbl table        = poiTable.getCTTbl();
CTTblPr pr         = table.getTblPr();
CTTblWidth  tblW = pr.getTblW();
tblW.setW(BigInteger.valueOf(5000));
tblW.setType(STTblWidth.PCT);
pr.setTblW(tblW);
table.setTblPr(pr);

至于将表格与中心对齐

CTJc jc = pr.addNewJc();        
jc.setVal(STJc.RIGHT);
pr.setJc(jc);
于 2014-07-11T17:25:34.003 回答
6

只需使用“100%”:

package io.github.baijifeilong.excel;

import lombok.SneakyThrows;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFTable;

import java.io.FileOutputStream;

/**
 * Created by BaiJiFeiLong@gmail.com at 2019-08-21 13:49
 */
public class WordDemo {

    @SneakyThrows
    public static void main(String[] args) {
        XWPFDocument document = new XWPFDocument();
        XWPFTable table = document.createTable(3, 4);
        table.setWidth("100%");
        for (int i = 0; i < 3; ++i) {
            for (int j = 0; j < 4; ++j) {
                table.getRow(i).getCell(j).setText(String.format("%d:%d", i + i, j + 1));
            }
        }
        document.write(new FileOutputStream("hello.docx"));
    }
}
于 2019-08-21T06:19:01.807 回答
4

要设置表格的宽度:

  XWPFTable table = doc.createTable(nRows, nCols);
  table.getCTTbl().addNewTblPr().addNewTblW().setW(BigInteger.valueOf(10000));

要设置列宽:

cell.getCTTc().addNewTcPr().addNewTcW().setW(BigInteger.valueOf(2000));

如果单元格中的数据增加,它会影响列的宽度,即列宽也会增加,因此为了避免此类问题,我们需要检查单元格中字符串值的长度,我们需要通过这样做在字符串中添加 \n (新行)我们可以设置列的宽度。

在我的项目中,我一直在努力设置列宽,我通过控制单元格中的数据解决了这个问题。

于 2014-05-02T05:44:01.143 回答
3

您可以按实际页面大小的百分比设置表格的宽度。首先,获取页面的宽度:

CTSectPr sectPr = document.getDocument().getBody().getSectPr();
CTPageSz pageSize = sectPr.getPgSz();
double pageWidth = pageSize.getW().doubleValue();

第二步,获取页面边距,计算有效页面大小:

CTPageMar pageMargin = sectPr.getPgMar();
double pageMarginLeft = pageMargin.getLeft().doubleValue();
double pageMarginRight = pageMargin.getRight().doubleValue();
double effectivePageWidth = pageWidth - pageMarginLeft - pageMarginRight;

现在,假设您希望表格的宽度为有效页面大小的 60%。然后你计算你的桌子的大小。(如果您希望表格适合实际页面大小,只需使用 1.0):

double widthInPercent = 0.6;
int size = (int) (effectivePageWidth * widthInPercent);

最后,将此大小设置为您的表:

CTTblWidth width = table.getCTTbl().addNewTblPr().addNewTblW();
width.setType(STTblWidth.DXA);
width.setW(new BigInteger(size + ""));

希望这可以帮助!

最好的,霍尔格

于 2018-10-09T09:52:48.580 回答