Apache POI 如何通过条件格式更改数据格式

3

我是 Apache POI 的用户,我创建了一个 Excel 文件(.xlsx),我需要在单元格上使用条件格式。我的问题是:我有一个公式,如果该公式返回的值在 0 到 1 之间,我想要显示一个小数位数,否则不显示任何小数。有可能使用条件格式吗?如果可以,我该如何做呢?

5个回答

2
Cell new_cell = row.createCell(index_column_found);
XSSFCellStyle cs = wBook.createCellStyle();
XSSFDataFormat df = wBook.createDataFormat();
cs.setDataFormat(df.getFormat(cell_custom_format));
new_cell.setCellStyle(cs);

这在POI 3.12版本中非常有效。

1

这是能够满足您需求的代码:

FileOutputStream out = new FileOutputStream("dateFormat.xls");
HSSFWorkbook hssfworkbook = new HSSFWorkbook();
HSSFSheet sheet = hssfworkbook.createSheet("new sheet");
HSSFCellStyle cs = hssfworkbook.createCellStyle();
HSSFDataFormat df = hssfworkbook.createDataFormat();
cs.setDataFormat(df.getFormat("#,##0.0"));

for(int i=0 ;i <100 ; i++ )
{
    double value = new Random(i).nextGaussian();
    HSSFRow row = sheet.createRow((short) i);
    HSSFCell cell = row.createCell((short) 0);
    cell.setCellValue(value);
    if(value>=0 && value<=1)
        cell.setCellStyle(cs);
}

hssfworkbook.write(out);
out.close();

0

数据格式只能格式化正数、负数、零和文本。我需要使用条件格式。如果数据格式可以做到这一点,那么数据格式字符串是什么? - JBerta93
style.setDataFormat(HSSFDataFormat.getBuiltinFormat("@")); 通过使用此数据格式,我们可以将值作为字符串分配给单元格。即,当 Excel 表格被修改时,前导零不会被消除。 - swamy

0
    style.setDataFormat(HSSFDataFormat.getBuiltinFormat("@"));

通过使用这种数据格式,我们可以将字符串值分配给单元格。


0

你好,虽然没有官方的方法,但我用一个小技巧让它运行起来了:

static void setNumberFormat(final XSSFConditionalFormattingRule r,final XSSFSheet s, final String format) {
    final int id = s.getWorkbook().createDataFormat().getFormat(format);
    try {
        final Method m = XSSFConditionalFormattingRule.class.getDeclaredMethod("getDxf", boolean.class);
        m.setAccessible(true);
        final org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDxf dxf = (CTDxf)m.invoke(r, true);
        final org.openxmlformats.schemas.spreadsheetml.x2006.main.CTNumFmt nf = dxf.addNewNumFmt();
        nf.setNumFmtId(id);
        nf.setFormatCode(format);
        dxf.setNumFmt(nf);
    } catch(final Throwable t) {
        t.printStackTrace();
    }
}

使用方法:

private static final String HUMAN1_BYTES = "[<1000]#0\"  B\";[<1000000]#0,\" KB\";#0,,\" MB\"";
private static final String HUMAN2_BYTES = "[<1000000000000]#0,,,\" GB\";[<1000000000000000]#0,,,,\" TB\";#0,,,,,\" PB\"";

public static void addConditionalFormattingRule(final XSSFSheet sheet, final CellRangeAddress[] regions, final byte op, final long limit, final String format) {
    final XSSFSheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
    final XSSFConditionalFormattingRule rule = sheetCF.createConditionalFormattingRule(op, Long.toString(limit));
    setNumberFormat(rule, sheet, format);
    sheetCF.addConditionalFormatting(regions, rule);
}

public static void setHumanSizeColumns(final XSSFSheet sheet, final char... cols) {
    if(cols == null) return;
    final CellRangeAddress[] ranges = new CellRangeAddress[cols.length];
    for(int i=0;i<cols.length;++i) ranges[i] = CellRangeAddress.valueOf("$"+cols[i]+"1:$"+cols[i]+"1048576");
    addConditionalFormattingRule(sheet, ranges, ComparisonOperator.LT, 1000000000, HUMAN1_BYTES);
    addConditionalFormattingRule(sheet, ranges, ComparisonOperator.GE, 1000000000, HUMAN2_BYTES);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接