当前位置: 首页 > 知识库问答 >
问题:

JTable和类似Excel的公式

翁钧
2023-03-14

经过一番研究,我找到了一个方法(如果我理解正确的话,那是一个冗长而乏味的方法)在我的JTable中实现公式。

下面是该表的样子(正如您可能知道的那样,它是用netbeans编辑的,不要介意大量的空部分,我们稍后将讨论它)

    contractFlaminiaTable.setModel(new javax.swing.table.DefaultTableModel(
        new Object [][] {
            {"name1", null, null, null, null, null, null, null, null, null, null},
            {"name2", null, null, null, null, null, null, null, null, null, null},
            {"name3", null, null, null, null, null, null, null, null, null, null},
            {"name4", null, null, null, null, null, null, null, null, null, null},
            {"name5", null, null, null, null, null, null, null, null, null, null},
            {"name6", null, null, null, null, null, null, null, null, null, null},
            {"name7", null, null, null, null, null, null, null, null, null, null},
            {"name8", null, null, null, null, null, null, null, null, null, null},
            {"TOTAL", null, null, null, null, null, null, null, null, null, null}
        },
        new String [] {
            "  ", "col1", "col2", "col3", "col4", "col5", "col6", "col7", "col8", "col9", "TOTAL"
        }
    ) {
        Class[] types = new Class [] {
            java.lang.String.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Object.class
        };
        boolean[] canEdit = new boolean [] {
            false, true, true, true, true, true, true, true, true, true, false
        };

        public Class getColumnClass(int columnIndex) {
            return types [columnIndex];
        }

        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return canEdit [columnIndex];
        }
    });
    contractFlaminiaTable.setRowHeight(30);
    contractFlaminiaTable.getTableHeader().setReorderingAllowed(false);
    flaminiaScrollPane2.setViewportView(contractFlaminiaTable);
    contractFlaminiaTable.getColumnModel().getColumn(0).setResizable(false);
    contractFlaminiaTable.getColumnModel().getColumn(1).setResizable(false);
    contractFlaminiaTable.getColumnModel().getColumn(2).setResizable(false);
    contractFlaminiaTable.getColumnModel().getColumn(3).setResizable(false);
    contractFlaminiaTable.getColumnModel().getColumn(4).setResizable(false);
    contractFlaminiaTable.getColumnModel().getColumn(5).setResizable(false);
    contractFlaminiaTable.getColumnModel().getColumn(6).setResizable(false);
    contractFlaminiaTable.getColumnModel().getColumn(7).setResizable(false);
    contractFlaminiaTable.getColumnModel().getColumn(8).setResizable(false);
    contractFlaminiaTable.getColumnModel().getColumn(9).setResizable(false);
    contractFlaminiaTable.getColumnModel().getColumn(10).setResizable(false);
    contractFlaminiaTable.getColumnModel().getColumn(10).setPreferredWidth(48);

以下是问题:

a)是否可以制作一个类似excel的公式来添加单元格?(类似于添加单元格C2:C6,因为我确实在excel文件中导出了该表,我想如果有类似的方法也是可能的。)

2a)我是否必须将列类型更改为object,或者所述公式仍将被视为整数?(除了实现为字符串类型的name列之外,所有其他列都是整数类型,而且最终用户应该只能插入数字,以免扰乱公式,但将类型更改为object,实际上也可以插入字母)

c)由于表中的数据被导出到一个xls文件(在另一个线程中获得几个指针后已经正确实现了该文件),是否可以使用所述文件再次填充表,或者我每次都必须重新绘制它?

我很抱歉把所有这些问题都放在一起问(特别是C-因为它和标题无关..)但是我没有在oracle提供的jTable类教程中找到任何内容,也没有在其他类似的线程中找到任何建设性的建议。

请耐心等待,正如在另一个线程中所说的,我仍然是一个初学者(如果我可以被认为是一个,那就是!)另外,谢谢你的帮助,其他的指针真的帮了我的忙!

编辑:

