如何使用 JopenDocument 向 TableModel 添加行
How to add rows to TableModel with JopenDocument
我正在开发一个 java 应用程序,该应用程序读取文件 template.ods,并使用 JopenDocument 用对象数组填充它。
基于JopenDocument documentation,我应该从Sheet获取TableModel,然后使用方法setValueAt(value, rowIndex, columnIndex)修改它,但是一旦我这样做,就会触发 IndexOutofBoundsException,这是我的方法:
Main.class
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;
}
template.ods
如果我使用 :
在第一行添加一个值
sheet.getSpreadSheet().getTableModel("data").setValueAt("Hello from Main", 0, 0);
有效,列值得到更新。
我想知道我做错了什么才能得到这个异常?
有没有办法像 DefaultTableModel 一样直接将数组传递给 TableModel 来插入数据。
我正在使用 OpenOffice 创建 template.ods
在处理散布 sheet 文档时,我总是记得您可以将 GUI 滚动到无限远...哈哈。你知道我要去哪里吗?我的意思是必须有一种方法来确定文档的大小(以行和列为单位),因为我们不能存储无限大的文档,没有值。它也没有意义,所以我们必须指定它的大小。为此,请适当调用 ensureColumnCount
and/or 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>
,因此它为您提供了那些(必需的)方法。
我正在开发一个 java 应用程序,该应用程序读取文件 template.ods,并使用 JopenDocument 用对象数组填充它。
基于JopenDocument documentation,我应该从Sheet获取TableModel,然后使用方法setValueAt(value, rowIndex, columnIndex)修改它,但是一旦我这样做,就会触发 IndexOutofBoundsException,这是我的方法:
Main.class
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;
}
template.ods
如果我使用 :
在第一行添加一个值sheet.getSpreadSheet().getTableModel("data").setValueAt("Hello from Main", 0, 0);
有效,列值得到更新。
我想知道我做错了什么才能得到这个异常?
有没有办法像 DefaultTableModel 一样直接将数组传递给 TableModel 来插入数据。
我正在使用 OpenOffice 创建 template.ods
在处理散布 sheet 文档时,我总是记得您可以将 GUI 滚动到无限远...哈哈。你知道我要去哪里吗?我的意思是必须有一种方法来确定文档的大小(以行和列为单位),因为我们不能存储无限大的文档,没有值。它也没有意义,所以我们必须指定它的大小。为此,请适当调用 ensureColumnCount
and/or 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>
,因此它为您提供了那些(必需的)方法。