[]
        
(Showing Draft Content)

区域设置自定义对象

GcExcel 允许使用 IRange 接口中的 setValue 方法来将自定义对象、一维或二维数组设置在某个区域中。但自定义对象不支持 Excel I/O。

以下操作可以使用自定义对象

Json 序列化及反序列化

自定义对象在执行Json序列化和反序列化时被丢弃(内置的SpreadJS互操作类型除外)。 但是,可以通过设置Workbook.ValueJsonSerializer属性来覆盖此行为。

导出为PDF、HTML或图像格式

将带有自定义对象的工作表导出为PDF、HTML或图像格式时, 可以使用Convert.ToString将自定义Object导出为字符串。如果单元格太窄,无法容纳内容,则导出显示######。

复制与粘贴

执行剪切和复制操作时,可以将自定义对象复制或移动到其他范围工作表和工作簿。自定义对象总是通过引用进行复制,其中一些甚至是结构。

Range.Text:

Range.Text带有自定义对象时,需要使用Convert.ToString方法。

内置公式:

当使用内置公式时,区域引用会被当作自定义对象,包括数组公式,例如{A1:D3}。 内置公式使用自定义对象时,会有以下情况:

  • 将跳过模式匹配(lookup)公式中自定义对象的范围引用。

  • 如果自定义数据类型没有意义,则跳过聚合公式(主要是SUM*、统计公式和数据库公式)中自定义对象的范围引用。

  • 如果可以接受自定义数据类型,则接受聚合公式中的自定义对象。例如,自定义对象在COUNTA函数中计数。

  • 以下公式会返回特殊值:

    • ISERROR: 总是返回 FALSE。

    • TYPE: 总是返回 #VALUE!

    • ERROR.TYPE:总是返回 #N/A。

  • 其它情况下,自定义对象会被视为#VALUE。

当使用以下运算符或者公式是,应当替换为:

运算符:

  • 使用 Object.Equals 替换 =

  • 使用 != 替换 <>

公式:

  • 使用 Object.ReferenceEquals 替换 EXACT

  • 使用 Convert.ToString 替换 TEXT

条形码

以下条形码公式,可以支持自定义对象:

  • BC_CODABAR

  • BC_CODE128

  • BC_CODE39

  • BC_CODE49

  • BC_CODE93

  • BC_DATAMATRIX

  • BC_EAN13

  • BC_EAN8

  • BC_GS1_128

  • BC_PDF417

  • BC_QRCODE

参考以下示例代码,将二维数组设置作为自定义对象设给一个单元格区域。

//create a new workbook
Workbook workbook = new Workbook();
IWorksheet activeSheet = workbook.getActiveSheet();
IRange a1 = activeSheet.getRange("A1");
HashMap dict = new HashMap();
dict.put("TempData1", 1);
dict.put("TempData2", "Temp value 2");
dict.put("TempData3", 3);
dict.put("TempData4", "Temp value 4");

// Set temporary data to a range
a1.setValue(dict);

// Display the custom object later
HashMap obj = (HashMap) a1.getValue();
int row = 1;
for (Map.Entry kv : obj.entrySet()) {
    activeSheet.getRange("B" + row).setValue(kv.getKey());
    activeSheet.getRange("C" + row).setValue(kv.getValue());
    row += 1;
}

// Arrange
activeSheet.getColumns().autoFit();
activeSheet.getColumns().get(0).setHidden(true);

//save to an pdf file
workbook.save("SetCustomRangeValue.pdf");

参考下列代码重写JSON序列化行为

// The JSON converter class
class GsonConverter implements IJsonSerializer {
    private final Gson _gson = new Gson();
    private final Class _type;

    public GsonConverter(Class type) {
        _type = type;
    }

    private final GenericStaticFieldValueProvider>s_instanceProvider =
            new GenericStaticFieldValueProvider>();

    public GsonConverter GetInstance(Class canon) {
        GsonConverter instance = (GsonConverter) s_instanceProvider.getValue(canon);
        if (instance != null) {
            return instance;
        }
        instance = new GsonConverter(canon);
        s_instanceProvider.setValue(canon, instance);
        return instance;
    }

    public final Object deserialize(String json) {
        JsonObject jObject = new JsonParser().parse(json).getAsJsonObject();
        String typeName = jObject.get("typeName").getAsString();
        if (typeName.equals(_type.getSimpleName())) {
            jObject.remove("typeName");
            return _gson.fromJson(jObject, _type);
        }
        return null;
    }

    public final String serialize(Object value) {
        JsonObject jObject = _gson.toJsonTree(value).getAsJsonObject();
        jObject.addProperty("typeName", _type.getSimpleName());
        return _gson.toJson(jObject);
    }

} // End Class ' GsonConverter

// Workaround for "Cannot make a static reference to the non-static type T"
class GenericStaticFieldValueProvider {
    private final ConcurrentHashMap,TValue>_value =new ConcurrentHashMap,TValue>();

    public TValue getValue(Class canon) {
        return (TValue) _value.get(canon);
    }

    public void setValue(Class canon, TValue value) {
        _value.put(canon, value);
    }
} // End Class

public void overrideJSON() {
    // Usage
    Workbook.setValueJsonSerializer(GsonConverter.GetInstance(ValueWithUnit.class));
}

注意: java.math.BigInteger 将自定义对象当作 java.lang.Double.

设置BigDecimal

GcExcel允许您使用IRange.setValue将BigDecimal值设置为一个范围。默认情况下,这些值被视为双精度值。但是,也可以通过设置 IDataOptions.setBigDecimalAsDouble 为 false 将 BigDecimal 的值转换为自定义对象。该接口还提供 getBigDecimalAsDouble 方法,以获取BigDecimal值是被视为Double对象还是自定义对象。

setBigDecimalAsDouble(true)

setBigDecimalAsDouble(false)



// Create a new workbook
Workbook workbook = new Workbook();
Object[] objects = new Object[] { new BigDecimal("3679523593914784257459000.7512"),
        new BigDecimal("123456789012345678901234567890.45561462"), };
        
// Treat BigDecimal as Custom Object.
workbook.getOptions().getData().setBigDecimalAsDouble(false);
IWorksheet activeSheet = workbook.getActiveSheet();

activeSheet.getRange("A1:A2").setColumnWidth(200);
activeSheet.getRange("A1:A2").setRowHeight(40);
activeSheet.getRange("A1:A2").getFont().setSize(30);
activeSheet.getRange("A1:A2").setValue(objects);

// Save to a pdf file
workbook.save("BigDecimalAsDouble.pdf");