下面是我想出的在表中实现公式的代码(实际上,这是get/setvalueat()的一种奇怪用法,但它似乎工作得相当好(有点笨拙,但有改进的空间,只是让我学到了更多东西,这在一天结束时总是很好的)

class TotalButton {

public TotalButton(JTable jTable) {
    // get table model
    TableModel model = jTable.getModel();

    // declare for variables
    int x;
    int y;

    // initialize table placeholder
    int totalValue = 0;

    int rowCount = model.getRowCount();
    int columnCount = model.getColumnCount();

    // for loop for the first row
    for (x = 0; x < rowCount; x++) {
        for (y = 1; y < columnCount; y++) {
            if (y == 10) {
                break;           // break when the loop reaches the total column
            }
            if (x == 0) {

                String value = (String) model.getValueAt(x, y);
                if ("".equals(value)) {
                    value = "0";            // avoiding empty string to integer error
                }
                int tempVal = Integer.parseInt(value);           // turn the string into a number

                totalValue = totalValue + tempVal;          // adds the numbers to the total
            }
        }

        String finalValue = Integer.toString(totalValue);           // turn the number to a string
        model.setValueAt(finalValue, 0, 10);            // set total column value
    }

基本上,我添加了一个按钮来计算和填充表的总行/列(在某些时候添加了一个keyListener,但是,正如我所说的,它感觉有点笨拙..并不是说使用按钮感觉有什么不同,但是很好..)。

还必须在jTable模型中用“”-s更改null-s,以便将列类型设置为String(后来用于integer.parseInt()和integer.ToString())。

另外,尽管keyListener觉得有点笨拙,但它会在“real”时间内更新表(之所以说“real”,是因为在表中插入新值不会被算作keyPressed(),直到下一次击键为止,因为某种原因)。

再次感谢您提供的指针,这个程序看起来工作得相当好,即使它真的需要一些代码/逻辑润色(我正在做这个工作)。

ps:我知道这不是最好的解决方案,但我还是很高兴,因为我自己研究了一些(当然,如前所述,如果没有指针,我就无法编写代码)

PPS:再次谢谢:P

共有1个答案

汝墨一
2023-03-14

对于数字,让TableModel将表达式存储为String并让GetValueat()的实现返回计算表达式的结果。有几个库可用。

 类似资料:
  • 我有个小问题。我做了一个生成jtable的程序,比你可以用一些值填充这个表,比把整个表保存到Excel。 在乞讨开始时,我定义了file: 当我打开这个文件时,我得到消息,文件的格式与其扩展名(.xls)不同。所以我点击“另存为”,建议的扩展名是。txt。我将文件保存为。xls(似乎与java程序保存的文件相同),并且我可以将JTable从excel导入java程序,而不会出现任何错误。谁能建议如

  • 第4行;6.8相同,但订单栏(在6和8上添加一个字母)和生产栏(不同的生产数量)除外。合并第4、6、8行并汇总生产数量。第6、8行被隐藏或删除。

  • 问题内容: 我需要用同一行的一组列(从左到右)中的第一个非空条目填充一个单元格-类似于SQL中的coalesce()。 在以下示例表中 我想在A行的每个单元格中放置一个单元格函数,这样我将得到: 我知道我可以使用一系列IF函数来做到这一点,但是在我的实际工作表中,我有30列可供选择,因此,如果有一种更简单的方法,我将很高兴。 问题答案: 这是一个数组公式。输入公式后,按+ +使Excel将其评估为

  • 我有两个excel表(例如:Sheet1和Shee2),表1单元格A1中的公式如下: 此代码将在单元格A1中的Sheet2中搜索值“YES”,并根据值“YES”是否存在而在Sheet1,A1中写入TRUE或FALSE。 我遇到的问题是,我希望公式不仅搜索A1,而且搜索表2中的A1到A3,如果任意两个单元格包含值“是”,那么公式应该返回“true”,否则返回“false”。 我将非常感谢你在这方面的

  • 我使用NPOI dll在C#中对excel表进行genrating。当我以编程方式在某个单元格上应用公式并导出excel时,在excel表的保护模式下,所有具有公式的单元格都显示为“0”值。但是当我编辑这个excel时,所有的公式都能在这些单元格上正常工作。是否有任何解决方案,从应用公式也可以工作在保护模式?

  • 问题内容: 我正在处理一个生成一些Excel文档的脚本,我需要将一个数字转换为其等效的列名。例如: 我已经写了一个算法来做到这一点,但是我想知道是更简单还是更快的方法: 您知道更好的方法吗?也许可以简化一些事情?或性能改进? 编辑 ircmaxell的实现效果很好。但是,我要添加一个简短的简短内容: 问题答案: 这是一个很好的简单递归函数(基于零索引数字,表示0 == A,1 == B等)… 如果