经过一番研究,我找到了一个方法(如果我理解正确的话,那是一个冗长而乏味的方法)在我的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
对于数字,让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等)… 如果