Java 如何使用xlsx4j格式化单元格类型?

Java 如何使用xlsx4j格式化单元格类型?,java,excel,openxml,xlsx,docx4j,Java,Excel,Openxml,Xlsx,Docx4j,我是docx4j和openxml的新手。我有必要创建excel文件,该文件包含N个单独的表(现有模板),并根据这些表预先创建图表。实际上,我需要用数据库中的值替换一些文本占位符,并向用户显示完全生成的Excel文档。 我用替换值检查了示例,在获得源代码中的最新补丁后,它对我有效。不幸的是,我的图表无法根据公式计算,因为替换的值是字符串类型。 好的,我可以首先标记一些行,以便将来将它们转换为数字,但是当我为这些行设置STCellType.N时,缺少必要的值,并且已将未知值插入到此位置 源xlsm文

我是docx4j和openxml的新手。我有必要创建excel文件,该文件包含N个单独的表(现有模板),并根据这些表预先创建图表。实际上,我需要用数据库中的值替换一些文本占位符,并向用户显示完全生成的Excel文档。 我用替换值检查了示例,在获得源代码中的最新补丁后,它对我有效。不幸的是,我的图表无法根据公式计算,因为替换的值是字符串类型。 好的,我可以首先标记一些行,以便将来将它们转换为数字,但是当我为这些行设置STCellType.N时,缺少必要的值,并且已将未知值插入到此位置

源xlsm文件包含:

F5 = ${gender:1}     G5 = ${gender:1:value}      H5 = =IF(G5>0; G5/SUM($G$5:$G$6)*100; "")
F6 = ${gender:2}     G6 = ${gender:2:value}      H6 = =IF(G6>0; G6/SUM($G$5:$G$6)*100; "")
替换后,我在结果xlsm文件中看到:

F5 = Man       G5 = 30      H5 = #VALUE!
F6 = Woman     G6 = 32      H6 = #VALUE!
注意:我插入的是“20”和“30”,而不是“30”和“32”

这是我的密码:

    List<String> numbers = new ArrayList<String>();  //convert to number the cell type with this address when all placeholders will be replaced
    numbers.add("G5");
    numbers.add("G6");

    JaxbSmlPart smlPart = (JaxbSmlPart)pkg.getParts().get(new PartName("/xl/sharedStrings.xml"));
    HashMap<String, String> mappings = new HashMap<String, String>();
    mappings.put("gender:1", "Man");
    mappings.put("gender:1:value", "20");
    mappings.put("gender:2", "Woman");
    mappings.put("gender:2:value", "30");
    smlPart.variableReplace(mappings);

    //when replacements done, iterating over all rows and columns in the sheet and set the type "Number" for the selected cells
    for (int i=0; i<sheetData.getRow().size(); i++) {
        for (int j=0;j<sheetData.getRow().get(i).getC().size();j++) {
            if (numbers.contains(sheetData.getRow().get(i).getC().get(j).getR())) {
                sheetData.getRow().get(i).getC().get(j).setT(STCellType.N);
            }
        }
    }
List number=new ArrayList()//当替换所有占位符时,转换为使用此地址的单元格类型编号
编号。添加(“G5”);
编号。添加(“G6”);
JaxbSmlPart smlPart=(JaxbSmlPart)pkg.getParts().get(新部件名(“/xl/sharedStrings.xml”);
HashMappings=新的HashMap();
put(“性别:1”,“男性”);
put(“性别:1:value”,“20”);
“性别:2”,“女性”);
“性别:2:价值”,“30”);
smlPart.variableplace(映射);
//替换完成后,迭代工作表中的所有行和列,并为所选单元格设置类型“Number”
对于(int i=0;i