Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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/tfs/3.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 POI Excel创建新列和新行_Java_Apache Poi - Fatal编程技术网

Java POI Excel创建新列和新行

Java POI Excel创建新列和新行,java,apache-poi,Java,Apache Poi,好的,我在一个列表上迭代,而不是水平地将值插入单元格,而是垂直地将值放入单元格 它第一次在列表中运行良好,但当我第二次进入列表时,它会将第一个列表吹走,并在第二列中替换它 如果我删除循环末尾的行=0,它看起来像: val 1 val 2 val 1 val 2 ========= int row = 0; int k = 1; for (List dataList: someList) { Row myRow = sheet.createRow ((short)r

好的,我在一个列表上迭代,而不是水平地将值插入单元格,而是垂直地将值放入单元格

它第一次在列表中运行良好,但当我第二次进入列表时,它会将第一个列表吹走,并在第二列中替换它

如果我删除循环末尾的
行=0
,它看起来像:

val 1
val 2
      val 1
      val 2
=========

int row = 0;
int k = 1; 
for (List dataList: someList) {
  Row myRow = sheet.createRow ((short)row);

  myRow.createCell(k).setCellValue (dataList.getVal())); 
  myRow = sheet.createRow ((short)row++);

  myRow.createCell(k).setCellValue (dataList.getSecVal())); 
  myRow = sheet.createRow ((short)row++);
  k++;
  row = 0;
}

行索引的增量错误。创建第二行后,行++将递增。因此,您正在索引0处创建两行。如果将所有行++更改为++行,它应该可以工作。

行索引的增量错误。创建第二行后,行++将递增。因此,您正在索引0处创建两行。如果将所有行++更改为++行,则应该可以使用。

每次创建一行时,首先要检查该行是否存在。 像这样的东西会有用的

      myRow = sheet.getRow((short)row);
      if (myRow == null) {
        myRow = sheet.createRow((short)row);
      }
此外,在当前代码中,每次在0处重新创建行两次

  Row myRow = sheet.createRow ((short)row);

  myRow.createCell(k).setCellValue (dataList.getVal())); 
  myRow = sheet.createRow ((short)row++); // Here, you're creating a new row at index 0

Akokski的答案是好的,实际上更好,要么像他在迭代之前那样创建它们,要么先检查它是否存在

每次创建一行时,首先要检查该行是否存在。 像这样的东西会有用的

      myRow = sheet.getRow((short)row);
      if (myRow == null) {
        myRow = sheet.createRow((short)row);
      }
此外,在当前代码中,每次在0处重新创建行两次

  Row myRow = sheet.createRow ((short)row);

  myRow.createCell(k).setCellValue (dataList.getVal())); 
  myRow = sheet.createRow ((short)row++); // Here, you're creating a new row at index 0

Akokski的答案是好的,实际上更好,要么像他在迭代之前那样创建它们,要么先检查它是否存在

在循环的每次迭代中,您都在索引0和1处重新创建行。当您重新创建这些行时,您将清除所有已经存在的数据

试着这样做:

int k = 1;
Row myRow1 = sheet.createRow(0); //first row of the document
Row myRow2 = sheet.createRow(1);
for (List dataList: someList) {
  myRow1.createCell(k).setCellValue (dataList.getVal())); 
  myRow2.createCell(k).setCellValue (dataList.getSecVal())); 
  k++;
}

在循环的每次迭代中,您都在索引0和1处重新创建行。当您重新创建这些行时,您将清除所有已经存在的数据

试着这样做:

int k = 1;
Row myRow1 = sheet.createRow(0); //first row of the document
Row myRow2 = sheet.createRow(1);
for (List dataList: someList) {
  myRow1.createCell(k).setCellValue (dataList.getVal())); 
  myRow2.createCell(k).setCellValue (dataList.getSecVal())); 
  k++;
}

当您遍历第一个列表时。您已经创建了行。下次迭代时,必须更新行,而不是再次创建行。 创建新行时,它将在末尾添加

int row = 0;
int k = 1; 

ArrayList<Row> rows = new ArrayList<Row>();
for(int i = 0; i<someList.size();i++){
    Row myRow = sheet.createRow(i);
    rows.add(myRow);
    myRow = null;
}

for (List dataList: someList) {
    for(Row row : rows){
        row.createCell(k).setCellValue(dataList.getVal()));         
    }

    k++;
}


     Col1    Col2    Col3    Col4
Row1   1
Row2   2
Row3          3 
Row4          4

or 

     Col1    Col2    Col3    Col4
Row1   1       3
Row2   2       4
Row3           
Row4          
在遍历列表1时,当到达末尾时,已经创建了三个新行。如果现在使row=0并遍历第二个列表List2。它将在0处添加一个新行,以此类推,直到到达列表2的末尾

如果在迭代结束时没有使行=0。将在末尾添加新行

