Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.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以列方式在excel中编写数据列表?_Java_Excel_Arraylist_Apache Poi_Xssf - Fatal编程技术网

如何使用Java以列方式在excel中编写数据列表?

如何使用Java以列方式在excel中编写数据列表?,java,excel,arraylist,apache-poi,xssf,Java,Excel,Arraylist,Apache Poi,Xssf,我在ArrayList中有一个数据列表,其中包含标题以及与其相关的值。如下图所示 Fruits Apple Orange ****** Vegetables Beans Carrot Brinjal Cucumber ****** Colors Orange Blue Red Green Yellow Now, I want to write the values in `excel` with each heading and the associated values in

我在
ArrayList
中有一个数据列表,其中包含标题以及与其相关的值。如下图所示

Fruits 
Apple 
Orange 
******
Vegetables 
Beans
Carrot 
Brinjal
Cucumber 
******
Colors
Orange 
Blue
Red
Green
Yellow

Now, I want to write the values in `excel` with each heading and the associated values in column-wise. Like below,

Fruits   Vegetable   Colors
Apple    Beans       Orange 
Orange   Carrot      Blue
         Brinjal     Red
         Cucumber    Green
                     Yellow
我正在用java编写代码,并使用
apache.poi.xssf.usermodel
库来处理
excel
操作。我在这里面临的问题是,当我编写第二个标题和相关值时,第一个标题及其值由于
创建代码而被清除

XSSFRow row = outputSheet.createRow(rowNumValue);

有人能帮我完成吗?

你需要做的是第一次使用
createRow()
来。。。创建行,并为所有后续访问创建
getRow()
。这样,您将获得工作表对象中已有的行,而不是创建新的行
getRow()
如果该行不存在,则返回null,因此您可以执行以下等效操作:

XSSFRow row = outputSheet.getRow(rowNumValue) ? outputSheet.getRow(rowNumValue) : outputSheet.createRow(rowNumValue);

可以立即对单个列表进行操作,但使用合理的数据结构更容易。由于每列可以有不同的行数,列一列,每列列列一列

List<List<String>> makeColumns(List<String> linearList) {
    List<List<String>> columns = new ArrayList<>();
    int column = 0;
    for (String s : linearList) {
        if (s.startsWith("***")) {
            ++column;
        } else {
            while (column >= columns.size()) {
                columns.add(new ArrayList<>());
            }
            columns.get(column).add(s);
        }
    }
}
List makeColumns(List linearList){
列表列=新的ArrayList();
int列=0;
for(字符串s:linearList){
如果(s.startsWith(“***”){
++栏目;
}否则{
而(column>=columns.size()){
columns.add(newarraylist());
}
columns.get(column).add(s);
}
}
}
现在可以在行上迭代以填充工作表

List<List<String>> columns = makeColumns(...);
int rows = columns.stream().mapToInt(List::size).max().orElse(0);

for (int rowi = 0; rowi < rows; ++rowi) {
    XSSFRow row = outputSheet.createRow(rowi + 1);
    for (int coli = 0; coli < columns.size(); ++coli) {
        if (rowi < columns.get(coli).size()) {
            String value = columns.get(coli).get(rowi);
            row.createCell(coli);
            ...
        }
    }
}
List columns=makeColumns(…);
int rows=columns.stream().mapToInt(List::size).max().orElse(0);
对于(int-rowi=0;rowi
Split,获取第一个字符串并使其成为cat,然后循环项目并将其放入字符串生成器中。