【问题标题】:How to write column by column using Apache poi如何使用 Apache poi 逐列写入
【发布时间】:2017-11-16 12:27:23
【问题描述】:

我有一张如下图:

Map<String, Map<String, List<String>>> finalDataSet = new LinkedHashMap<>();

它有如下数据:

{Name1={CurrentUserStory=[AB-1413, AB-1504], CUS_Status=[In Testing, Ready for Deployment], SubTask=[AB-1547, AB-1508], ST_Status=[In Development, Done], TimeSpent=[19800, 23400]},Name2={CurrentUserStory=[AB-1377, AB-149],CUS_Status=[Ready for Testing, Ready for Development],SubTask=[AB-1545, AB-1510], ST_Status=[Ready for Testing, Closed],TimeSpent=[25200, 5400]}}

上面的数据我想以下面的格式写入excel。

当我试图将这些数据写入 excel 时,只有“TimeSpent”列正在写入并且所有列都是空的。这是我的代码:

HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sh = wb.createSheet("CSG_Report");
Row row = sh.createRow(2);
for (Map.Entry<String, Map<String, List<String>>> m : finalDataSet.entrySet()) {
    int col=1;
    row= sh.createRow(index);
    int userindex=index;
    for(Map.Entry<String, List<String>> innerMap:m.getValue().entrySet())
    {
        index = userindex;
        List<String> val=innerMap.getValue();
        row= sh.createRow(index);
        for (String string : val) {
            row= sh.createRow(index);
            row=sh.getRow(index);
            Cell cell = row.createCell(col);
            cell.setCellValue(string);
            index++;
        }
        col++;
    }
}
FileOutputStream out = new FileOutputStream(new
        File("D:\\Output.xlsx"));
wb.write(out);
out.close();
wb.close();

请帮我完成它。感谢你的帮助。提前致谢。

【问题讨论】:

  • AFAIK 你不能,它是“基于行的”,但是如果列/行的数量是固定的,那么你可以创建所有需要的单元格,然后用一些循环填充它们
  • 它是基于行的,但如果你可以控制你的大小,你可以让它基于列......简单地想象你只有一列,然后在这一列上附加另一列。
  • 你的数据结构不合适。仅当每个属性中的值的数量可以变化时才会考虑这种设计,在这种情况下,您将无法以任何简单的方式在 Excel 上绘制它们。取而代之的是,您可以创建一个带有属性CurrentUserStoryCUS_StatusSubTaskST_Statusclass 并将它们映射到名称,这样您的工作会容易得多。
  • 你的意思是说如果List&lt;String&gt; val=innerMap.getValue(); val.size() 是静态的,那么我们可以做到。我是正确的@canillas 和@RC
  • 在 POI 中没有所谓的列...它只是行和该行中的单个单元格。因此,如果您尝试在每列中迭代并且每次创建新行...这将不起作用...一旦创建任何行...它将覆盖前一个实例,因此最后您只会得到最后一个实例。

标签: java excel apache-poi


【解决方案1】:

我为我的问题找到了一些解决方案。 这是我的代码....

int columnNum=1;
    int fRow=2;
    List<String> cvals = null;
    for (Map.Entry<String, Map<String, List<String>>> m : finalDataSet.entrySet()) {
        Row row = sh.createRow(fRow);
        Cell cell1=row.createCell(0);
        cell1.setCellValue("Name1");

        for(Map.Entry<String, List<String>> innerMap:m.getValue().entrySet()){
            cvals=innerMap.getValue();

             int tempHeight=cvals.size();
             int temp=fRow;
             for (String cval : cvals) {
                 Row row2;
                 if(sh.getPhysicalNumberOfRows()-1>temp-1)
                    {

                        row2=sh.getRow(temp);
                    }
                    else
                    {
                        row2=sh.createRow(temp);
                    }
                 Cell cell3=row2.createCell(columnNum);
                 cell3.setCellValue(cval);
                 temp=temp+1;
            }
             columnNum=columnNum+1; 
        }
        fRow=fRow+cvals.size();
        columnNum=1;
    }

【讨论】:

    猜你喜欢
    • 2014-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多