简体   繁体   English

根据Word文档大小Apache-POI,如何自动调整表并将表对齐到中心?

[英]How to auto fit table and aligning the table to center, according to Word Document Size Apache-POI?

How to make this table to auto-fit to document page width, when the column size increases, using apache-poi and aligning that table to center. 当列大小增加时,如何使用apache-poi并将该表对齐到中心,使此表自动适应文档页面宽度。

This code generates a word Document extracting data from Java to word file located in c drive. 此代码生成一个单词Document,将数据从Java提取到位于c盘中的word文件。 I have manually set width but it now works fine. 我有手动设置宽度,但它现在工作正常。 If would be valuable for me if proper guidance is provided 如果提供适当的指导,如果对我有价值

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();
}

} }

to set the table to auto fit , basically it's just extending the width to a specific size. 要将表设置为自动调整,基本上只是将宽度扩展到特定大小。 example

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);

as for aligning the table to the center 至于将桌子与中心对齐

CTJc jc = pr.addNewJc();        
jc.setVal(STJc.RIGHT);
pr.setJc(jc);

To set the width of a table: 要设置表格的宽度:

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

To set column width: 设置列宽:

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

If data increases in cell it effects the width of column ie column width also will increase so to avoid this kind of problems we need to check length of string value in cell and we need to add \\n (new line) in string by doing this we can set width of column. 如果单元格中的数据增加,它会影响列的宽度,即列宽也会增加,所以为了避免这种问题,我们需要检查单元格中字符串值的长度,我们需要在字符串中添加\\ n(新行)我们可以设置列的宽度。

In my project i have struggled alot to set column width and i have solved this issue by controlling data in cell. 在我的项目中,我已经努力设置列宽,我已经通过控制单元格中的数据解决了这个问题。

You can set the width of a table in percent of the actual page size. 您可以设置表格的宽度,以实际页面大小的百分比表示。 First, get the width of the page: 首先,获取页面的宽度:

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

Second step, get the margins of the page and calculate the effective page size: 第二步,获取页面的边距并计算有效页面大小:

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

Now, let's say you want the table to have a width of 60% of the effective page size. 现在,假设您希望表格的宽度为有效页面大小的60%。 Then you calculate the size for your table. 然后计算表格的大小。 (If you want the table to fit to the actual page size, simply use 1.0): (如果您希望表格符合实际页面大小,只需使用1.0):

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

Finally, set this size to your table: 最后,将此大小设置为您的表:

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

Hope this helps! 希望这可以帮助!

Best, Holger 最好,霍尔格

Just use "100%": 只需使用“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"));
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM