[]
        
立即试用
(Showing Draft Content)

导入和导出 .sjs 文件

SpreadJS v16 引入了一种新的文件格式 .sjs,可以更快地处理大型复杂文件,并在保存时生成更小(尺寸更小)的文件。新的.sjs格式是一个压缩文件,其中包含多个较小的 JSON 文件,并且结构类似于Excel XML 结构。

GcExcel Java 允许您像 XLSX、CSV 和其他文件格式一样导入和导出新的 .sjs 文件格式。您可以使用 Workbook 类的 open 方法导入 .sjs 文件。一旦在 GcExcel 中加载,可以使用 Workbook 类的 save 方法将其导出为 Excel(XLSX)或 .sjs 文件。在加载或保存 .sjs 文件时,可以在 OpenFileFormatSaveFileFormat 枚举中使用新选项"Sjs"。

请参考以下示例代码从文件名导入和导出 .sjs 文件:

// 初始化Workbook对象。
Workbook workbook = new Workbook();

// 打开.sjs文件。
workbook.open("ProjectPlan.sjs", OpenFileFormat.Sjs);

// 保存.sjs文件。
workbook.save("SaveProjectPlan.sjs", SaveFileFormat.Sjs);

请参考以下示例代码,从文件流中导入和导出 .sjs 文件:

// 创建一个新的Workbook对象。
var streamworkbook = new Workbook();
// 创建一个新的文件流来打开文件。
InputStream openFile;
try {
    openFile = new FileInputStream("ProjectPlan.sjs");
    // 打开.sjs文件。
    streamworkbook.open(openFile, OpenFileFormat.Sjs);
} catch (FileNotFoundException e1) {
    // 处理文件未找到异常。
    e1.printStackTrace();
}
  
// 创建一个新的文件流来保存文件。
OutputStream out;
try {
    out = new FileOutputStream("SaveProjectPlan.sjs");
    // 将Workbook对象保存为.sjs文件。
    streamworkbook.save(out, SaveFileFormat.Sjs);
} catch (FileNotFoundException e) {
    // 处理文件未找到异常。
    e.printStackTrace();
}

此外,GcExcel 还提供了 SjsOpenOptionsSjsSaveOptions 类,用于自定义 .sjs 文件的导入和导出。这些选项在处理大型文件时特别有用,比如包含许多公式、样式或未使用名称的文件。以下是这些选项:


选项

描述

导入选项

SjsOpenOptions

IncludeStyles

指示在加载.sjs文件时是否可包含样式。默认情况下为true。

IncludeFormulas

指示在加载.sjs文件时是否可包含公式。默认情况下为true。

导出选项

SjsSaveOptions

IncludeStyles

指示在保存文件时是否可包含样式。默认值为true。

IncludeFormulas

指示在保存文件时是否可包含公式。默认值为true。

IncludeUnusedNames

指示在保存文件时是否可包含未使用的自定义名称。默认值为true。

IncludeEmptyRegionCells

指示在保存文件时,已用数据范围之外的任何空单元格是否可包含在内。默认值为true。

IgnoreRangeOutOfRowCoulumnCount

指示在保存文件时是否忽略超出RowCount和ColumnCount的数据。默认值为false。

IncludeAutoMergedCells

指示是否包含自动合并的单元格。默认值为false。

IncludeBindingSource

指示在保存文件时是否包含绑定源。默认值为true。

请参考以下示例代码,使用 SjsOpenOptions 和 SjsSaveOptions 导入和导出 .sjs 文件:

// 初始化工作簿。
Workbook workbook = new Workbook();

// 打开一个 .sjs 文件并保留公式。
SjsOpenOptions openOptions = new SjsOpenOptions();
openOptions.setIncludeFormulas(false);
openOptions.setIncludeStyles(false);
workbook.open("ProjectPlan.sjs", openOptions);

// 保存 .sjs 文件不包含样式。
SjsSaveOptions saveOptions = new SjsSaveOptions();
saveOptions.setIncludeStyles(false);
saveOptions.setIncludeFormulas(true);
saveOptions.setIncludeUnusedNames(false);
saveOptions.setIncludeEmptyRegionCells(false);
workbook.save("SaveProjectPlan.sjs", saveOptions);

基于像素的列宽

GcExcel允许您在将 .sjs 文件导出为PDF或图像时,使用 WorkbookOptions 类的 setPixelBasedColumnWidth 方法基于像素而不是字符来渲染列宽。

参照以下示例代码,了解在导出为PDF或图像时如何基于像素渲染列宽:

