Как добавить строки в TableModel с помощью JopenDocument

Я работаю над java-приложением, которое читает файл template.ods и заполняет его массивом объектов, используя JopenDocument.

Основываясь на документации JopenDocument , я должен получить TableModel из листа, а затем использовать метод setValueAt(value, rowIndex, columnIndex) для его изменения, но как только я это сделаю, запускается IndexOutofBoundsException . Вот мой метод:

Основной класс

      public File generateODSFileWithTemplate(String fileName, Object[][] rows, File template) throws FileNotFoundException {

final Sheet sheet = SpreadSheet.createFromFile(template).getSheet(0);
sheet.getSpreadSheet().getTableModel("data").setValueAt("Hello from Main", 3, 1);
File outFile = new File(fileName);
sheet.getSpreadSheet().saveAs(outFile);

 return outFile;
}

шаблон.ods

Если я добавлю значение в первую строку, используя:

      sheet.getSpreadSheet().getTableModel("data").setValueAt("Hello from Main", 0, 0);

Это работает, и значение столбца обновляется.

Мне интересно, что я делаю неправильно, чтобы получить это исключение?

Есть ли способ передать массив напрямую в TableModel, как DefaultTableModel, для вставки данных.

Я использую OpenOffice для создания template.ods

2 ответа

При работе с табличными документами я всегда помню, что вы можете прокручивать графический интерфейс до бесконечности... Ха-ха. Вы видите, к чему я иду? Я имею в виду, что должен быть способ определения размера (в строках и столбцах) документа, потому что мы не можем хранить бесконечно большой документ без значений. В нем также нет смысла, поэтому мы должны указать его размер. Для этого позвонитеensureColumnCountи/илиensureRowCountпри необходимости предварительно установив значения ячейки с индексом строки 3, потому что в модели файла, содержащего только 1 строку, просто не выделена строка. Или, по крайней мере, поэтому я понимаю, что мы получаем IndexOutOfBoundsException.

Следующий код демонстрирует проблему и работает должным образом:

      import javax.swing.table.DefaultTableModel;
import org.jopendocument.dom.spreadsheet.Sheet;
import org.jopendocument.dom.spreadsheet.SpreadSheet;

public class Main {
    public static void main(final String[] args) {
        final SpreadSheet spread = SpreadSheet.createEmpty(new DefaultTableModel());
        final Sheet sheet = spread.getFirstSheet();
        try {
            sheet.setValueAt("Will fail", 4, 4);
        }
        catch (final RuntimeException x) {
            System.out.println(x.toString() + " thrown. Fixing...");
            sheet.ensureColumnCount(5);
            sheet.ensureRowCount(5);
            sheet.setValueAt("Hello world", 4, 4); //Will not throw.
        }
    }
}

Sheetэто Table<SpreadSheet>поэтому он предоставляет вам эти (необходимые) методы.

В последней версии библиотеки 1.3 также есть ошибка. Попробуйте использовать библиотеку jOpenDocument версии 1.2. Более подробная информация ниже: https://www.mail-archive.com/ [электронная почта защищена] /msg755833.html

Другие вопросы по тегам