int row = 0;
int k = 1; 

ArrayList<Row> rows = new ArrayList<Row>();
for(int i = 0; i<someList.size();i++){
    Row myRow = sheet.createRow(i);
    rows.add(myRow);
    myRow = null;
}

for (List dataList: someList) {
    for(Row row : rows){
        row.createCell(k).setCellValue(dataList.getVal()));         
    }

    k++;
}


     Col1    Col2    Col3    Col4
Row1   1
Row2   2
Row3          3 
Row4          4

or 

     Col1    Col2    Col3    Col4
Row1   1       3
Row2   2       4
Row3           
Row4          
int行=0;
int k=1;
ArrayList行=新的ArrayList();

对于(int i=0;i,当您迭代第一个列表时。您已经创建了行。下次迭代时,您必须更新行,而不是再次创建行。 创建新行时,它将在末尾添加

int row = 0;
int k = 1; 

ArrayList<Row> rows = new ArrayList<Row>();
for(int i = 0; i<someList.size();i++){
    Row myRow = sheet.createRow(i);
    rows.add(myRow);
    myRow = null;
}

for (List dataList: someList) {
    for(Row row : rows){
        row.createCell(k).setCellValue(dataList.getVal()));         
    }

    k++;
}


     Col1    Col2    Col3    Col4
Row1   1
Row2   2
Row3          3 
Row4          4

or 

     Col1    Col2    Col3    Col4
Row1   1       3
Row2   2       4
Row3           
Row4          
在遍历列表1时,当您到达末尾时,您已经创建了三个新行。如果现在使row=0并遍历第二个列表List2,它将在0处添加一个新行,依此类推,直到它到达列表2的末尾

如果在迭代结束时没有将行设置为0,则将在结束时添加新行

int row = 0;
int k = 1; 

ArrayList<Row> rows = new ArrayList<Row>();
for(int i = 0; i<someList.size();i++){
    Row myRow = sheet.createRow(i);
    rows.add(myRow);
    myRow = null;
}

for (List dataList: someList) {
    for(Row row : rows){
        row.createCell(k).setCellValue(dataList.getVal()));         
    }

    k++;
}


     Col1    Col2    Col3    Col4
Row1   1
Row2   2
Row3          3 
Row4          4

or 

     Col1    Col2    Col3    Col4
Row1   1       3
Row2   2       4
Row3           
Row4          
int行=0;
int k=1;
ArrayList行=新的ArrayList();

对于(int i=0;i这是有效的解决方案:

myRow = sheet.getRow(row);

if(null == myRow)
{

    myRow=sheet.createRow(row);
}

这就是有效的解决方案:

myRow = sheet.getRow(row);

if(null == myRow)
{

    myRow=sheet.createRow(row);
}

这与行索引如何递增无关-相反,这与他在索引0和1处创建行的事实有关。有关详细信息,请参阅我的答案。@Josephelfert我没有做错任何事情。你对问题的解释是错误的。我的要求是让它基于列而不是基于行,因为没有api用于。。。答案是使用
sheet.getRow
在第一个循环中创建一行之后,通过这样做…您可以获取该行的索引并在其旁边创建另一个单元格…这与行索引的递增方式无关-相反,这都是关于他在索引0和1处创建行的事实。参见我的答案更多详情。@JosephHelfert我没有做错任何事。你对问题的解释是错误的。我的要求是让它基于列而不是基于行,因为没有api…答案是使用
sheet.getRow
在第一个循环中创建行之后,通过这样做…你可以获得该行的索引并创建另一个ce我就在它旁边……这不是很动态。你在进入列表之前声明了2行。列表的每次迭代都是一列数据。我必须增加行索引,以获得要在它下面的行中显示的数据,因此
row++
你能创建一个大小为someList.size()的行数组吗并使用它动态创建行。@Doc Holiday.Checkanswer@rozar我想我知道问题所在……这是行的实际实例。我在循环结束时创建了一个虚拟行
row row2=sheet.createRow
,它没有吹走第一行loop@DocHoliday-它可能不是动态的,但如果您希望插入数据按列而不是按行(我可以补充一点,这似乎有点落后于POI的操作方式),这就可以了。如果你真的希望它是动态的,那么按照rozar的建议创建一个行列表。但是无论你做什么,都不要在每次迭代中重新创建行。你应该只创建一次行。这不是很动态。你在进入列表之前声明了2行。列表的每次迭代都是一列麦汁h的数据。我必须增加行索引,以获得数据显示在它下面的行中,因此
row++
可以创建一个大小为someList.size()的行数组吗并使用它动态创建行。@Doc Holiday.Checkanswer@rozar我想我知道问题所在……这是行的实际实例。我在循环结束时创建了一个虚拟行
row row2=sheet.createRow
,它没有吹走第一行loop@DocHoliday-它可能不是动态的,但如果您希望插入数据通过列而不是ro