[]
GcExcel 允许使用 IRange 接口中的 setValue 方法来将自定义对象、一维或二维数组设置在某个区域中。但自定义对象不支持 Excel I/O。
自定义对象在执行Json序列化和反序列化时被丢弃(内置的SpreadJS互操作类型除外)。 但是,可以通过设置Workbook.ValueJsonSerializer属性来覆盖此行为。
将带有自定义对象的工作表导出为PDF、HTML或图像格式时, 可以使用Convert.ToString将自定义Object导出为字符串。如果单元格太窄,无法容纳内容,则导出显示######。
执行剪切和复制操作时,可以将自定义对象复制或移动到其他范围工作表和工作簿。自定义对象总是通过引用进行复制,其中一些甚至是结构。
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.
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");