[]
SpreadJS v16 引入了一种新的文件格式 .sjs,可以更快地处理大型复杂文件,并在保存时生成更小(尺寸更小)的文件。新的.sjs格式是一个压缩文件,其中包含多个较小的 JSON 文件,并且结构类似于Excel XML 结构。
GcExcel Java 允许您像 XLSX、CSV 和其他文件格式一样导入和导出新的 .sjs 文件格式。您可以使用 Workbook 类的 open 方法导入 .sjs 文件。一旦在 GcExcel 中加载,可以使用 Workbook 类的 save 方法将其导出为 Excel(XLSX)或 .sjs 文件。在加载或保存 .sjs 文件时,可以在 OpenFileFormat 和 SaveFileFormat 枚举中使用新选项"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 还提供了 SjsOpenOptions 和 SjsSaveOptions 类,用于自定义 .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 还提供了 CornerPosition 和 IconPosition 枚举,用于设置角折和图标的位置。
你必须使用 CornerFold 和 CellDecorationIcon 构造函数创建 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
方法不会将表格恢复到原始大小。此方法仅控制数据是否被导出。