【问题标题】:How to add rows to TableModel with JopenDocument如何使用 JopenDocument 向 TableModel 添加行
【发布时间】:2021-03-29 11:59:44
【问题描述】:

我正在开发一个 java 应用程序,它读取文件 template.ods,并使用 JopenDocument 用对象数组填充它。

基于JopenDocument documentation,我应该从Sheet中获取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);

它有效,并且列值得到更新。

我想知道我做错了什么来得到这个异常?

有没有办法像 Def​​aultTableModel 一样将数组直接传递给 TableModel 来插入数据。

我正在使用 OpenOffice 创建 template.ods

【问题讨论】:

    标签: java swing tablemodel defaulttablemodel jopendocument


    【解决方案1】:

    在处理电子表格文档时,我总是记得您可以将 GUI 滚动到无穷大……哈哈。你知道我要去哪里吗?我的意思是必须有一种方法来确定文档的大小(以行和列为单位),因为我们不能存储一个没有值的无限大的。它也没有任何意义,所以我们必须指定它的大小。为此,请酌情调用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.
            }
        }
    }
    

    SheetTable<SpreadSheet>,因此它为您提供了那些(必需的)方法。

    【讨论】:

    • 它就像魅力一样,非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多