Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 树映射的数据发生了巨大的变化_Java_Excel_Database_Collections_Apache Poi - Fatal编程技术网

Java 树映射的数据发生了巨大的变化

Java 树映射的数据发生了巨大的变化,java,excel,database,collections,apache-poi,Java,Excel,Database,Collections,Apache Poi,我的程序将数据库表导出到excel。在过去的日子里,在属于该导出的方法中没有代码更改,它工作了,但是今天它不再工作了。我测试了数据正确保存的距离,以及数据不再正确保存的时间,但问题是我没有在这些行之间执行任何操作,这应该会更改值。在我的DefaultTableModel中,数据是正确的,表的每一行都被保存,但在映射中,数据量是正确的,但映射的每一行都是TableModel的最后一行 XSSFWorkbook wb = new XSSFWorkbook(); XSSFSheet w

我的程序将数据库表导出到excel。在过去的日子里,在属于该导出的方法中没有代码更改,它工作了,但是今天它不再工作了。我测试了数据正确保存的距离,以及数据不再正确保存的时间,但问题是我没有在这些行之间执行任何操作,这应该会更改值。在我的DefaultTableModel中,数据是正确的,表的每一行都被保存,但在映射中,数据量是正确的,但映射的每一行都是TableModel的最后一行

    XSSFWorkbook wb = new XSSFWorkbook();
    XSSFSheet ws = wb.createSheet();

    TreeMap<String, Object[]> data = new TreeMap<>();
    Object[] arr = new Object[dm.getColumnCount()];

    for (int i = 0; i < arr.length; i++)
    {
        arr[i] = dm.getColumnName(i);
    }

    data.put("-1", arr);

    arr = new Object[dm.getColumnCount()];

    for (int i = 0; i < dm.getRowCount(); i++)
    {
        for (int j = 0; j < arr.length; j++)
        {
            arr[j] = dm.getValueAt(i, j);
            //arr[j] here is the value as it should be 
        }
        data.put(Integer.toString(i), arr);
    }

    Set<String> ids = data.keySet();
    XSSFRow row;
    int rowID = 0;


    for (String key : ids)
    {
        row = ws.createRow(rowID++);

        Object[] values = data.get(key);

        int cellID = 0;

        for (Object o : values)
        {
            XSSFCell cell = row.createCell(cellID++);
            cell.setCellValue(o.toString());
            //o.toString() is the wrong value 
        }
    }
xssf工作簿wb=newxssf工作簿();
XSSFSheet ws=wb.createSheet();
树映射数据=新树映射();
Object[]arr=新对象[dm.getColumnCount()];
对于(int i=0;i
正确数据:

1 | a | b

2 | c | d

3 | e | f

4 | g | h

错误数据:

1 | a | b

1 | a | b

1 | a | b

1 | a | b


数据仅用于显示目的

正如Andy Turner在评论中提到的,您需要为每一新行分配一个新数组。否则,您将在每次迭代中覆盖值

代码应为:

for (int i = 0; i < dm.getRowCount(); i++)
{
    // reallocate the array
    arr = new Object[dm.getColumnCount()];
    for (int j = 0; j < arr.length; j++)
    {
        arr[j] = dm.getValueAt(i, j);
        //arr[j] here is the value as it should be 
    }
    data.put(Integer.toString(i), arr);
}
for(int i=0;i
请显示打印地图的输出,例如,
System.out.println(数据)
。我可以看到您对许多键都使用了相同的
arr
。在每次循环迭代中重新分配数组。谢谢你,我认为我在复制方法时犯了错误,但另一件奇怪的事情是,由于我将该方法外包给了一个外部类,因此数据不再排序,但这应该是因为数据库当然会根据id以正确的顺序返回数据。欢迎!这是一个复杂的代码,它使用-1索引将列名保存在映射中的行中。小心!