Changeset 7647


Ignore:
Timestamp:
Mar 13, 2019, 2:37:22 PM (3 years ago)
Author:
Nicklas Nordborg
Message:

References #2160: Table exporter should support exporting to Excel files

Added support for numeric values.

Location:
trunk/src/core/net/sf/basedb/util
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/core/net/sf/basedb/util/excel/CellStyleCreator.java

    r7646 r7647  
    2424  private final DataFormat dataFormat;
    2525  private final Map<String, CellStyle> styles;
     26  private final CellStyle intStyle;
    2627
    2728  /**
     
    3334    this.dataFormat = workbook.createDataFormat();
    3435    this.styles = new HashMap<String, CellStyle>();
     36    this.intStyle = getCellStyle("0");
    3537  }
    3638 
     
    5355    }
    5456    return excelFormat;
     57  }
     58 
     59 
     60  /**
     61    Get the cell style for formatting numbers without decimals.
     62    This is equivalent to {@link #getCellStyle(String)} with "0"
     63    as parameter.
     64  */
     65  public CellStyle getIntCellStyle()
     66  {
     67    return intStyle;
    5568  }
    5669 
  • trunk/src/core/net/sf/basedb/util/excel/ExcelValue.java

    r7646 r7647  
    2323    This creates a blank cell.
    2424  */
    25   public static final ExcelValue<Void> EMPTY_CELL = new BlankValue();
     25  public static final ExcelValue<Void> EMPTY_CELL = new BlankValue<>();
    2626 
    2727  /**
     
    5757  }
    5858 
     59  /**
     60    Create a numeric cell value without any decimals.
     61    Same as calling {@link #asNumber(Number, int)} with
     62    0 for the numDecimals parameter.
     63  */
     64  public static final ExcelValue<Number> asInt(Number value)
     65  {
     66    return new IntValue(value);
     67  }
     68
     69  /**
     70    Create a numeric cell value and display a given number of
     71    decimals. The numDecimals should be between 0 and 15,
     72    or the "General" format will be used.
     73  */
     74  public static final ExcelValue<Number> asNumber(Number value, int numDecimals)
     75  {
     76    return new NumericValue(value, numberFormat(numDecimals));
     77  }
     78 
     79  /**
     80    Create a numeric cell value with a custom numeric format.
     81  */
     82  public static final ExcelValue<Number> asNumber(Number value, String format)
     83  {
     84    return new NumericValue(value, format);
     85  }
     86 
     87  /**
     88    Creates a format string for formatting numbers with the given number
     89    of decimals (between 0 and 15).
     90  */
     91  public static String numberFormat(int numDecimals)
     92  {
     93    if (numDecimals < 0 || numDecimals > 15) return null;
     94    if (numDecimals == 0) return "0";
     95    StringBuilder sb = new StringBuilder(2+numDecimals);
     96    sb.append("0.");
     97    for (int i = 0; i < numDecimals; i++)
     98    {
     99      sb.append("0");
     100    }
     101    return sb.toString();
     102  }
     103 
    59104  protected final T value;
    60105  protected final String format;
     
    92137    Represents a blank cell.
    93138  */
    94   static class BlankValue
    95     extends ExcelValue<Void>
     139  static class BlankValue<T>
     140    extends ExcelValue<T>
    96141  {
    97142    BlankValue()
     
    147192  }
    148193 
     194  /**
     195    Represents a cell with a numeric value without decimals.
     196  */
     197  static class IntValue
     198    extends ExcelValue<Number>
     199  {
     200    IntValue(Number value)
     201    {
     202      super(value, null);
     203    }
     204   
     205    @Override
     206    public void writeTo(Cell cell, CellStyleCreator styleCreator)
     207    {
     208      if (value == null)
     209      {
     210        EMPTY_CELL.writeTo(cell, styleCreator);
     211      }
     212      else
     213      {
     214        cell.setCellValue(value.doubleValue());
     215      }
     216      cell.setCellStyle(styleCreator.getIntCellStyle());
     217    }
     218   
     219  }
     220
     221 
     222  /**
     223    Represents a cell with a numeric value.
     224  */
     225  static class NumericValue
     226    extends ExcelValue<Number>
     227  {
     228    NumericValue(Number value, String format)
     229    {
     230      super(value, format);
     231    }
     232   
     233    @Override
     234    public void writeTo(Cell cell, CellStyleCreator styleCreator)
     235    {
     236      if (value == null)
     237      {
     238        EMPTY_CELL.writeTo(cell, styleCreator);
     239      }
     240      else
     241      {
     242        cell.setCellValue(value.doubleValue());
     243      }
     244      if (format != null)
     245      {
     246        cell.setCellStyle(styleCreator.getCellStyle(format));
     247      }
     248    }
     249  }
     250 
    149251}
  • trunk/src/core/net/sf/basedb/util/formatter/AdaptiveNumberFormatter.java

    r6268 r7647  
    2323
    2424import net.sf.basedb.util.Values;
     25import net.sf.basedb.util.excel.ExcelValue;
    2526
    2627/**
     
    6465  {
    6566    if (value == null) return "";
     67    return Values.formatNumber(value.floatValue(), getNumDecimals(value));
     68  }
     69  // -------------------------------------------
     70
     71  /**
     72    @since 3.15
     73  */
     74  @Override
     75  public ExcelValue<Number> toExcelValue(Number value)
     76  {
     77    return ExcelValue.asNumber(value, getNumDecimals(value));
     78  }
     79
     80  private int getNumDecimals(Number value)
     81  {
    6682    int numDecimals = precision;
    67     if (precision >= 0)
     83    if (precision >= 0 && value != null)
    6884    {
    6985      int orderOfMagnitude = (int)Math.floor(Math.log10(Math.abs(value.doubleValue()))); // =0 for values between 1-10
     
    7389      if (numDecimals > 7) numDecimals = 7;
    7490    }
    75     return Values.formatNumber(value.floatValue(), numDecimals);
     91    return numDecimals;
    7692  }
    77   // -------------------------------------------
    78 
    7993}
  • trunk/src/core/net/sf/basedb/util/formatter/IntegerFormatter.java

    r6127 r7647  
    2222package net.sf.basedb.util.formatter;
    2323
     24import net.sf.basedb.util.excel.ExcelFormatter;
     25import net.sf.basedb.util.excel.ExcelValue;
    2426
    2527/**
     
    3133*/
    3234public class IntegerFormatter
    33   implements Formatter<Number>
     35  implements Formatter<Number>, ExcelFormatter<Number, Number>
    3436{
    3537
     
    7375  // -------------------------------------------
    7476
     77  /**
     78    @since 3.15
     79  */
     80  @Override
     81  public ExcelValue<Number> toExcelValue(Number value)
     82  {
     83    return ExcelValue.asInt(value);
     84  }
     85
    7586}
  • trunk/src/core/net/sf/basedb/util/formatter/NumberFormatter.java

    r6127 r7647  
    2323
    2424import net.sf.basedb.util.Values;
     25import net.sf.basedb.util.excel.ExcelFormatter;
     26import net.sf.basedb.util.excel.ExcelValue;
    2527
    2628/**
     
    3234*/
    3335public class NumberFormatter
    34   implements Formatter<Number>
     36  implements Formatter<Number>, ExcelFormatter<Number, Number>
    3537{
    3638
     
    7880  // -------------------------------------------
    7981
     82  /**
     83    @since 3.15
     84  */
     85  @Override
     86  public ExcelValue<Number> toExcelValue(Number value)
     87  {
     88    return ExcelValue.asNumber(value, numDecimals);
     89  }
     90
    8091}
Note: See TracChangeset for help on using the changeset viewer.