// Initialize WorkbookOptions.
WorkbookOptions workbookOptions = new WorkbookOptions();

// Enable pixel-based column width for the workbook.
workbookOptions.setPixelBasedColumnWidth(true);
var workbook = new Workbook(workbookOptions);

// Open SSJSON file.
workbook.open("Event budget.sjs");
IWorksheet worksheet = workbook.getWorksheets().get(0);

// Save to a PDF and PNG file.
workbook.save("SavePDFWithPixelBasedColumnWidth.pdf");
worksheet.toImage("SavePDFWithPixelBasedColumnWidth.png");        

行和列数量设置

GcExcel 允许你在执行 .sjs 文件的输入/输出操作时,设置工作表中的行和列数量。IWorksheet 接口的 setRowCount setColumnCount 方法可以实现此功能。当你插入或删除行或列时,setRowCount 和 setColumnCount 方法也会相应地增加或减少行和列的数量。

你还可以使用 SjsSaveOptions 类的 setIgnoreRangeOutOfRowColumnCount 方法来选择是否忽略指定行和列数量范围之外的数据。该方法的默认值为 false,这意味着会将指定行和列数量范围之外的数据导出到 .sjs 文件中。

参考以下示例代码,设置工作表中的行和列数量并将其导出为 .sjs 文件:

// 创建一个新的工作簿。
var workbook = new Workbook();

// 打开 .sjs 文件。
workbook.open("LoanDetails.sjs", OpenFileFormat.Sjs);

// 访问第一个工作表。
IWorksheet worksheet = workbook.getWorksheets().get(0);

// 将行和列的数量调整为 4。
worksheet.setRowCount(4);
worksheet.setColumnCount(4);

// 控制是否排除行或列数量范围之外的内容不被导出。
SjsSaveOptions saveOptions = new SjsSaveOptions();
saveOptions.setIgnoreRangeOutOfRowColumnCount(true);

// 以 .sjs 文件格式保存文件。
workbook.save("IgnoreDataOption.sjs", saveOptions);

限制条件

  • 行和列数量设置仅支持 .sjs 文件的输入/输出操作,不能导出到 Excel 或 PDF 文件。

  • setRowCount 和 setColumnCount 方法设置的值不能超过 MS Excel 中 1,048,576 行和 16,384 列的最大限制。

单元格装饰

GcExcel 允许你使用 IRange 接口的 setDecoration 方法,以角折或图标形式为单元格或单元格区域添加装饰。该方法使用 ICornerFold ICellDecorationIcon 接口的实例。GcExcel 还提供了 CornerPositionIconPosition 枚举,用于设置角折和图标的位置。

你必须使用 CornerFoldCellDecorationIcon 构造函数创建 ICornerFold 和 ICellDecorationIcon 接口的实例,并在设置单元格或单元格区域的装饰之前配置角折和图标。

参考以下示例代码,为单元格添加装饰:

// 创建一个新的工作簿。
var workbook = new Workbook();

// 访问第一个工作表。
IWorksheet worksheet = workbook.getWorksheets().get(0);

// 为单元格区域添加值。
worksheet.getRange("C4").setValue("FY 2019");
worksheet.getRange("C5").setValue("Sales");
worksheet.getRange("C6").setValue("Monthly");

