Я пользователь Apache POI, и я создаю файл excel (.xlsx), и мне нужно использовать условное форматирование в ячейке. Моя проблема заключается в следующем: у меня есть формула, если эта формула возвращает значение от 0 до 1, я хочу показать результат с одним десятичным знаком, а наоборот, я хочу показать результат с любым десятичным знаком. Можно использовать условное форматирование? Если да, то как я могу это сделать?
Apache POI Как изменить формат данных с условным форматированием
Ответы (5)
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.
person
Filipe Bernardes
schedule
03.03.2016
Вот код, который удовлетворит ваше требование:
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();
person
Sunil Gulabani
schedule
04.12.2012
Используйте DataFormatter для форматирования значений ячеек.
Пример проверки: http://www.roseindia.net/java/poi/setdataformat.shtml< /а>
Ссылка API: http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/DataFormatter.html
Это может помочь вам.
person
Sunil Gulabani
schedule
04.12.2012
Формат данных может форматировать только положительный, отрицательный, ноль и текст. Мне нужно использовать условное форматирование. Или, если формат данных может это сделать, что это за строка формата данных?
- person JBerta93; 04.12.2012
style.setDataFormat(HSSFDataFormat.getBuiltinFormat(@)); используя этот формат данных, мы можем присвоить ячейке значение в виде строки. То есть начальные нули не удаляются при изменении листа Excel.
- person swamy; 06.12.2012
style.setDataFormat(HSSFDataFormat.getBuiltinFormat("@"));
используя этот формат данных, мы можем присвоить ячейке значение в виде строки.
person
swamy
schedule
06.12.2012
Привет, официального способа нет, но я запустил его с помощью небольшого взлома:
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);
}
person
SkateScout
schedule
08.08.2019