能告诉我下,是什么原因造成的么,或者说是字体原因造成的excel模板和生成的html显示不一致么?
某些字体加粗后的文本宽度计算存在偏差。现在改变了计算方式,可以得到正确的结果了。
该修复包含在计划于 2023 年 3 月上半月即将发布的版本 (Aspose.Cells v25.3) 。下一个版本发布时,您将收到通知。
在保存文件时选择将字体嵌入到 Excel 文件中,这样即使其他计算机没有该字体,也能正确显示。 如果我把字体嵌入到excel中,那么我是不是用咱们工具转换的时候就不需要考虑字体问题了,aspose通过excel转svg和pdf的时候就能直接读取excel模板中存的字体了
这种不确定有没有字体出现在程序里总出问题,我不能通过把字体设置到excel文件中来解决这个问题么?咱们excel转svg和pdf的时候,会先读取excel文件中设置的字体么?
@jishangyang
你可以通过把字体设置到excel文件中来解决问题。但是当使用Aspose进行转换到svg和pdf时,需要确保字体可用。以下是 Aspose.Cells API 在幕后执行的过程。
- API试图在文件系统中找到与电子表格中使用的确切字体名称匹配的字体。
- 如果API无法找到具有相同名称的精确字体,则尝试使用工作簿的DefaultStyle.Font属性下指定的默认字体。
- 如果API无法找到工作簿的DefaultStyle.Font属性下定义的字体,则尝试使用PdfSaveOptions.DefaultFont或ImageOrPrintOptions.DefaultFont属性下指定的字体。
- 如果API无法找到PdfSaveOptions.DefaultFont或ImageOrPrintOptions.DefaultFont属性下定义的字体,则尝试使用FontConfigs.DefaultFontName属性下指定的字体。
- 如果API无法找到FontConfigs.DefaultFontName属性下定义的字体,则尝试从所有可用字体中选择最合适的字体。
- 最后,如果API在文件系统中找不到任何字体,则使用Arial呈现电子表格。
// 设置字体替换规则
FontConfigs.setFontSubstitutes(“Arial”, new String[]{“Rockwell Extra Bold”, “Calibri”});
// 如果有自定义字体路径(可选),可以添加
FontConfigs.setFontFolder(“C:/Windows/Fonts”, true);
System.out.println("可用字体源: " + Arrays.toString(FontConfigs.getFontSources()));
File dir = new File(“E:\font.xlsx”);
FileInputStream imageBinary = new FileInputStream(dir);
String newFileName = “E:\my3.pdf”;
Workbook excel = new Workbook(imageBinary);
Style style = excel.getWorksheets().get(0).getCells().get(“B2”).getStyle();
System.out.println("单元格 B2 使用的字体: " + style.getFont().getName());
String uuid = UUID.randomUUID().toString();
for (int i = excel.getWorksheets().getActiveSheetIndex(); i < excel.getWorksheets().getCount(); i++) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
PdfSaveOptions pdfSaveOptions = new PdfSaveOptions();
pdfSaveOptions.setOnePagePerSheet(false);
pdfSaveOptions.setFontSubstitutionCharGranularity(true);
pdfSaveOptions.setAllColumnsInOnePagePerSheet(false);
pdfSaveOptions.setCalculateFormula(true);
pdfSaveOptions.setGridlineType(GridlineType.HAIR);
excel.save(byteArrayOutputStream, pdfSaveOptions);
FileOutputStream fos;
fos = new FileOutputStream(new File(newFileName));
byteArrayOutputStream.writeTo(fos);
fos.close();
} 我这样写,
111111.png (22.9 KB)
想实现图片上这个字体置换功能,为什么现在不好用?是哪里写的有问题么,请指教谢谢!
@jishangyang
我们查看了你的样例文件后,发现样例文件里并没有使用Arial字体。所以你的字体替换代码并不会产生作用。
FontConfigs.setFontSubstitutes("Arial", new String[]{"Rockwell Extra Bold", "Calibri"});
另外,你能详细描述一下你的需求吗?
我文档中123用的字体是Ravie,然后我本地字体库是没有这个字体的,
所以我应该按照
2如果API无法找到具有相同名称的精确字体,则尝试使用工作簿的DefaultStyle.Font属性下指定的默认字体。DefaultStyle.Font 这个默认字体不是Arial么?
或者我把FontConfigs.setFontSubstitutes(“Ravie”, new String[]{“Rockwell Extra Bold”, “Calibri”});改成这样,那么我B2单元格的字体不应该被替换成“Rockwell Extra Bold”么,但是现在也不替换
只有在“Ravie”字体未安装,或者“Ravie”字体不能显示单元格B2中的text,才会替换(确保“Rockwell Extra Bold”字体已安装)。 如果“Ravie”字体已安装并且能够显示单元格B2中的text,则会直接使用“Ravie”字体,不会替换。
如果你还有问题,可以把生成的pdf文件分享给我们分析。
你代码中设置的字体替换是
FontConfigs.setFontSubstitutes("Ravie", new String[]{"STHupo"});
在生成的pdf中,单元格B2中的“123”是“STHupo”字体,没有问题。
1.我用System.out.println("单元格 B2 使用的字体: " + style.getFont().getName());
控制台打印出来的是
单元格 B2 使用的字体: Ravie
2.我B3 B4用的是STHupo字体,为什么pdf显示的不是这个字体?
可能是你的环境“Ravie”字体未安装,又由于你设置了字体替换FontConfigs.setFontSubstitutes("Ravie", new String[]{"STHupo"});, 所以B2在pdf中用的是“STHupo”。
B3用的是“等线”字体, B4用的是“Microsoft JhengHei”字体。你可以用cell.getStyle().getFont().getName()打印输出。
如果我不设定的情况下pdfSaveOptions.setDefaultFont 这个默认字体是什么?
还有FontConfigs.setDefaultFontName不设定的情况下默认字体是什么?
@jishangyang
你可以参考以下样例代码获取默认字体:
Workbook excel = new Workbook(filePath + "font.xlsx");
System.out.println(excel.getDefaultStyle().getFont().getName());