使用Java保存Word文件(可运行的JAR)

时间:2016-08-26 15:28:40

标签: java file jar apache-poi

我正在尝试构建一个可以从Excel文件中读取信息并将数据放入文档的应用程序。该文档是一个带有列的模板形式。一切正常,直到保存部分。

它几乎就像我直接在IntelliJ中运行程序时那样工作。但是,当我使用Maven将应用程序安装到可运行的JAR时 - JAR将无法工作。

根据需要保存文件...但是如果我从JAR运行应用程序,则新文件不包含任何内容。当我直接在IntelliJ中运行时,新文件已经创建并打开,但是3列/行中只有2个包含数据。

我该怎么办?

链接到模板文档

http://www.labelmedia.de/englisch/doc/70%20x%2032%20mm%20-%20Art.%2088%2010%2027%2070%2032.doc

先谢谢你

package utils;

import model.Customers;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import java.awt.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;

public class WriteToDocument {
    String TARGET_FILE = "src\\main\\java\\utils\\template\\template.doc";
    private int postInList = 0;

    public WriteToDocument() {}

    public WriteToDocument(ArrayList<Customers> list) throws IOException {
        list.remove(0);

        HWPFDocument doc = null;
        try {
            doc = openDocument(TARGET_FILE);

            Range range = doc.getRange();
            TableIterator itr = new TableIterator(range);
            while (itr.hasNext()) {
                Table table = itr.next();
                for (int rowIndex = 0; rowIndex < table.numRows(); rowIndex++) {
                    TableRow row = table.getRow(rowIndex);
                    for (int colIndex = 0; colIndex < row.numCells(); colIndex++) {
                        TableCell cell = row.getCell(colIndex);

                        //WRITE IN TABLE //
                        if (postInList < list.size()) {
                            cell.getParagraph(0).replaceText(list.get(postInList).getName() + "\n\r" +
                                    "\n\r" + list.get(postInList).getAddress() + "\n\r" +
                                    list.get(postInList).getPostcode() + " " + list.get(postInList).getCity(), false);
                            postInList++;
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            saveDocument(doc);

        }
    }

    private HWPFDocument openDocument(String file) throws Exception {
        System.out.println("OPEN");
        return new HWPFDocument(new POIFSFileSystem(new FileInputStream(file)));
    }

    private static void saveDocument(HWPFDocument doc) throws IOException {
        System.out.println("SAVE");
        try (FileOutputStream out = new FileOutputStream(new File("test.doc"))) {
            doc.write(out);
            out.flush();
            System.out.println("File saved");
            doc.close();
            out.close();
            Desktop dt = Desktop.getDesktop();
            dt.open(new File("test.doc"));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        }
    }

堆栈跟踪

    java.io.FileNotFoundException: src\main\java\utils\template\template.doc (Det går inte att hitta sökvägen)
        at java.io.FileInputStream.open0(Native Method)
        at java.io.FileInputStream.open(Unknown Source)
        at java.io.FileInputStream.<init>(Unknown Source)
        at java.io.FileInputStream.<init>(Unknown Source)
        at utils.WriteToDocument.openDocument(WriteToDocument.java:56)
        at utils.WriteToDocument.<init>(WriteToDocument.java:25)
        at utils.ReadExcel.writeToDocument(ReadExcel.java:64)
        at utils.ReadExcel.<init>(ReadExcel.java:57)
        at MainFrameController$1.actionPerformed(MainFrameController.java:31)
        at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
        at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
        at java.awt.Component.processMouseEvent(Unknown Source)
        at javax.swing.JComponent.processMouseEvent(Unknown Source)
        at java.awt.Component.processEvent(Unknown Source)
        at java.awt.Container.processEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Window.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$500(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)
SAVE
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at utils.WriteToDocument.saveDocument(WriteToDocument.java:62)
        at utils.WriteToDocument.<init>(WriteToDocument.java:49)
        at utils.ReadExcel.writeToDocument(ReadExcel.java:64)
        at utils.ReadExcel.<init>(ReadExcel.java:57)
        at MainFrameController$1.actionPerformed(MainFrameController.java:31)
        at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
        at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
        at java.awt.Component.processMouseEvent(Unknown Source)
        at javax.swing.JComponent.processMouseEvent(Unknown Source)
        at java.awt.Component.processEvent(Unknown Source)
        at java.awt.Container.processEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Window.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$500(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)

1 个答案:

答案 0 :(得分:1)

在将其导出为JAR时,很可能缺少库。您正在使用Apache POI作为外部库。在IDE内部应用了所有库,但是在导出时,它们似乎丢失了。只需从命令提示符运行jar文件即可100%清楚该问题。在像NetBeans这样的IDE中,库被导出到一个名为lib的单独文件夹中,也可以查看与IDE类似的文件夹。