Создание таблиц в файле MS Word с использованием Java - PullRequest
5 голосов
/ 30 декабря 2008

Я хочу создать таблицу в файле Microsoft Office Word, используя Java. Кто-нибудь может сказать мне, как это сделать на примере?

Ответы [ 9 ]

5 голосов
/ 30 декабря 2008

Посмотрите на Apache POI

Проект POI является главным проектом для разработки чистых портов Java файла форматы на основе Microsoft OLE 2 Сложный формат документа. OLE 2 Составной формат документа используется Документы Microsoft Office, а также программами, использующими наборы свойств MFC для сериализовать свои объекты документов.

2 голосов
/ 30 декабря 2008

Я никогда не видел, чтобы это было сделано, и я много работаю в Word. Если вы действительно хотите сделать что-то программно в текстовом документе, я бы посоветовал использовать язык сценариев Microsoft VBA, специально разработанный для этой цели. На самом деле, я сейчас над этим работаю.

Если вы работаете в Open Office, у них есть очень похожий набор макро-инструментов для того же.

1 голос
/ 10 августа 2012

Этот фрагмент можно использовать для динамического создания таблицы в документе MS Word.

WPFDocument document = new XWPFDocument();
XWPFTable tableTwo = document.createTable();
XWPFTableRow tableTwoRowOne = tableTwo.getRow(0);
tableTwoRowOne.getCell(0).setText(Knode1);
tableTwoRowOne.createCell().setText(tags.get("node1").toString());
for (int i = 1; i < nodeList.length; i++) {
    String node = "node";
    String nodeVal = "";
    XWPFTableRow tr = null;
    node = node + (i + 1);
    nodeVal = tags.get(node).toString();
    if (tr == null) {
        tr = tableTwo.createRow();
        tr.getCell(0).setText(nodeList[i]);
        tr.getCell(1).setText(tags.get(node).toString());
    }
}
1 голос
/ 30 декабря 2008

Office 2003 имеет формат xml, а формат документа по умолчанию для Office 2007 - xml (в архиве). Таким образом, вы можете просто сгенерировать XML из Java. Если вы откроете существующий документ, это не так уж сложно, посмотрите требуемый xml.

Кроме того, вы можете использовать API openoffice для генерации документа и сохранить его как документ в формате ms-word.

0 голосов
/ 10 июня 2016

Используя мою маленькую zip-утилиту, вы можете с легкостью создавать docx, если знаете, что делаете. Формат файла Word в DOCX - просто zip (папки с файлами XML). Используя утилиты java zip, вы можете изменить существующий docx, только часть содержимого.

Чтобы следующий пример работал, просто откройте Word, введите несколько строк, сохраните документ. Затем с помощью программы zip удалите файл zip / document.xml (это файл, в котором находится основное содержимое документа Word) из zip Теперь у вас есть готовый шаблон. Сохранить измененный zip.

Вот как выглядит создание нового файла Word:

/* docx file head  */
    final String DOCUMENT_XML_HEAD =
            "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>" +
            "<w:document xmlns:wpc=\"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" xmlns:w10=\"urn:schemas-microsoft-com:office:word\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\" xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" mc:Ignorable=\"w14 w15 wp14\">" +
            "<w:body>";

    /* docx file foot  */
    final String DOCUMENT_XML_FOOT =
             "</w:body>" +
             "</w:document>";


    final ZipOutputStream zos =  new ZipOutputStream(new FileOutputStream("c:\\TEMP\\test.docx"));

    final String fullDocumentXmlContent = DOCUMENT_XML_HEAD + "<w:p><w:r><w:t>Hey MS Word, hello from java.</w:t></w:r></w:p>" + DOCUMENT_XML_FOOT;

    final si.gustinmi.DocxZipCreator creator = new si.gustinmi.DocxZipCreator();

    // create new docx file
    creator.createDocxFromExistingDocx(zos, "c:\\TEMP\\existingDocx.docx", fullDocumentXmlContent);

Это zip-утилиты:

package si.gustinmi;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.logging.Logger;
import java.util.zip.CRC32;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

/**
 * Creates new docx from existing one.
 * @author gustinmi [at] gmail [dot] com
 */
public class DocxZipCreator {

    public static final Logger log = Logger.getLogger(DocxZipCreator.class.getCanonicalName());

    private static final int BUFFER_SIZE = 4096;


