ooxml-схемы, IntelliJ IDEA и NullPointerException - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь использовать некоторые функции, которые требуют jar ooxml-schemas, и даже после импорта библиотеки poi-ooxml и ooxml-schemas через Maven, я все еще получаю исключение NullPointerException в 13-й строке.Я использую IntelliJ IDEA 2017.

import java.io.*;
import java.math.BigInteger;
import org.apache.poi.util.Units;
import org.apache.poi.wp.usermodel.HeaderFooterType;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;

public class ASM {
    public static void main(String[] args) throws Exception {
        XWPFDocument document = new XWPFDocument();
        FileOutputStream out = new FileOutputStream(new File("AASM.docx"));
        CTSectPr sectPr = document.getDocument().getBody().getSectPr();
        CTPageSz pageSz = sectPr.getPgSz();
        double pageWidth = pageSz.getW().doubleValue();
        CTPageMar pageMar = sectPr.getPgMar();
        double pageMarginLeft = pageMar.getLeft().doubleValue();
        double pageMarginRight = pageMar.getRight().doubleValue();
        double effectivePageWidth = pageWidth - pageMarginLeft - pageMarginRight;
        //Header
        XWPFHeader header = document.createHeader(HeaderFooterType.DEFAULT);
        XWPFTable headerTable = header.createTable(1, 3);
        CTTblWidth width = headerTable.getCTTbl().addNewTblPr().addNewTblW();
        width.setType(STTblWidth.DXA);
        width.setW(new BigInteger(effectivePageWidth + ""));
        XWPFTableRow headerTableRowOne = headerTable.getRow(0);
        //Cell 0
        XWPFTableCell companyCell = headerTableRowOne.getCell(0);
        XWPFParagraph companyParagraph = companyCell.addParagraph();
        XWPFRun companyRun = companyParagraph.createRun();
        InputStream companyImageInputStream = new BufferedInputStream(new FileInputStream("20opy.png"));
        companyRun.addPicture(companyImageInputStream, Document.PICTURE_TYPE_PNG, "20opy.png", Units.toEMU(125), Units.toEMU(19));
        //Main Document
        XWPFParagraph paragraph = document.createParagraph();
        XWPFRun run = paragraph.createRun();
        run.setText("Hello world");
        run.addPicture(companyImageInputStream, Document.PICTURE_TYPE_PNG, "20opy.png", Units.toEMU(125), Units.toEMU(19));
        document.write(out);
        out.close();
        System.out.println("Finished");
    }
}

1 Ответ

0 голосов
/ 21 февраля 2019

A NullPointerException не может быть вызвано отсутствующими библиотеками.NPE возникает, если объект указывает на NULL, но код пытается каким-то образом использовать этот объект.

В вашем случае, если sectPr.getPgSz() выдает NPE, тогда sectPr равно null и т. Д. null.getPgSz() бросков NPE.

Почему sectPr равно null?Это потому, что document.getDocument().getBody().getSectPr() вернул null.И этого следовало ожидать, поскольку для вновь созданного XWPFDocument с использованием XWPFDocument document = new XWPFDocument(); не заданы никакие свойства раздела.Он полагается на настройки по умолчанию для приложения обработки текста, когда дело доходит до настроек раздела и / или страницы.

Очевидно, что вам всегда нужно проверять, есть ли уже CTSectPr в документе.И вы можете использовать их, только если они уже есть.В противном случае они должны быть созданы с использованием addNewSectPr.

Похоже, что вы хотите получить настройки страницы, чтобы установить ширину таблицы на effectivePageWidth.Но поскольку для вновь созданного XWPFDocument не заданы какие-либо свойства раздела, вам нужно сначала установить их сначала, вместо этого пытаясь получить то, чего не существует.

См. Примеры кода, в котором я использовал CTSectPr: https://stackoverflow.com/search?q=user%3A3915431+CTSectPr+

...