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