    /** OnTheFly zip creator. Traverses through existing docx zip and creates new one simultaneousl.
     * On the end, custom document.xml is inserted inside
     * @param zipFilePath location of existing docx template (without word/document.xml)
     * @param documentXmlContent content of the word/document.xml
     * @throws IOException
     */
    public void createDocxFromExistingDocx(ZipOutputStream zos, String zipFilePath, String documentXmlContent) throws IOException {

        final FileInputStream fis = new FileInputStream(zipFilePath);
        final ZipInputStream zipIn = new ZipInputStream(fis);

        try{
            log.info("Starting to create new docx zip");
            ZipEntry entry = zipIn.getNextEntry();
            while (entry != null) { // iterates over entries in the zip file
                copyEntryfromZipToZip(zipIn, zos, entry.getName());
                zipIn.closeEntry();
                entry = zipIn.getNextEntry();
            }

            // add document.xml to existing zip
            addZipEntry(documentXmlContent, zos, "word/document.xml");

        }finally{
            zipIn.close();
            zos.close();
            log.info("End of docx creation");
        }

    }

    /** Copies sin gle entry from zip to zip  */
    public void copyEntryfromZipToZip(ZipInputStream is, ZipOutputStream zos, String entryName)
    {
        final byte [] data = new byte[BUFFER_SIZE]; 
        int len; 
        int lenTotal = 0;
        try {

            final ZipEntry entry = new ZipEntry(entryName); 
            zos.putNextEntry(entry); 

            final CRC32 crc32 = new CRC32(); 
            while ((len = is.read(data)) > -1){ 
                zos.write(data, 0, len); 
                crc32.update(data, 0, len);
                lenTotal += len;
            } 

            entry.setSize(lenTotal); 
            entry.setTime(System.currentTimeMillis()); 
            entry.setCrc(crc32.getValue());

        }
        catch (IOException ioe){
            ioe.printStackTrace();
        }
        finally{
            try { zos.closeEntry();} catch (IOException e) {}
        }
    }

    /**  Create new zip entry with content
     * @param content content of a new zip entry
     * @param zos 
     * @param entryName name (npr: word/document.xml)
     */
    public void addZipEntry(String content, ZipOutputStream zos, String entryName)
    {
        final byte [] data = new byte[BUFFER_SIZE]; 
        int len; 
        int lenTotal = 0;
        try {

            final InputStream is = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8));

            final ZipEntry entry = new ZipEntry(entryName); 
            zos.putNextEntry(entry); 

            final CRC32 crc32 = new CRC32(); 
            while ((len = is.read(data)) > -1){ 
                zos.write(data, 0, len); 
                crc32.update(data, 0, len);
                lenTotal += len;
            } 

            entry.setSize(lenTotal); 
            entry.setTime(System.currentTimeMillis()); 
            entry.setCrc(crc32.getValue());

        }
        catch (IOException ioe){
            ioe.printStackTrace();
        }
        finally{
            try { zos.closeEntry();} catch (IOException e) {}
        }
    }

}
0 голосов
/ 27 марта 2009

Я управляю проектом docx4j

docx4j содержит класс TblFactory , который создает обычные таблицы (то есть без интервалов строк или столбцов) с настройками по умолчанию, которые будет создан Word 2007, и с размерами, указанными пользователем.

Если вам нужна более сложная таблица, самый простой подход - создать ее в Word, а затем скопировать полученный XML-код в строку в вашей среде IDE, где вы можете использовать XmlUtils.unmarshalString в docx4j для создания из нее объекта Tbl.

0 голосов
/ 26 февраля 2009

Нажмите здесь, чтобы получить Рабочий пример с исходным кодом . Этот пример генерирует документы MS-Word из Java на основе концепции шаблона.

0 голосов
/ 30 декабря 2008

Наш набор функций - нажать кнопку в нашем веб-приложении и получить страницу, на которую вы смотрите, в виде документа Word. Мы используем схему docx для описания документов и располагаем множеством Java-кода на стороне сервера, который создает документ и отвечает нашему веб-клиенту. Само форматирование выполняется с помощью некоторых скомпилированных xsl-t из Java для перевода с нашего собственного уровня персистентности XML.

Схема docx довольно сложна для понимания. Мы добились наибольших успехов в создании шаблонов документов в Word с точно необходимым форматированием, но с поддельным контентом. Затем мы дурачились с ними, пока не поняли, что именно происходит. В документе есть огромное количество, о котором вам не нужно беспокоиться. При чтении / переводе docx Word довольно терпимо относится к частично полной схеме форматирования. Фактически мы решили почти полностью отформатировать форматирование, поскольку это также означает, что форматирование пользователя по умолчанию имеет приоритет, что, по-видимому, они предпочитают. Это также ускоряет процесс xsl и уменьшает размер получаемого документа.

0 голосов
/ 30 декабря 2008

Office Writer будет лучшим инструментом для использования, чем POI для вашего требования.

Если все, что вам нужно, это простая таблица без слишком большого форматирования, я бы воспользовался этим простым приемом. Используйте Java, чтобы сгенерировать таблицу как HTML с использованием простой старой таблицы, тегов tr, td и скопировать визуализированную таблицу HTML в документ word;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...