使用 Spire.xls 将excel 转为 pdf、图片等 中文乱处理

By | 2023年4月6日

Spire.xls 将 Excel 转 PDF

pom.xml 加入如下内容:

<!-- https://www.e-iceblue.cn/spirexlsjavaconversion/convert-excel-to-pdf-using-java.html-->
<repository>
    <id>com.e-iceblue</id>
    <name>e-iceblue</name>
    <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>

<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.xls</artifactId>
    <version>13.3.6</version>
</dependency>

导出 PDF:

InputStream inputStream = this.getClass().getResourceAsStream("/audit/auditLogItem-template.xlsx");

 使用 EasyExcel 将生成的 Excel 写到 FileOutputStream 指定目录
String exceName = "useforpdf.xlsx";
OutputStream excelOutputStream = new FileOutputStream(exceName);
ExcelWriter excelWriter = EasyExcel.write(excelOutputStream).withTemplate(inputStream).autoCloseStream(false).build();
WriteSheet writeSheet = EasyExcel.writerSheet(0).build();
excelWriter.fill(excelMaps, writeSheet);
excelWriter.finish();

//创建一个Workbook实例并加载Excel文件
com.spire.xls.Workbook workbook = new com.spire.xls.Workbook();
workbook.loadFromFile(exceName);
//设置转换后的PDF页面高宽适应工作表的内容大小
workbook.getConverterSetting().setSheetFitToPage(true);
//将生成的文档保存到指定路径
String pdfName = "output-pdf/pdf" + ObjectUtil.getUUID();
workbook.saveToFile(pdfName, FileFormat.PDF);

// 将 Excel 转换成的 PDF 文件写入 ServletOutputStream)
FileUtils.copyFile(new File(pdfName), servletOutputStream);

中文乱码处理

复制 Windows 上的字体

查看导出的 excel 所用的中文字体,目前是宋体,到 C:\windows\fonts 复制对应字体库 宋体,文件后缀可能不一样,有的为ttf,有的为ttc,不影响使用。
创建/usr/share/fonts/chinese目录,上传刚才复制的字体库到此目录,命令:

# 创建文件夹
mkdir /usr/share/fonts/chinese
# 修改字体权限,使root以外的用户可以使用这些字体:使用777 赋予全部权限
chmod -R 777 /usr/share/fonts/chinese

建立字体缓存

# 字体扩展
mkfontscale
# 新增字体目录
mkfontdir
# 刷新缓存
fc-cache -fv

若是 docker 容器,可使用命令:

policyContainerId=docker container ls | grep 'policy_policy' | awk '{print $1}'
docker exec -it ${policyContainerId} bash -c "mkfontscale&&mkfontdir&&fc-cache -fv"

以上执行后,测试OK,无需重启 policy 服务。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注