String[] months = { "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "Jan", "Feb", "Mar" };
int[] monthlySales = { 188897, 208146, 226196, 277318, 263273, 259845, 241047, 256306, 195845, 204934, 257852, 227779 };

for (int i = 0; i < months.length; i++) {
    worksheet.getRange("B" + (7 + i)).setValue(months[i]);
    worksheet.getRange("C" + (7 + i)).setValue(monthlySales[i]);
}

// 使用字符串设置颜色。
worksheet.getRange("B4:C6").getInterior().setColor(Color.GetLightBlue());
worksheet.getRange("C4:C6").getBorders().setColor(Color.GetBlack());
worksheet.getRange("B7:B18").getInterior().setColor(Color.GetLightGray());
worksheet.getRange("B7:C18").getBorders().setColor(Color.GetBlack());

// 设置单元格区域样式。
worksheet.getRange("B4:B6").getBorders().get(BordersIndex.EdgeLeft).setLineStyle(BorderLineStyle.Thin);
worksheet.getRange("B4:B6").getBorders().get(BordersIndex.EdgeTop).setLineStyle(BorderLineStyle.Thin);
worksheet.getRange("B4:B6").merge();
worksheet.getRange("C2:D18").setColumnWidth(15);
worksheet.getRange("B2:D18").setHorizontalAlignment(HorizontalAlignment.Center);
worksheet.getRange("B2:C18").setVerticalAlignment(VerticalAlignment.Center);
worksheet.getRange("B4:C6").getFont().setBold(true);
worksheet.getRange("C7:C18").setNumberFormat("#,##0");
worksheet.getRange("C2").setHorizontalAlignment(HorizontalAlignment.Right);

// 使用单元格装饰突出显示最高销售额。
ICornerFold cornerFold1 = new CornerFold(Color.GetRed(), EnumSet.of(CornerPosition.LeftTop), 8);
ICellDecorationIcon cellDecorationIcon1 = new CellDecorationIcon(
        "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZ"
        + "pZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3"
        + "cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjEyIiBoZWlnaHQ9IjEyI"
        + "iBmaWxsPSJ0cmFuc3BhcmVudCIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiI"
        + "GNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTcgOUg1TDUgNS45NjA0NmUtMDhIN0w3"
        + "IDlaTTYgMTBDNi41NTIyOCAxMCA3IDEwLjQ0NzcgNyAxMUM3IDExLjU1MjMgNi4"
        + "1NTIyOCAxMiA2IDEyQzUuNDQ3NzIgMTIgNSAxMS41NTIzIDUgMTFDNSAxMC40N"
        + "Dc3IDUuNDQ3NzIgMTAgNiAxMFoiIGZpbGw9InJlZCIvPgo8L3N2Zz4K",
        12,
        12,
        IconPosition.OutsideRight);
worksheet.getRange("C10").setDecoration(new com.grapecity.documents.excel.CellDecoration(cornerFold1, Collections.singletonList(cellDecorationIcon1)));
worksheet.getRange("D10").setValue("Highest");

// 使用单元格装饰突出显示最低销售额。
ICornerFold cornerFold2 = new CornerFold(Color.GetGreen(), EnumSet.of(CornerPosition.LeftTop), 8);
ICellDecorationIcon cellDecorationIcon2 = new CellDecorationIcon(
        "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWd"
        + "odD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIge"
        + "G1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2"
        + "lkdGg9IjEyIiBoZWlnaHQ9IjEyIiBmaWxsPSJ0cmFuc3BhcmVudCIvPgo8"
        + "cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZ"
        + "CIgZD0iTTcgOUg1TDUgNS45NjA0NmUtMDhIN0w3IDlaTTYgMTBDNi41NT"
        + "IyOCAxMCA3IDEwLjQ0NzcgNyAxMUM3IDExLjU1MjMgNi41NTIyOCAxMi"
        + "A2IDEyQzUuNDQ3NzIgMTIgNSAxMS41NTIzIDUgMTFDNSAxMC40NDc3I"
        + "DUuNDQ3NzIgMTAgNiAxMFoiIGZpbGw9ImdyZWVuIi8+Cjwvc3ZnPgo=",
        12,
        12,
        IconPosition.OutsideRight);
worksheet.getRange("C7").setDecoration(new com.grapecity.documents.excel.CellDecoration(cornerFold2, Collections.singletonList(cellDecorationIcon2)));
worksheet.getRange("D7").setValue("Lowest");

// 将工作簿保存为 .sjs 文档。
workbook.save("CellDecoration.sjs");

单元格装饰

移除单元格装饰

参考以下示例代码,完全移除单元格装饰:

// 移除单元格装饰。
worksheet.getRange("C7").setDecoration(null);

以下示例代码用于仅移除单元格图标装饰:

// 移除图标装饰。
worksheet.getRange("C7").setDecoration(new CellDecoration(cornerFold2, null));

// 或者
worksheet.getRange("C7").setDecoration(new CellDecoration(cornerFold2));

以下示例代码用于仅移除单元格角折装饰:

// 移除角折装饰。
worksheet.getRange("C7").setDecoration(new CellDecoration(null, Arrays.asList(cellDecorationIcon2)));

// 或者
worksheet.getRange("C7").setDecoration(new CellDecoration(Arrays.asList(cellDecorationIcon2)));

类型=警告

注意:单元格装饰是 SpreadJS 的一项功能,GcExcel 仅支持将其导出为 .sjs 和 .ssjson 格式。

控制绑定数据的导出

GcExcel 允许你在导出为 .sjs 文件时,使用 SjsSaveOptions 的 setIncludeBindingSource 方法来控制是否将绑定的数据源导出到文件中。

参考以下示例代码,在导出为 .sjs 文件时排除绑定源:

// 创建一个新的工作簿。
var workbook = new Workbook();

// 定义一个 JSON 数据源。
String dataSource = "{ \"ds\":" +
        "[\n" +
        "   {\"Area\": \"North America\",\"City\": \"Chicago\",\"Category\": \"Consumer Electronics\",\"Name\": \"Bose 785593-0050\",\"Revenue\": 92800},\n" +
        "   {\"Area\": \"North America\",\"City\": \"New York\",\"Category\": \"Consumer Electronics\",\"Name\": \"Bose 785593-0050\",\"Revenue\": 92800},\n" +
        "   {\"Area\": \"South America\",\"City\": \"Santiago\",\"Category\": \"Consumer Electronics\",\"Name\": \"Bose 785593-0050\",\"Revenue\": 19550},\n" +
        "   {\"Area\": \"Europe\",\"City\": \"Berlin\",\"Category\": \"Consumer Electronics\",\"Name\": \"Sony WH-1000XM4\",\"Revenue\": 30000},\n" +
        "   {\"Area\": \"Asia\",\"City\": \"Tokyo\",\"Category\": \"Consumer Electronics\",\"Name\": \"Sony WH-1000XM4\",\"Revenue\": 45000},\n" +
        "   {\"Area\": \"North America\",\"City\": \"Los Angeles\",\"Category\": \"Consumer Electronics\",\"Name\": \"Apple AirPods\",\"Revenue\": 60000},\n" +
        "   {\"Area\": \"Europe\",\"City\": \"Paris\",\"Category\": \"Consumer Electronics\",\"Name\": \"Apple AirPods\",\"Revenue\": 55000},\n" +
        "   {\"Area\": \"Asia\",\"City\": \"Seoul\",\"Category\": \"Consumer Electronics\",\"Name\": \"Samsung Galaxy Buds\",\"Revenue\": 40000},\n" +
        "   {\"Area\": \"South America\",\"City\": \"Buenos Aires\",\"Category\": \"Consumer Electronics\",\"Name\": \"Samsung Galaxy Buds\",\"Revenue\": 35000},\n" +
        "   {\"Area\": \"North America\",\"City\": \"Toronto\",\"Category\": \"Consumer Electronics\",\"Name\": \"Bose 785593-0050\",\"Revenue\": 50000}\n" +
        " ]" +
        "}";

// 将数据源添加到工作表。
IWorksheet dataSourceSheet = workbook.getWorksheets().add();
dataSourceSheet.setName("DataSource");
ITable table = dataSourceSheet.getTables().add(dataSourceSheet.getRange("A1:E4"), true);

// 设置绑定路径。
table.setBindingPath("ds");
table.getColumns().get(0).setDataField("Area");
table.getColumns().get(1).setDataField("City");
table.getColumns().get(2).setDataField("Category");
table.getColumns().get(3).setDataField("Name");
table.getColumns().get(4).setDataField("Revenue");

// 设置数据源。
dataSourceSheet.setDataSource(new JsonDataSource(dataSource));

// 创建数据透视表工作表。
IWorksheet pivotSheet = workbook.getWorksheets().get(0);
pivotSheet.setName("PivotSheet");

// 创建数据透视表。
IPivotCache pivotcache = workbook.getPivotCaches().create(table);
IPivotTable pivottable = pivotSheet.getPivotTables().add(pivotcache, pivotSheet.getRange("A1"), "pivottable1");

// 配置数据透视表字段。
IPivotField fieldArea = pivottable.getPivotFields().get("Area");
fieldArea.setOrientation(PivotFieldOrientation.RowField);
IPivotField fieldCity = pivottable.getPivotFields().get("City");
fieldCity.setOrientation(PivotFieldOrientation.RowField);
IPivotField fieldName = pivottable.getPivotFields().get("Name");
fieldName.setOrientation(PivotFieldOrientation.ColumnField);
IPivotField fieldRevenue = pivottable.getPivotFields().get("Revenue");
fieldRevenue.setOrientation(PivotFieldOrientation.DataField);
pivotSheet.getUsedRange().autoFit();
pivottable.setColumnGrand(false);
pivottable.setRowGrand(false);
pivottable.refresh();

SjsSaveOptions saveOptions = new SjsSaveOptions();

// 将 IncludeBindingSource 属性设置为 false,以排除绑定源不被导出。
saveOptions.setIncludeBindingSource(false);

// 保存工作簿。
workbook.save("IncludeBindingSourceOption.sjs", saveOptions);

type=warning

注意:在数据绑定改变表格大小后,setIncludeBindingSource 方法不会将表格恢复到原始大小。此方法仅控制数据是否被导出。