[]
GcExcel Java 支持 SpreadJS 文件的 JSON 输入输出操作。您还可以导入使用 SpreadJS 设计器创建的 ssjson 文件,并根据自己的需求修改后再保存。
当单元格中的文本长于列宽时,SpreadJS 允许您显示省略号,而不是让文本溢出到其他单元格中。GcExcel 支持包含文本省略号的 SpreadJS 文件的 JSON 输入输出和 PDF 导出功能。您也可以从下载包含文本省略号的 JSON 文件。
// 创建一个新工作簿
Workbook workbook = new Workbook();
InputStream fileStream = this.getResourceStream("json/TextEllipsis.json");
workbook.fromJson(fileStream);
// 保存为 PDF 文件
workbook.save("TextEllipsis.pdf");限制
SpreadJS 允许将不同类型的文本对齐方式与文本省略号组合使用,但 GcExcel 不支持这种组合。因此,在导出的 PDF 中,文本省略号仅显示在文本的末尾。
GcExcel 支持对包含单元格边距和标签的 SpreadJS 文件执行 JSON 输入输出和 PDF 导出操作。您也可以从下载包含单元格边距和标签的 JSON 文件。
此外,GcExcel 还提供了 CellPadding 和 Margin 类、ILabelOptions 接口、LabelAlignment 和 LabelVisibility 枚举,以支持 GcExcel 中的单元格边距和标签功能。
以下示例代码在 GcExcel 工作表中添加单元格边距和标签:
// 创建一个新工作簿
Workbook workbook = new Workbook();
// 获取工作表
IWorksheet worksheet = workbook.getWorksheets().get(0);
// 设置行高
worksheet.getRange("A:A").setRowHeight(40);
// 设置列宽
worksheet.getRange("A:A").setColumnWidth(25);
// 设置水印
worksheet.getRange("A1").setWatermark("JAVA");
// 设置单元格边距
worksheet.getRange("A1").setCellPadding(new CellPadding(50, 0, 0, 0));
// 设置标签选项
worksheet.getRange("A1").getLabelOptions().setVisibility(LabelVisibility.visible);
worksheet.getRange("A1").getLabelOptions().setForeColor(Color.GetGreen());
worksheet.getRange("A1").getLabelOptions().setMargin(new Margin(15, 0, 0, 0));
worksheet.getRange("A1").getLabelOptions().getFont().setSize(14);
worksheet.getRange("A1").getLabelOptions().getFont().setName("Calibri");
worksheet.getRange("A1").getBorders().setLineStyle(BorderLineStyle.Thin);
// 保存为 PDF 文件
workbook.save("CellPaddingAndLabels.pdf");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("2019 财年");
worksheet.getRange("C5").setValue("销售额");
worksheet.getRange("C6").setValue("月度");
String[] months = {"4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月", "1月", "2月", "3月"};
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("最高");
// 使用单元格装饰突出显示最低销售额
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("最低");
// 将工作簿保存为 .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 格式。
在 MS Excel 中,当数字或日期无法在可用的单元格宽度内显示时,它会掩盖单元格值并在单元格中显示“####”。为解决此问题,GcExcel 提供了 NumbersFitMode 枚举,以便您在单元格宽度不足以容纳整个值时,可以选择掩盖或显示完整的数字或日期值。该枚举可以通过 setNumbersFitMode 方法进行设置,其值可以是“Mask”(掩盖)或“Overflow”(溢出)。要避免显示“####”,您可以将枚举选项设置为“Overflow”,这样溢出的值将占用相邻空白单元格的空间。如果单元格本身或相邻单元格是合并单元格或包含值,则不会发生溢出,只会显示部分值。
NumbersFitMode = Mask(掩盖) | NumbersFitMode = Overflow(溢出) |
|---|---|
|
|
// 将数字适应模式设置为溢出
workbook.getBookView().setNumbersFitMode(NumbersFitMode.Overflow);这种溢出行为和方向会根据单元格值的水平对齐方式和方向而变化。下表显示了一个长于可用宽度的值及其在不同水平对齐方式和方向下的溢出行为。
水平对齐方式/方向 | 溢出行为 |
|---|---|
常规或右对齐 |
|
左对齐 |
|
居中对齐 |
|
方向大于 0 |
|
方向小于 0 |
|
注意:由于MS Excel不支持数字适应模式(NumbersFitMode),因此将工作表导出到MS Excel时,NumbersFitMode.Overflow选项不会生效。
GcExcel支持对包含背景图片的SpreadJS文件进行JSON输入输出和PDF导出操作。您也可以从下载包含背景图片的JSON文件。
GcExcel还在IWorksheet接口中提供了getBackgroundPictures方法,用于在GcExcel中添加背景图片。有关更多信息,请参阅支持工作表背景图片。
以下示例代码在GcExcel工作表中设置背景图片:
// 创建一个新工作簿
Workbook workbook = new Workbook();
// 获取工作表
IWorksheet worksheet = workbook.getWorksheets().get(0);
// 从特定文件的输入流中加载图片
InputStream stream = new FileInputStream("image.png");
// 添加背景图片
IBackgroundPicture picture = worksheet.getBackgroundPictures().addPictureInPixel(stream, ImageType.PNG, 10, 10,
500, 370);
// 设置图片布局
picture.setBackgroundImageLayout(ImageLayout.Zoom);
// 设置选项
workbook.getActiveSheet().getPageSetup().setPrintGridlines(true);
// 保存为PDF文件
workbook.save("BackgroundImage.pdf");以下示例代码从JSON导入背景图片并导出为PDF文档:
// 创建一个新工作簿
Workbook workbook = new Workbook();
// 加载JSON文件
FileInputStream stream = new FileInputStream("BackgroundImage.json");
workbook.fromJson(stream);
// 保存文件
workbook.save("BackgroundImage.pdf");限制
从JSON导入时,背景图片会放置在每个工作表的(左:0,上:0)位置。
导出为PDF后,PDF文档的所有页面都将具有与从ssjson导入的相同的背景图片。
GcExcel支持对包含背景颜色的SpreadJS文件进行JSON输入输出和PDF导出操作。您也可以从下载包含背景颜色的JSON文件。
GcExcel还在IWorkbookView接口中提供了setBackColor和setGrayAreaBackColor方法,用于在GcExcel中设置背景颜色。
以下代码示例为GcExcel中的所有工作表设置背景颜色:
// 创建一个新工作簿
Workbook workbook = new Workbook();
// 获取工作表
IWorksheet worksheet = workbook.getWorksheets().get(0);
// 设置背景颜色
workbook.getBookView().setBackColor(Color.GetLightSkyBlue());
workbook.getBookView().setGrayAreaBackColor(Color.GetGray());
worksheet.getRange("H20").setValue("The text");
// 设置页面选项
worksheet.getPageSetup().setPrintGridlines(true);
worksheet.getPageSetup().setPrintHeadings(true);
// 保存为PDF文件
workbook.save("BackgroundColor.pdf");限制
在SpreadJS中,背景图片始终会覆盖背景颜色。因此,在导出为PDF文档时,需要移除背景图片才能使背景颜色生效。
GcExcel允许您使用IPictureFormat接口中的getUrl方法从json文件中获取图片的URL。然后,通过IPictureFormat接口的setFill方法,将此URL转换为字节数组并设置到图片中。这使您能够将包含图片URL的json文件导出为Excel或PDF文件。
参考以下示例代码,该代码从JSON文件中获取图片的URL并将其导出为Excel和PDF格式:
private static byte[] GetPicFromUrl(String urlString) throws MalformedURLException, UnsupportedEncodingException {
URL url = new URL(encode(urlString));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (InputStream inputStream = url.openStream()) {
int n = 0;
byte[] buffer = new byte[1024];
while (-1 != (n = inputStream.read(buffer))) {
baos.write(buffer, 0, n);
}
} catch (IOException e) {
e.printStackTrace();
}
return baos.toByteArray();
}
private static String encode(String url) throws UnsupportedEncodingException {
char[] charArray = url.toCharArray();
StringBuilder sb = new StringBuilder();
for (char c : charArray) {
if (c >= 0 && c < 255) {
sb.append(c);
} else {
sb.append(URLEncoder.encode(String.valueOf(c), "UTF-8"));
}
}
return sb.toString();
}