[]
        
立即试用
(Showing Draft Content)

SSJSON IO 支持的功能

GcExcel 允许您与 JSON 字符串之间导入和导出以下功能。

工作簿(Workbook)

您可以使用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");

工作表(Worksheet)

您可以使用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);

形状、图表或图片(Shape, Chart or Picture)

参考以下示例代码,该代码使用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 可能会导致意外错误。

  • 当形状类型为切片器或批注时,应使用ISlicerIComment接口的fromJsonToJson方法。

单元格区域(Range)

参考以下示例代码,该代码使用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 中的单元格位置超出区域范围,数据将会丢失。

切片器(Slicer)

参考以下示例代码,该代码使用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 中的切片器与现有切片器同名,将抛出异常。

批注(Comments)

参考以下示例代码,该代码使用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");

定义名称(Defined Names)

参考以下示例代码,该代码使用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");

页面设置(Page Setup)

参考以下示例代码,该代码使用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");

保护选项(Protection Options)

参考以下示例代码,该代码使用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");

数据验证(Data Validation)

参考以下示例代码,该代码使用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 数据都提供了区域信息。应用数据验证时,将采用前者,后者会被忽略。

条件格式(Conditional Formatting)

参考以下示例代码,该代码使用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 中的区域信息会丢失。

命名样式(Named Style)

参考以下示例代码,该代码使用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();
}

迷你图(Sparkline)

参考以下示例代码,该代码使用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 数据中的迷你图,但如果数据大小超过所选区域的大小,会被丢弃。

表格(Table)

参考以下示例代码,该代码使用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方法时,单元格的值不会被清除。