Как добавить строки в 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