[]
GcExcel 允许您与 JSON 字符串之间导入和导出以下功能。
您可以使用IWorkbook接口的toJson方法,将工作簿导出为 JSON 字符串/流。该方法甚至支持导出包含带有外部引用公式的工作簿。您也可以使用IWorkbook接口的fromJson方法,将 JSON 字符串或流导入到工作簿中。
参考以下示例代码,实现 JSON 流的导入和导出:
// 创建工作簿
Workbook workbook = new Workbook();
Workbook workbook1 = new Workbook();
// 导入 Excel 文件
workbook.open("test.xlsx");
// 与 JSON 字符串之间进行导入或导出
OutputStream outputStream = new ByteArrayOutputStream();
workbook.toJson(outputStream);
ByteArrayOutputStream buffer = (ByteArrayOutputStream) outputStream;
byte[] bytes = buffer.toByteArray();
InputStream inputStream = new ByteArrayInputStream(bytes);
workbook1.fromJson(inputStream);
// 将工作簿导出为 Excel 文件
workbook1.save("json_out.xlsx");您可以使用IWorksheet接口的toJson方法,将工作表中的信息导出为 JSON 字符串。同样,您也可以使用IWorksheet接口的fromJson方法,将 JSON 字符串导入到工作表中。工作表还可以导出或导入到同一个或另一个工作簿中。
它还能让您在 SpreadJS 中查看大型 Excel 文件。您可以在 GcExcel 中打开 Excel 文件,然后使用toJson方法导出工作表的 JSON 字符串。此外,可将工作表的 JSON 字符串传输到客户端,以在 SpreadJS 中加载。
限制(Limitations)
在服务器上向另一个工作簿导入工作表 JSON 可能会导致数据丢失或冲突
SpreadJS ssjson 中使用的单元格样式,在通过 Worksheet.toJSON() 方法处理后,在 Excel 中会丢失
SpreadJS 不支持 Excel 的所有页面设置。因此,GcExcel 从 ssjson 导入时无法获取所有设置
参考以下示例代码,实现工作表 JSON 字符串的导出和导入:
Workbook workbook = new Workbook();
// ToJson 和 FromJson 可与 SpreadJS 产品结合使用
// 导入 Excel 文件
String source = "ExcelJsonInput.xlsx";
workbook.open(source);
// 打开文件
IWorkbook new_workbook = new Workbook();
new_workbook.open(source);
for (IWorksheet worksheet : workbook.getWorksheets()) {
worksheet.getRange("A1:C4").setValue(new Object[][] {
{ "设备(Device)", "数量(Quantity)", "单价(Unit Price)" },
{ "T540p", 12, 9850 },
{ "T570", 5, 7460 },
{ "Y460", 6, 5400 },
{ "Y460F", 8, 6240 }
});
// 将工作表导出为 JSON 字符串
String json = worksheet.toJson();
// 可使用该 JSON 字符串初始化 SpreadJS 产品
// SpreadJS 产品将显示 Excel 文件内容
// 可使用 SpreadJS 产品导出工作表的 JSON 字符串
// 更新对应工作表的内容
new_workbook.getWorksheets().get(worksheet.getName()).fromJson(json);
}
// 将工作簿导出为 Excel 文件
String export = "ExcelJsonOutput.xlsx";
new_workbook.save(export);参考以下示例代码,该代码使用IShape.fromJson方法,通过 JSON 字符串更新形状、图表和图片:
// 创建新工作簿
Workbook workbook = new Workbook();
IWorksheet worksheet = workbook.getWorksheets().get(0);
worksheet.getRange("A1:D6").setValue(new Object[][]{
{null, "S1", "S2", "S3"},
{"Item1", 10, 25, 25},
{"Item2", -51, -36, 27},
{"Item3", 52, -85, -30},
{"Item4", 22, 65, 65},
{"Item5", 23, 69, 69}
});
// 添加临时形状
IShape shape = worksheet.getShapes().addShape(AutoShapeType.Rectangle, 10, 10, 100, 100);
// 从 JSON 更新形状
shape.fromJson("{\"isLocked\":true,\"canPrint\":true,\"dynamicMove\":true,\"dynamicSize\":true," +
"\"allowResize\":true,\"allowRotate\":true,\"allowMove\":true,\"showHandle\":true,\"alt\":\"\"," +
"\"formulaItems\":{\"line\":{\"color\":\"rgb(31,79,122)\",\"lineStyle\":0,\"width\":1,\"capType\":2," +
"\"joinType\":0,\"transparency\":0}},\"shapeData\":{\"anchorType\":0,\"startPoint\":{\"row\":1," +
"\"col\":0,\"rowOffset\":11,\"colOffset\":38},\"endPoint\":{\"row\":8,\"col\":4,\"rowOffset\":2," +
"\"colOffset\":27},\"editAs\":0,\"sp\":{\"shapeType\":5,\"nvSpPr\":{\"cNvPr\":{\"id\":2,\"name\":" +
"\"rightArrowCallout 1\",\"hidden\":false,\"title\":\"\"},\"cNvSpPr\":{\"txBox\":false}},\"spPr\"" +
":{\"xfrm\":{\"flipH\":false,\"flipV\":false,\"rot\":0,\"off\":{\"x\":38,\"y\":31},\"ext\":{\"cx\"" +
":237,\"cy\":131}},\"prstGeom\":{\"prst\":56,\"avLst\":{}},\"extLst\":{\"ext\":[]},\"solidFill\":" +
"{\"schemeClr\":{\"val\":9,\"lumMod\":[60000],\"lumOff\":[40000]}},\"ln\":{\"solidFill\":{\"srgbClr\"" +
":{\"val\":[31,79,122]}},\"w\":1,\"prstDash\":0,\"cap\":2,\"round\":true},\"effectLst\":{}},\"style\":" +
"{\"fillRef\":{\"ColorProp\":{\"colorFillType\":0,\"schemeClr\":{\"val\":-4142}},\"idx\":1},\"lnRef\":" +
"{\"ColorProp\":{\"colorFillType\":0,\"schemeClr\":{\"val\":-4142}},\"idx\":2},\"fontRef\":{" +
"\"TextCharacterProperties\":{\"latin\":{\"typeface\":\"+mn-lt\"},\"sz\":14.666666666666666," +
"\"solidFill\":{\"srgbClr\":{\"val\":[255,255,255]}}},\"idx\":1},\"effectRef\":{\"idx\":0,\"ColorProp\":{" +
"\"colorFillType\":0,\"schemeClr\":{\"val\":4}}}},\"txBody\":{\"p\":[{\"elements\":[{\"elementType\":0,\"t" +
"\":\"\",\"rPr\":{\"latin\":{\"typeface\":\"Calibri\"},\"sz\":14.6667,\"b\":false,\"i\":false,\"solidFill" +
"\":{\"srgbClr\":{\"val\":[255,255,255]}}}}],\"pPr\":{\"defRPr\":{\"latin\":{\"typeface\":\"Calibri\"},\"sz" +
"\":14.6667,\"b\":false,\"i\":false,\"solidFill\":{\"srgbClr\":{\"val\":[255,255,255]}}},\"algn\":0}," +
"\"endParaRPr\":{}}],\"bodyPr\":{\"anchor\":0,\"horzOverflow\":1,\"vertOverflow\":2},\"lstStyle\":{}}}}," +
"\"name\":\"rightArrowCallout 1\",\"shapeType\":5}");
// 添加临时图表
IShape chart = worksheet.getShapes().addChart(ChartType.ColumnClustered, 300, 10, 300, 300);
// 从 JSON 更新图表
chart.fromJson("{\"name\":\"Chart 1\",\"x\":145,\"y\":133,\"width\":480,\"height\":300," +
"\"startRow\":6,\"startRowOffset\":13,\"startColumn\":2,\"startColumnOffset\":21," +
"\"endRow\":21,\"endRowOffset\":13,\"endColumn\":10,\"endColumnOffset\":5," +
"\"isSelected\":true,\"typeName\":\"2\",\"chartSpace\":{\"typeName\":" +
"\"chartSpace\",\"roundedCorners\":false,\"chart\":{\"title\":{\"txPr" +
"\":{\"p\":[{\"elements\":[{\"elementType\":0,\"t\":\"\",\"rPr\":{" +
"\"latin\":{\"typeface\":\"+mn-lt\"},\"sz\":18.67,\"b\":false,\"solidFill" +
"\":{\"schemeClr\":{\"val\":1,\"lumMod\":[65000],\"lumOff\":[35000]}}}}]," +
"\"pPr\":{\"defRPr\":{\"latin\":{\"typeface\":\"+mn-lt\"},\"sz\":18.67,\"b" +
"\":false,\"solidFill\":{\"schemeClr\":{\"val\":1,\"lumMod\":[65000],\"lumOff" +
"\":[35000]}}}},\"endParaRPr\":{}}],\"bodyPr\":{},\"lstStyle\":{}},\"overlay" +
"\":false,\"spPr\":{\"noFill\":true,\"ln\":{\"noFill\":true},\"effectLst\":{}}}," +
"\"autoTitleDeleted\":false,\"plotArea\":{\"axes\":[{\"axisType\":0,\"axId\":31410946," +
"\"delete\":false,\"majorTickMark\":2,\"minorTickMark\":2,\"tickLblPos\":2,\"axPos\":0," +
"\"scaling\":{\"orientation\":1},\"spPr\":{\"ln\":{\"solidFill\":{\"schemeClr\":{\"val" +
"\":1,\"lumMod\":[15000],\"lumOff\":[85000]}}}},\"numFmt\":{\"formatCode\":\"General\"}," +
"\"txPr\":{\"p\":[{\"elements\":[{\"elementType\":0,\"t\":\"\",\"rPr\":{\"latin\":{\"typeface" +
"\":\"+mn-lt\"},\"sz\":12,\"b\":false,\"solidFill\":{\"schemeClr\":{\"val\":1,\"lumMod\":[65000]," +
"\"lumOff\":[35000]}}}}],\"pPr\":{\"defRPr\":{\"latin\":{\"typeface\":\"+mn-lt\"},\"sz\":12,\"b" +
"\":false,\"solidFill\":{\"schemeClr\":{\"val\":1,\"lumMod\":[65000],\"lumOff\":[35000]}}}}," +
"\"endParaRPr\":{}}]},\"auto\":true,\"lblOffset\":0,\"tickMarkSkip\":1,\"noMultiLvlLbl\":true," +
"\"AxisGroup\":0,\"AxisType\":0,\"crosses\":1,\"crossAx\":38384719},{\"axisType\":3,\"axId\":38384719," +
"\"delete\":false,\"majorTickMark\":2,\"minorTickMark\":2,\"tickLblPos\":2,\"axPos\":1,\"scaling" +
"\":{\"orientation\":1},\"spPr\":{\"ln\":{\"solidFill\":{\"schemeClr\":{\"val\":1,\"lumMod\":[15000]," +
"\"lumOff\":[85000]}}}},\"numFmt\":{\"formatCode\":\"General\"},\"txPr\":{\"p\":[{\"elements\":[{" +
"\"elementType\":0,\"t\":\"\",\"rPr\":{\"latin\":{\"typeface\":\"+mn-lt\"},\"sz\":12,\"b\":false," +
"\"solidFill\":{\"schemeClr\":{\"val\":1,\"lumMod\":[65000],\"lumOff\":[35000]}}}}],\"pPr\":{\"defRPr" +
"\":{\"latin\":{\"typeface\":\"+mn-lt\"},\"sz\":12,\"b\":false,\"solidFill\":{\"schemeClr\":{\"val\":1," +
"\"lumMod\":[65000],\"lumOff\":[35000]}}}},\"endParaRPr\":{}}]},\"majorGridlines\":{\"spPr\":{\"ln\":{" +
"\"solidFill\":{\"srgbClr\":{\"val\":[217,217,217]}},\"w\":1},\"effectLst\":{}}},\"AxisGroup\":0," +
"\"AxisType\":1,\"crosses\":1,\"crossBetween\":0,\"crossAx\":31410946}],\"chartGroups\":[{\"chartType" +
"\":6,\"ser\":[{\"seriesType\":0,\"idx\":0,\"order\":0,\"tx\":{\"strRef\":{\"f\":\"Sheet1!$A$2\"}}," +
"\"cat\":{\"strRef\":{\"f\":\"Sheet1!$B$1:$D$1\"}},\"val\":{\"numRef\":{\"f\":\"Sheet1!$B$2:$D$2\"," +
"\"numCache\":{\"formatCode\":\"General\"}}},\"shape\":2,\"invertIfNegative\":false},{\"seriesType" +
"\":0,\"idx\":1,\"order\":1,\"tx\":{\"strRef\":{\"f\":\"Sheet1!$A$3\"}},\"cat\":{\"strRef\":{\"f\":" +
"\"Sheet1!$B$1:$D$1\"}},\"val\":{\"numRef\":{\"f\":\"Sheet1!$B$3:$D$3\",\"numCache\":{\"formatCode" +
"\":\"General\"}}},\"shape\":2,\"invertIfNegative\":false},{\"seriesType\":0,\"idx\":2,\"order\":2," +
"\"tx\":{\"strRef\":{\"f\":\"Sheet1!$A$4\"}},\"cat\":{\"strRef\":{\"f\":\"Sheet1!$B$1:$D$1\"}},\"val" +
"\":{\"numRef\":{\"f\":\"Sheet1!$B$4:$D$4\",\"numCache\":{\"formatCode\":\"General\"}}},\"shape\":2," +
"\"invertIfNegative\":false},{\"seriesType\":0,\"idx\":3,\"order\":3,\"tx\":{\"strRef\":{\"f\":" +
"\"Sheet1!$A$5\"}},\"cat\":{\"strRef\":{\"f\":\"Sheet1!$B$1:$D$1\"}},\"val\":{\"numRef\":{\"f\":" +
"\"Sheet1!$B$5:$D$5\",\"numCache\":{\"formatCode\":\"General\"}}},\"shape\":2,\"invertIfNegative" +
"\":false},{\"seriesType\":0,\"idx\":4,\"order\":4,\"tx\":{\"strRef\":{\"f\":\"Sheet1!$A$6\"}}," +
"\"cat\":{\"strRef\":{\"f\":\"Sheet1!$B$1:$D$1\"}},\"val\":{\"numRef\":{\"f\":\"Sheet1!$B$6:$D$6\"," +
"\"numCache\":{\"formatCode\":\"General\"}}},\"shape\":2,\"invertIfNegative\":false}],\"axId\":[31410946," +
"38384719],\"barDir\":1,\"grouping\":1,\"gapWidth\":150,\"varyColors\":false,\"overlap\":-27}],\"spPr\":{" +
"\"noFill\":true,\"ln\":{\"noFill\":true}}},\"legend\":{\"legendPos\":4,\"spPr\":{\"noFill\":true,\"ln\":{" +
"\"noFill\":true}},\"txPr\":{\"p\":[{\"elements\":[{\"elementType\":0,\"t\":\"\",\"rPr\":{\"latin\":{\"typeface" +
"\":\"+mn-lt\"},\"sz\":12,\"b\":false,\"solidFill\":{\"schemeClr\":{\"val\":1,\"lumMod\":[65000],\"lumOff" +
"\":[35000]}}}}],\"pPr\":{\"defRPr\":{\"latin\":{\"typeface\":\"+mn-lt\"},\"sz\":12,\"b\":false,\"solidFill" +
"\":{\"schemeClr\":{\"val\":1,\"lumMod\":[65000],\"lumOff\":[35000]}}}},\"endParaRPr\":{}}]}},\"plotVisOnly" +
"\":true,\"dispBlanksAs\":1,\"dispNaAsBlank\":false},\"spPr\":{\"solidFill\":{\"schemeClr\":{\"val\":0}}," +
"\"ln\":{\"solidFill\":{\"schemeClr\":{\"val\":1,\"lumMod\":[15000],\"lumOff\":[85000]}},\"w\":1}},\"txPr" +
"\":{\"p\":[{\"elements\":[{\"elementType\":0,\"t\":\"\",\"rPr\":{\"latin\":{\"typeface\":\"+mn-lt\"}," +
"\"b\":false,\"solidFill\":{\"schemeClr\":{\"val\":1,\"lumMod\":[65000],\"lumOff\":[35000]}}}}],\"pPr" +
"\":{\"defRPr\":{\"latin\":{\"typeface\":\"+mn-lt\"},\"b\":false,\"solidFill\":{\"schemeClr\":{\"val" +
"\":1,\"lumMod\":[65000],\"lumOff\":[35000]}}}},\"endParaRPr\":{}}]}},\"useAnimation\":false}");
// 从 JSON 更新图片
IShape picture = worksheet.getShapes().addPicture(null, 0, 0, 100, 100);
picture.fromJson("{\"name\":\"Picture1\",\"x\":350,\"y\":10,\"width\":25,\"height\":25,\"startRow" +
"\":0,\"startRowOffset\":10,\"startColumn\":5,\"startColumnOffset\":40,\"endRow\":6,\"endRowOffset" +
"\":3,\"endColumn\":13,\"endColumnOffset\":22,\"isSelected\":true,\"typeName\":\"1\",\"src\":" +
"\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAA" +
"RnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAGASURBVDhPY/wPBAwUACYojRX8+/cPysINaOsCYgBWA0" +
"4dvsyQ5FjNYM4ZBsbJTtUMp49chspCwIe3n8E0hhea0qcxrJy1jYGNgZWBk48DKPKf4funnwy/Gf4wRGR4MTAyMzCsmLq" +
"dQVZJgmHb3VlAaSRw/ui1/5oMXv8NGAP+b1mxHyr6H8g+8F8fKGYrEP3fiifyvwVn+H8uBgOwHIoXtiw7yMDPycugZ6XO4" +
"B3uABVlALLtGQyAYoyMjAzCkgIMlbPTGL7+Pw+WgxuwecV+htO7LjGwcrAyMELFkAEjEyPDrx+/GcxcdRn8op2golADuBg" +
"NGdqSZjK8ef4B5CeGC8duMmxffQisAAR2rDnMcP7IdYaP3z8zeEbaQUUhAByIXirpDI/uPmMIy/RkYPzHyLBy5jYGFgZmBl5B" +
"brCiz++/AoPwL0NwihtD4+xcsBgcgAx49/oDiIKDU4cu/U90qPpvwhr835gl+H+8XcX/4wfOQ2VRwSBNiaQACg1gYAAANcPHor" +
"58W6sAAAAASUVORK5CYII=\",\"backColor\":\"#FFFFFF\",\"borderRadius\":3,\"borderStyle\":" +
"\"solid\",\"borderColor\":\"#000000\",\"originalWidth\":15,\"originalHeight\":15}");
// 保存为 Excel 文件
workbook.save("ShapeChartPictureFromJson.xlsx");请注意:
形状、图表和图片使用相同的IShape接口来导入或导出 JSON 字符串。但需注意,JSON 信息必须与调用者的类型匹配。例如,如果 IShape 是一个图表,而 JSON 包含的是图片信息,使用 IShape.FromJson 可能会导致意外错误。
参考以下示例代码,该代码使用IRange.fromJson方法,通过 JSON 字符串更新单元格区域:
// 创建新工作簿
Workbook workbook = new Workbook();
IWorksheet worksheet = workbook.getWorksheets().get(0);
worksheet.getRange("B2:D4").fromJson("{\"0\":{\"0\":{\"value\":1},\"1\":{\"value\":2}},\"1\":{\"0\":{\"value\":\"aaa\",\"style\":{" +
"\"backColor\":\"rgb(173,216,230)\",\"font\":\"normal normal 11pt Calibri,sans-serif\",\"foreColor\":\"Text 1\",\"themeFont\":" +
"\"Body\",\"borderLeft\":{\"color\":null,\"style\":0},\"borderTop\":{\"color\":null,\"style\":0},\"borderRight\":{\"color" +
"\":null,\"style\":0},\"borderBottom\":{\"color\":null,\"style\":0},\"borderHorizontal\":{\"color\":null,\"style\":0}," +
"\"borderVertical\":{\"color\":null,\"style\":0},\"locked\":true,\"hAlign\":3,\"vAlign\":2,\"textIndent\":0,\"wordWrap\":false," +
"\"shrinkToFit\":false,\"formatter\":\"General\",\"quotePrefix\":false}},\"1\":{\"value\":\"bbb\",\"style\":{\"backColor\":" +
"\"rgb(173,216,230)\",\"font\":\"normal normal 11pt Calibri,sans-serif\",\"foreColor\":\"Text 1\",\"themeFont\":\"Body\"," +
"\"borderLeft\":{\"color\":null,\"style\":0},\"borderTop\":{\"color\":null,\"style\":0},\"borderRight\":{\"color\":null,\"style" +
"\":0},\"borderBottom\":{\"color\":null,\"style\":0},\"borderHorizontal\":{\"color\":null,\"style\":0},\"borderVertical\":{\"color" +
"\":null,\"style\":0},\"locked\":true,\"hAlign\":3,\"vAlign\":2,\"textIndent\":0,\"wordWrap\":false,\"shrinkToFit\":false,\"formatter" +
"\":\"General\",\"quotePrefix\":false}},\"2\":{\"style\":{\"backColor\":\"rgb(173,216,230)\",\"font\":\"normal normal 11pt Calibri," +
"sans-serif\",\"foreColor\":\"Text 1\",\"themeFont\":\"Body\",\"borderLeft\":{\"color\":null,\"style\":0},\"borderTop\":{\"color\":null," +
"\"style\":0},\"borderRight\":{\"color\":null,\"style\":0},\"borderBottom\":{\"color\":null,\"style\":0},\"borderHorizontal\":{\"color" +
"\":null,\"style\":0},\"borderVertical\":{\"color\":null,\"style\":0},\"locked\":true,\"hAlign\":3,\"vAlign\":2,\"textIndent\":0," +
"\"wordWrap\":false,\"shrinkToFit\":false,\"formatter\":\"General\",\"quotePrefix\":false}}},\"2\":{\"0\":{\"style\":{\"backColor" +
"\":\"rgb(173,216,230)\",\"font\":\"normal normal 11pt Calibri,sans-serif\",\"foreColor\":\"Text 1\",\"themeFont\":\"Body\",\"borderLeft" +
"\":{\"color\":null,\"style\":0},\"borderTop\":{\"color\":null,\"style\":0},\"borderRight\":{\"color\":null,\"style\":0},\"borderBottom" +
"\":{\"color\":null,\"style\":0},\"borderHorizontal\":{\"color\":null,\"style\":0},\"borderVertical\":{\"color\":null,\"style\":0}," +
"" +
"" +
"\"locked\":true,\"hAlign\":3,\"vAlign\":2,\"textIndent\":0,\"wordWrap\":false,\"shrinkToFit\":false,\"formatter\":\"General\"," +
"\"quotePrefix\":false}},\"1\":{\"style\":{\"backColor\":\"rgb(173,216,230)\",\"font\":\"normal normal 11pt Calibri,sans-serif\"," +
"\"foreColor\":\"Text 1\",\"themeFont\":\"Body\",\"borderLeft\":{\"color\":null,\"style\":0},\"borderTop\":{\"color\":null,\"style" +
"\":0},\"borderRight\":{\"color\":null,\"style\":0},\"borderBottom\":{\"color\":null,\"style\":0},\"borderHorizontal\":{\"color" +
"\":null,\"style\":0},\"borderVertical\":{\"color\":null,\"style\":0},\"locked\":true,\"hAlign\":3,\"vAlign\":2,\"textIndent\":0," +
"\"wordWrap\":false,\"shrinkToFit\":false,\"formatter\":\"General\",\"quotePrefix\":false}},\"2\":{\"style\":{\"backColor\":" +
"\"rgb(173,216,230)\",\"font\":\"normal normal 11pt Calibri,sans-serif\",\"foreColor\":\"Text 1\",\"themeFont\":\"Body\",\"borderLeft" +
"\":{\"color\":null,\"style\":0},\"borderTop\":{\"color\":null,\"style\":0},\"borderRight\":{\"color\":null,\"style\":0},\"borderBottom" +
"\":{\"color\":null,\"style\":0},\"borderHorizontal\":{\"color\":null,\"style\":0},\"borderVertical\":{\"color\":null,\"style\":0}," +
"\"locked\":true,\"hAlign\":3,\"vAlign\":2,\"textIndent\":0,\"wordWrap\":false,\"shrinkToFit\":false,\"formatter\":\"General\",\"quotePrefix" +
"\":false}}}}");
// 保存为 Excel 文件
workbook.save("RangeFromJson.xlsx");请注意:
使用 IRange.fromJson 时,单元格区域只能是单个区域(如 getRange["A1:B2"])。否则,将抛出 NotSupportedException 异常(如 getRange["A1:B2, C3:D4"])。
使用 IRange.fromJson 时,JSON 中的单元格位置被视为相对位置。如果区域是“B2:C3”,则 JSON 中的第一个单元格数据将被设置到“B2”,无论 JSON 中的单元格索引如何。
如果 JSON 中的单元格位置超出区域范围,数据将会丢失。
参考以下示例代码,该代码使用ISlicer.fromJson方法,通过 JSON 字符串更新切片器:
// 创建新工作簿
Workbook workbook = new Workbook();
IWorksheet worksheet = workbook.getActiveSheet();
worksheet.getRange("A1:F16").setValue(new Object[][]{
{"订单 ID(Order ID)", "产品(Product)", "类别(Category)", "金额(Amount)", "日期(Date)", "国家(Country)" },
{1, "胡萝卜(Carrots)", "蔬菜(Vegetables)", 4270, new GregorianCalendar(2018, 1, 6), "美国(United States)" },
{2, "西兰花(Broccoli)", "蔬菜(Vegetables)", 8239, new GregorianCalendar(2018, 1, 7), "英国(United Kingdom)"},
{3, "香蕉(Banana)","水果(Fruit)", 617, new GregorianCalendar(2018, 1, 8), "美国(United States)" },
{4, "香蕉(Banana)", "水果(Fruit)", 8384, new GregorianCalendar(2018, 1, 10), "加拿大(Canada)" },
{5, "豆类(Beans)", "蔬菜(Vegetables)", 2626, new GregorianCalendar(2018, 1, 10), "德国(Germany)" },
{6, "橙子(Orange)", "水果(Fruit)", 3610, new GregorianCalendar(2018, 1, 11), "美国(United States)" },
{7, "西兰花(Broccoli)", "蔬菜(Vegetables)", 9062, new GregorianCalendar(2018, 1, 11), "澳大利亚(Australia)" },
{8, "香蕉(Banana)", "水果(Fruit)", 6906, new GregorianCalendar(2018, 1, 16), "新西兰(New Zealand)" },
{9, "苹果(Apple)", "水果(Fruit)", 2417, new GregorianCalendar(2018, 1, 16), "法国(France)" },
{10, "苹果(Apple)", "水果(Fruit)", 7431, new GregorianCalendar(2018, 1, 16), "加拿大(Canada)" },
{11, "香蕉(Banana)", "水果(Fruit)", 8250, new GregorianCalendar(2018, 1, 16), "德国(Germany)" },
{12, "西兰花(Broccoli)", "蔬菜(Vegetables)", 7012, new GregorianCalendar(2018, 1, 18), "美国(United States)" },
{13, "胡萝卜(Carrots)", "蔬菜(Vegetables)", 1903, new GregorianCalendar(2018, 1, 20), "德国(Germany)" },
{14, "西兰花(Broccoli)", "蔬菜(Vegetables)", 2824, new GregorianCalendar(2018, 1, 22), "加拿大(Canada)" },
{15, "苹果(Apple)", "水果(Fruit)", 6946, new GregorianCalendar(2018, 1, 24), "法国(France)" },
});
ITable table = worksheet.getTables().add(worksheet.getRange("A1:F16"), true);
ISlicerCache cache = workbook.getSlicerCaches().add(table, "Category");
ISlicer slicer1 = cache.getSlicers().add(worksheet, "cate1", "Category", 200, 200, 100, 200);
// 从 JSON 更新切片器
slicer1.fromJson("{\"name\":\"cate2\",\"x\":400,\"y\":100,\"width\":133.33333333333334,\"height" +
"\":266.66666666666663,\"dynamicMove\":false,\"dynamicSize\":false,\"sourceName\":\"Product\"," +
"\"nameInFormula\":\"Slicer_Category\",\"captionName\":\"Category\",\"columnCount\":1,\"itemHeight" +
"\":23.666666666666668,\"showHeader\":true,\"sortState\":2,\"style\":{\"name\":\"SlicerStyleLight2\"}," +
"\"tableName\":\"Table1\",\"columnName\":\"Category\"}");
// 保存为 Excel 文件
workbook.save("SlicerFromJson.xlsx");请注意:
ISlicer.fromJson 方法不能用于筛选,因为筛选信息未存储在切片器的 JSON 中(基于 SpreadJS 设计)。
如果 JSON 中的切片器与现有切片器同名,将抛出异常。
参考以下示例代码,该代码使用IComment.fromJson方法,通过 JSON 字符串更新批注:
// 创建新工作簿
Workbook workbook = new Workbook();
IWorksheet worksheet = workbook.getActiveSheet();
IComment comment = worksheet.getRange("A1").addComment("Comment1");
// 从 JSON 更新批注
comment.fromJson("{\"text\":\"批注测试(Comment Test)\",\"location\":{\"x\":595.666666666667,\"y\":259.666666666667},\"width" +
"\":100,\"height\":80,\"fontFamily\":\"Tahoma\",\"fontWeight\":\"bold\",\"foreColor\":\"rgb(165,165,165)\",\"backColor\":" +
"\"rgb(255,255,225)\",\"dynamicMove\":false,\"dynamicSize\":false,\"borderWidth\":1.33333333333333,\"borderStyle\":\"solid\"," +
"\"borderColor\":\"rgb(0,0,0)\",\"zIndex\":0,\"rowIndex\":0,\"colIndex\":0}");
// 保存为 Excel 文件
workbook.save("CommentFromJson.xlsx");参考以下示例代码,该代码使用IName.fromJson方法,通过 JSON 字符串生成定义名称:
// 创建新工作簿
Workbook workbook = new Workbook();
IWorksheet worksheet = workbook.getActiveSheet();
// 从 JSON 生成 INames
workbook.getNames().fromJson("[{\"name\":\"Test\",\"formula\":\"100\",\"row\":0,\"col\":0},{\"name\":" +
"\"Test2\",\"formula\":\"200\",\"row\":0,\"col\":0}]");
// IName
IName name = worksheet.getNames().add("temp", "test");
name.fromJson("{\"name\":\"Test3\",\"formula\":\"Sheet1!$H$8\",\"row\":0,\"col\":0}");
// 保存为 Excel 文件
workbook.save("DefinedNamesFromJson.xlsx");参考以下示例代码,该代码使用IPageSetup.fromJson方法,通过 JSON 字符串更新页面设置:
// 创建新工作簿
Workbook workbook = new Workbook();
IWorksheet worksheet = workbook.getActiveSheet();
// 从 JSON 更新页面设置
worksheet.getPageSetup().fromJson("{\"bestFitRows\":true,\"bestFitColumns\":true,\"showBorder" +
"\":false,\"showColumnHeader\":33,\"showRowHeader\":17,\"headerLeft\":23,\"headerCenter" +
"\":14,\"headerRight\":66,\"footerLeft\":22,\"footerCenter\":11,\"footerRight\":12,\"headerLeftImage" +
"\":51,\"headerCenterImage\":23,\"headerRightImage\":12,\"footerLeftImage\":63,\"footerCenterImage" +
"\":21,\"footerRightImage\":12,\"margin\":{\"top\":80,\"bottom\":80,\"left\":30,\"right\":30,\"header" +
"\":20,\"footer\":40},\"paperSize\":{\"width\":850,\"height\":1100,\"kind\":1}}");
// 保存为 Excel 文件
workbook.save("PageSetupFromJson.xlsx");参考以下示例代码,该代码使用IProtectionSettings.fromJson方法,通过 JSON 字符串更新工作表的保护设置:
// 创建新工作簿
Workbook workbook = new Workbook();
IWorksheet worksheet = workbook.getActiveSheet();
// 从 JSON 更新保护设置
worksheet.getProtectionSettings().fromJson("{\"allowSelectLockedCells\":true,\"allowSelectUnlockedCells" +
"\":true,\"allowSort\":true,\"allowFilter\":true,\"allowResizeRows\":true,\"allowResizeColumns" +
"\":true,\"allowEditObjects\":true,\"allowDragInsertRows\":true,\"allowDragInsertColumns\":true," +
"\"allowInsertRows\":true,\"allowInsertColumns\":true,\"allowDeleteRows\":true,\"allowDeleteColumns\":true}");
// 保存为 Excel 文件
workbook.save("ProtectionOptionsFromJson.xlsx");参考以下示例代码,该代码使用IValidation.fromJson方法,通过 JSON 字符串更新验证规则:
// 创建新工作簿
Workbook workbook = new Workbook();
IWorksheet worksheet = workbook.getActiveSheet();
worksheet.getRange("A1:B2").setValue(new Object[][]{
{1, 10 },
{5, 20 }
});
// 从 JSON 更新验证规则
worksheet.getRange("A1:B2").getValidation().fromJson("{\"inputTitle\":\"提示(tip)\",\"inputMessage\"" +
":\"值必须在 5 到 20 之间。(Value must be between 5 and 20.)\",\"type\":1,\"condition\":{\"conType\":0,\"compareType\":1,\"item1" +
"\":{\"conType\":1,\"compareType\":3,\"expected\":\"5\",\"integerValue\":true},\"item2\":{\"conType\":1," +
"\"compareType\":5,\"expected\":\"20\",\"integerValue\":true},\"ignoreBlank\":true},\"ranges\":\"A1\"," +
"\"highlightStyle\":\"{\\\"type\\\":0,\\\"color\\\":\\\"red\\\"}\"}");
// 保存为 Excel 文件
workbook.save("DataValidationFromJson.xlsx");参考以下示例代码,该代码使用IValidation.toJson方法,将验证规则导出为 JSON 字符串:
// 创建内存流以存储 JSON
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// 创建新工作簿
Workbook workbook = new Workbook();
IWorksheet worksheet = workbook.getActiveSheet();
// 创建验证规则
worksheet.getRange("C2:E4").getValidation().add(ValidationType.Whole, ValidationAlertStyle.Stop, ValidationOperator.Between, 1, 8);
IValidation validation = worksheet.getRange("C2:E4").getValidation();
validation.setIgnoreBlank(true);
validation.setInputTitle("提示(Tips)");
validation.setInputMessage("请输入 1 到 8 之间的值。(Input a value between 1 and 8, please)");
validation.setErrorTitle("错误(Error)");
validation.setErrorMessage("输入值不在 1 到 8 之间。(input value does not between 1 and 8)");
validation.setShowError(true);
validation.setShowInputMessage(true);
// 将验证规则导出为 JSON
String json = validation.toJson();
try{
outputStream.write(json.getBytes(Charset.forName("UTF-8")));
} catch (IOException e){
e.printStackTrace();
}请注意:
使用 IValidation.fromJson 方法时,当前区域中的数据验证会先被清除,然后在当前区域应用新的数据验证。
IValidation.fromJson 方法的常见用法如下:
sheet.getRange["A1:B2"].getValidation().fromJson("...\"ranges\":\"C3:D4\"...");
其中 GcExcel API 和 JSON 数据都提供了区域信息。应用数据验证时,将采用前者,后者会被忽略。
参考以下示例代码,该代码使用IFormatConditions.fromJson方法,通过 JSON 字符串更新区域中的条件格式:
// 创建新工作簿
Workbook workbook = new Workbook();
IWorksheet worksheet = workbook.getWorksheets().get(0);
Object data = new Object[][]{
{"姓名(Name)", "城市(City)", "生日(Birthday)", "眼睛颜色(Eye color)", "体重(Weight)", "身高(Height)"},
{"Richard", "纽约(New York)", new GregorianCalendar(1968, 5, 8), "蓝色(Blue)", 67, 165},
{"Nia", "纽约(New York)", new GregorianCalendar(1972, 6, 3), "棕色(Brown)", 62, 134},
{"Jared", "纽约(New York)", new GregorianCalendar(1964, 2, 2), "淡褐色(Hazel)", 72, 180},
{"Natalie", "华盛顿(Washington)", new GregorianCalendar(1972, 7, 8), "蓝色(Blue)", 66, 163},
{"Damon", "华盛顿(Washington)", new GregorianCalendar(1986, 1, 2), "淡褐色(Hazel)", 76, 176},
{"Angela", "华盛顿(Washington)", new GregorianCalendar(1993, 1, 15), "棕色(Brown)", 68, 145}
};
worksheet.getRange("B:C").setColumnWidthInPixel(80);
worksheet.getRange("A1:F7").setValue(data);
worksheet.getRange("E2:E7").getFormatConditions().fromJson("{\"rules\":[{\"ruleType\":13,\"ranges\":[{\"row" +
"\":1,\"rowCount\":6,\"col\":4,\"colCount\":1}],\"iconSetType\":5,\"iconCriteria\":[{\"isGreaterThanOrEqualTo" +
"\":true,\"iconValueType\":4,\"iconValue\":33},{\"isGreaterThanOrEqualTo\":true,\"iconValueType\":4,\"iconValue" +
"\":67}],\"priority\":2,\"icons\":[{\"iconSetType\":5,\"iconIndex\":0},{\"iconSetType\":5,\"iconIndex\":1},{\"iconSetType" +
"\":5,\"iconIndex\":2}]},{\"ruleType\":1,\"operator\":6,\"stopIfTrue\":true,\"ranges\":[{\"row\":1,\"rowCount\":6,\"col" +
"\":4,\"colCount\":1}],\"value1\":\"66\",\"value2\":\"70\"}]}");
// 保存为 Excel 文件
workbook.save("FormatsFromJson.xlsx");参考以下示例代码,该代码使用IFormatConditions.toJson方法,将条件格式导出为 JSON 字符串:
// 创建内存流以存储 JSON
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// 创建新工作簿
Workbook workbook = new Workbook();
IWorksheet worksheet = workbook.getWorksheets().get(0);
Object data = new Object[][]{
{"姓名(Name)", "城市(City)", "生日(Birthday)", "眼睛颜色(Eye color)", "体重(Weight)", "身高(Height)"},
{"Richard", "纽约(New York)", new GregorianCalendar(1968, 5, 8), "蓝色(Blue)", 67, 165},
{"Nia", "纽约(New York)", new GregorianCalendar(1972, 6, 3), "棕色(Brown)", 62, 134},
{"Jared", "纽约(New York)", new GregorianCalendar(1964, 2, 2), "淡褐色(Hazel)", 72, 180},
{"Natalie", "华盛顿(Washington)", new GregorianCalendar(1972, 7, 8), "蓝色(Blue)", 66, 163},
{"Damon", "华盛顿(Washington)", new GregorianCalendar(1986, 1, 2), "淡褐色(Hazel)", 76, 176},
{"Angela", "华盛顿(Washington)", new GregorianCalendar(1993, 1, 15), "棕色(Brown)", 68, 145}
};
worksheet.getRange("A1:F7").setValue(data);
// 体重在 66 到 70 之间时,将其填充色设置为淡绿色。
IFormatCondition condition = (IFormatCondition) worksheet.getRange("E2:E7").getFormatConditions().add(FormatConditionType.CellValue, FormatConditionOperator.Between, 66, 70);
condition.getInterior().setColor(Color.GetLightGreen());
// 图标集规则。
IIconSetCondition condition2 = worksheet.getRange("E2:E7").getFormatConditions().addIconSetCondition();
condition2.setIconSet(workbook.getIconSets().get(IconSetType.Icon3Symbols));
condition2.getIconCriteria().get(1).setOperator(FormatConditionOperator.GreaterEqual);
condition2.getIconCriteria().get(1).setValue(30);
condition2.getIconCriteria().get(1).setType(ConditionValueTypes.Percent);
condition2.getIconCriteria().get(2).setOperator(FormatConditionOperator.GreaterEqual);
condition2.getIconCriteria().get(2).setValue(70);
condition2.getIconCriteria().get(2).setType(ConditionValueTypes.Percent);
// 将条件格式导出为 JSON
String json = worksheet.getRange("E2:E7").getFormatConditions().toJson();
try{
outputStream.write(json.getBytes(Charset.forName("UTF-8")));
} catch (IOException e){
e.printStackTrace();
}参考以下示例代码,该代码使用ITop10.fromJson方法,通过 JSON 字符串更新前 10 名条件格式:
// 创建新工作簿
Workbook workbook = new Workbook();
IWorksheet worksheet = workbook.getWorksheets().get(0);
Object data = new Object[][]{
{"姓名(Name)", "城市(City)", "生日(Birthday)", "眼睛颜色(Eye color)", "体重(Weight)", "身高(Height)"},
{"Richard", "纽约(New York)", new GregorianCalendar(1968, 5, 8), "蓝色(Blue)", 67, 165},
{"Nia", "纽约(New York)", new GregorianCalendar(1972, 6, 3), "棕色(Brown)", 62, 134},
{"Jared", "纽约(New York)", new GregorianCalendar(1964, 2, 2), "淡褐色(Hazel)", 72, 180},
{"Natalie", "华盛顿(Washington)", new GregorianCalendar(1972, 7, 8), "蓝色(Blue)", 66, 163},
{"Damon", "华盛顿(Washington)", new GregorianCalendar(1986, 1, 2), "淡褐色(Hazel)", 76, 176},
{"Angela", "华盛顿(Washington)", new GregorianCalendar(1993, 1, 15), "棕色(Brown)", 68, 145}
};
worksheet.getRange("B:C").setColumnWidthInPixel(80);
worksheet.getRange("A1:F7").setValue(data);
ITop10 top10 = worksheet.getRange("F2:F7").getFormatConditions().addTop10();
top10.fromJson("{\"ruleType\":5,\"style\":{\"backColor\":\"Accent 5\",\"hAlign\":3,\"vAlign" +
"\":0,\"locked\":true,\"textIndent\":null,\"cellButtons\":null},\"type\":0,\"rank\":\"3" +
"\",\"ranges\":[{\"row\":1,\"rowCount\":6,\"col\":5,\"colCount\":1}]}");
// 保存为 Excel 文件
workbook.save("Top10FromJson.xlsx");参考以下示例代码,该代码使用ITop10.toJson方法,将前 10 名条件格式导出为 JSON 字符串:
// 创建内存流以存储 JSON
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// 创建新工作簿
Workbook workbook = new Workbook();
IWorksheet worksheet = workbook.getWorksheets().get(0);
Object data = new Object[][]{
{"姓名(Name)", "城市(City)", "生日(Birthday)", "眼睛颜色(Eye color)", "体重(Weight)", "身高(Height)"},
{"Richard", "纽约(New York)", new GregorianCalendar(1968, 5, 8), "蓝色(Blue)", 67, 165},
{"Nia", "纽约(New York)", new GregorianCalendar(1972, 6, 3), "棕色(Brown)", 62, 134},
{"Jared", "纽约(New York)", new GregorianCalendar(1964, 2, 2), "淡褐色(Hazel)", 72, 180},
{"Natalie", "华盛顿(Washington)", new GregorianCalendar(1972, 7, 8), "蓝色(Blue)", 66, 163},
{"Damon", "华盛顿(Washington)", new GregorianCalendar(1986, 1, 2), "淡褐色(Hazel)", 76, 176},
{"Angela", "华盛顿(Washington)", new GregorianCalendar(1993, 1, 15), "棕色(Brown)", 68, 145}
};
worksheet.getRange("A1:F7").setValue(data);
ITop10 top10 = worksheet.getRange("F2:F7").getFormatConditions().addTop10();
top10.setRank(3);
top10.setNumberFormat("0.00");
top10.getInterior().setColor(Color.FromArgb(91, 155, 213));
// 将前 10 名条件格式导出为 JSON
String json = top10.toJson();
try{
outputStream.write(json.getBytes(Charset.forName("UTF-8")));
} catch (IOException e){
e.printStackTrace();
}请注意:
使用 IFormatConditions.fromJson 时,区域中的条件格式会先被清除,然后从 JSON 字符串应用新的条件格式。
使用 IFormatCondition、ITop10、IAboveAverage、IUniqueValues、IColorScale、IDataBar 和 IIconSetCondition 接口的 fromJson 方法时,JSON 中的 FormatConditionType 必须与调用者的类型相同。否则,将抛出 InvalidOperationException 异常。
GcExcel 使用调用者的区域生成新的条件格式,JSON 中的区域信息会丢失。
参考以下示例代码,该代码使用IStyle.fromJson方法,通过 JSON 字符串更新现有命名样式:
// 创建新工作簿
Workbook workbook = new Workbook();
IWorksheet worksheet = workbook.getActiveSheet();
// 创建临时样式
IStyle style = workbook.getStyles().add("test");
// 从 JSON 更新样式
style.fromJson("{\"backColor\":\"#4472c4\",\"foreColor\":\"#ffffff\",\"hAlign\":3,\"vAlign" +
"\":0,\"font\":\"italic 11pt Calibri\",\"borderLeft\":{\"color\":\"Accent 2\",\"style\":5}," +
"\"borderTop\":{\"color\":\"Accent 2\",\"style\":5},\"borderRight\":{\"color\":\"Accent 2\"," +
"\"style\":5},\"borderBottom\":{\"color\":\"Accent 2\",\"style\":5},\"locked\":true,\"textIndent" +
"\":null,\"cellButtons\":[]}");
worksheet.getRange("D4").setValue("Google");
worksheet.getRange("D4").setStyle(style);
// 保存为 Excel 文件
workbook.save("NamedStyleFromJson.xlsx");参考以下示例代码,该代码使用IStyle.toJson方法,将命名样式导出为 JSON 字符串:
// 创建内存流以存储 JSON
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// 创建新工作簿
Workbook workbook = new Workbook();
// 创建临时样式
IStyle style = workbook.getStyles().add("CustomStyle1");
style.getInterior().setColor(Color.FromArgb(68, 114, 196));
style.getFont().setColor(Color.GetWhite());
style.getFont().setItalic(true);
style.getFont().setSize(18);
style.getBorders().setColor(Color.GetDarkOrange());
style.getBorders().setLineStyle(BorderLineStyle.Medium);
// 将样式导出为 JSON
String json = style.toJson();
try{
outputStream.write(json.getBytes(Charset.forName("UTF-8")));
} catch (IOException e){
e.printStackTrace();
}参考以下示例代码,该代码使用ISparkline.fromJson方法,通过 JSON 字符串更新迷你图:
// 创建新工作簿
Workbook workbook = new Workbook();
IWorksheet worksheet = workbook.getActiveSheet();
worksheet.getRange("B2:K5").setValue(new Object[][] {
{"编号(Number)", "日期(Date)", "客户(Customer)", "描述(Description)", "趋势(Trend)", "0-30 天(0-30 Days)", "30-60 天(30-60 Days)", "60-90 天(60-90 Days)", ">90 天(>90 Days)", "金额(Amount)"},
{"1001", new GregorianCalendar(2017, 5, 21), "客户 A(Customer A)", "发票 1001(Invoice 1001)", null, 1200.15, 1916.18, 1105.23, 1806.53, null},
{"1002", new GregorianCalendar(2017, 3, 18), "客户 B(Customer B)", "发票 1002(Invoice 1002)", null, 896.23, 1005.53, 1800.56, 1150.49, null},
{"1003", new GregorianCalendar(2017, 6, 15), "客户 C(Customer C)", "发票 1003(Invoice 1003)", null, 827.63, 1009.23, 1869.23, 1002.56, null}
});
worksheet.getRange("B:K").setColumnWidth(15);
worksheet.getTables().add(worksheet.getRange("B2:K5"), true);
worksheet.getTables().get(0).getColumns().get(9).getDataBodyRange().setFormula("=SUM(Table1[@[0-30 Days]:[>90 Days]])");
worksheet.getRange("F3:F5").getSparklineGroups().add(SparkType.Line, "G3:J5");
worksheet.getRange("F3").getSparklineGroups().get(0).get(0).fromJson("{\"row\":2,\"col\":5,\"orientation\":1," +
"\"data\":{\"row\":2,\"col\":6,\"rowCount\":1,\"colCount\":5}}");
// 保存为 Excel 文件
workbook.save("SparklineFromJson.xlsx");参考以下示例代码,该代码使用ISparkline.toJson方法,将迷你图导出为 JSON 字符串:
// 创建内存流以存储 JSON
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// 创建新工作簿
Workbook workbook = new Workbook();
IWorksheet worksheet = workbook.getActiveSheet();
worksheet.getRange("B2:K5").setValue(new Object[][]
{
{"编号(Number)", "日期(Date)", "客户(Customer)", "描述(Description)", "趋势(Trend)", "0-30 天(0-30 Days)", "30-60 天(30-60 Days)", "60-90 天(60-90 Days)", ">90 天(>90 Days)", "金额(Amount)"},
{"1001", new GregorianCalendar(2017, 5, 21), "客户 A(Customer A)", "发票 1001(Invoice 1001)", null, 1200.15, 1916.18, 1105.23, 1806.53, null},
{"1002", new GregorianCalendar(2017, 3, 18), "客户 B(Customer B)", "发票 1002(Invoice 1002)", null, 896.23, 1005.53, 1800.56, 1150.49, null},
{"1003", new GregorianCalendar(2017, 6, 15), "客户 C(Customer C)", "发票 1003(Invoice 1003)", null, 827.63, 1009.23, 1869.23, 1002.56, null}
});
worksheet.getRange("B:K").setColumnWidth(15);
worksheet.getTables().add(worksheet.getRange("B2:K5"), true);
worksheet.getTables().get(0).getColumns().get(9).getDataBodyRange().setFormula("=SUM(Table1[@[0-30 Days]:[>90 Days]])");
worksheet.getRange("F3:F5").getSparklineGroups().add(SparkType.Line, "G3:J5");
// 将迷你图导出为 JSON
String json = worksheet.getRange("F3:F5").getSparklineGroups().get(0).toJson();
try{
outputStream.write(json.getBytes(Charset.forName("UTF-8")));
} catch (IOException e){
e.printStackTrace();
}请注意:
SpreadJS 有两种迷你图,一种与 Excel 一致,另一种是 SpreadJS 扩展的。GcExcel 支持前者的 toJson 和 fromJson 方法。后者可通过公式设置。
如果要使用迷你图组(sparklineGroup)和迷你图(sparkline)的 toJson 和 fromJson 方法,当前区域中必须存在迷你图组或迷你图,否则会抛出数组越界异常。
位置区域信息适用与数据验证相同的规则。
数据区域会通过 JSON 字符串中的数据区域进行更新。
GcExcel 会尽可能使用 JSON 数据中的迷你图,但如果数据大小超过所选区域的大小,会被丢弃。
参考以下示例代码,该代码使用ITables.fromJson方法,通过 JSON 字符串生成表格:
// 创建新工作簿
Workbook workbook = new Workbook();
IWorksheet worksheet = workbook.getActiveSheet();
worksheet.getRange("A1:F7").setValue(new Object[][] {
{"姓名(Name)", "城市(City)", "生日(Birthday)", "眼睛颜色(Eye color)", "体重(Weight)", "身高(Height)"},
{"Richard", "纽约(New York)", new GregorianCalendar(1968, 6, 8), "蓝色(Blue)", 67, 165},
{"Nia", "纽约(New York)", new GregorianCalendar(1972, 7, 3), "棕色(Brown)", 62, 134},
{"Jared", "纽约(New York)", new GregorianCalendar(1964, 3, 2), "淡褐色(Hazel)", 72, 180},
{"Natalie", "华盛顿(Washington)", new GregorianCalendar(1972, 8, 8), "蓝色(Blue)", 66, 163},
{"Damon", "华盛顿(Washington)", new GregorianCalendar(1986, 2, 2), "淡褐色(Hazel)", 76, 176},
{"Angela", "华盛顿(Washington)", new GregorianCalendar(1993, 2, 15), "棕色(Brown)", 68, 145}
});
worksheet.getRange("B:C").setColumnWidth(10);
worksheet.getRange("D:D").setColumnWidth(11);
// 从 JSON 生成表格
worksheet.getTables().fromJson("[{\"name\":\"Table1\",\"row\":0,\"col\":0,\"rowCount\":7,\"colCount" +
"\":6,\"style\":{\"buildInName\":\"Medium2\"},\"rowFilter\":{\"range\":{\"row\":1,\"rowCount" +
"\":6,\"col\":0,\"colCount\":6},\"typeName\":\"HideRowFilter\",\"dialogVisibleInfo\":{}," +
"\"filterButtonVisibleInfo\":{\"0\":true,\"1\":true,\"2\":true,\"3\":true,\"4\":true,\"5" +
"\":true},\"showFilterButton\":true},\"columns\":[{\"id\":1,\"name\":\"Name\"},{\"id\":2," +
"\"name\":\"City\"},{\"id\":3,\"name\":\"Birthday\"},{\"id\":4,\"name\":\"Eye color\"},{\"id" +
"\":5,\"name\":\"Weight\"},{\"id\":6,\"name\":\"Height\"}]}]");
// 保存为 Excel 文件
workbook.save("TableFromJson.xlsx");参考以下示例代码,该代码使用ITables.toJson方法,将表格导出为 JSON 字符串:
// 创建内存流以存储 JSON
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// 创建新工作簿
Workbook workbook = new Workbook();
IWorksheet worksheet = workbook.getActiveSheet();
// 创建表格
worksheet.getTables().add(worksheet.getRange("A1:F7"), true);
worksheet.getTables().get(0).getColumns().get(0).setName("姓名(Name)");
worksheet.getTables().get(0).getColumns().get(1).setName("城市(City)");
worksheet.getTables().get(0).getColumns().get(2).setName("生日(Birthday)");
worksheet.getTables().get(0).getColumns().get(3).setName("眼睛颜色(Eye color)");
worksheet.getTables().get(0).getColumns().get(4).setName("体重(Weight)");
worksheet.getTables().get(0).getColumns().get(5).setName("身高(Height)");
// 将表格导出为JSON字符串
String json = worksheet.getTables().toJson();
try{
outputStream.write(json.getBytes(Charset.forName("UTF-8")));
} catch (IOException e){
e.printStackTrace();
}请注意:
使用ITables.fromJson和ITable.fromJson方法时,会先清除表格,再从JSON字符串应用新表格。
使用ITables.fromJson和ITable.fromJson方法时,单元格的值不会被清除。