poi3.9 导出 pptx时 通过setFontFamily设置了西文字体,但是没有设置中文字体,我应该怎样设置中文字体呢
代码是:
1、pom.xml
<!-- PPTUtil -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<!-- PPTUtil -->
代码如下:
package com.pptx;
import org.apache.poi.xslf.usermodel.*;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
public class TestController {
public static void main(String[] args) throws IOException {
//1、创建空的演示文稿
//要创建空的演示文稿,您必须实例化 org.poi.xslf.usermodel 包的 XMLSlideShow 类:
XMLSlideShow ppt = new XMLSlideShow();
//2、设置画布大小
ppt.setPageSize(new java.awt.Dimension(1920, 1080));
//3.准备创建幻灯片
XSLFSlide slide = ppt.createSlide();
//4.读取该幻灯片中所有元素
/*创建容器*/
XSLFTextBox textBox = slide.createTextBox();
//创建大小
String x2 = "2.96"; //水平位置
String y2 = "13.91"; //垂直位置
String w2 = "10.56"; //宽度
String h2 = "10.50"; //高度
textBox.setAnchor(new Rectangle2D.Double(Double.valueOf(x2) / 3.53 * 100, Double.valueOf(y2) / 3.53 * 100, Double.valueOf(w2) / 3.53 * 100, Double.valueOf(h2) / 3.53 * 100));
//5.创建 XSLFTextParagraph 类 生成一个新的文本段落
XSLFTextParagraph textParagraph = textBox.addNewTextParagraph();
//此方法用于设置要设置为段落的对齐方式
textParagraph.setTextAlign(TextAlign.LEFT);
/*创建 XSLFTextParagraph.XSLFTextRun 类 添加新的文本运行 */
XSLFTextRun xslfTextRun = textParagraph.addNewTextRun();
//写入内容 添加新的文本
xslfTextRun.setText("我是中文字体");
//宋体 (正文) 设置字体类型
String fontName = "zh8hzznct";
xslfTextRun.setFontFamily(fontName);
xslfTextRun.setFontSize(40);
//6.保存文件
String filename = UUID.randomUUID() + ".pptx";
String filePath = "D:" + File.separator + filename;
//使用了File对象打开文件然后读取
File file = new File(filePath);
FileOutputStream out = new FileOutputStream(file);
//保存文件
ppt.write(out);
out.close();
}
}
在office打开(显示字体效果
在wps打开(不显示字体效果)
字体是:
链接:https://pan.baidu.com/s/1a_mk...
提取码:iugs
复制这段内容后打开百度网盘手机App,操作更方便哦
我通过查询百度,发现:
https://blog.csdn.net/weixin_...
有提示:
1、设置ASCII码
2、设置中文字体
但是我在poi官方网站
http://poi.apache.org/apidocs/
查看文档没有找到pptx的相关接口,可以更换poi版本,希望指导一下我解决办法。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
没想到你还会来邀请我继续回答
poi
的问题,虽然不知道我的方法是否一定正确,但是最后效果倒是出来了,思路大致如下肯定现在是西文字体修改了,中午字体没有修改,为了方便去对比,我选择反推,于是我是通过
poi
再读取那个修改的ppt
文件(方便区别这个文件叫ppt1.pptx
),查看一下现在读出来的getFontFamily()
是什么?(因为ppt
打开显示字体有中文,西文字体,那读出来的会是哪个呢?)读出来还是
zh8hzznct
,那好,接着我再把ppt
中那个中文字体改为zh8hzznct
,西文字体改为微软雅黑
,另存为文件ppt2.pptx
再读取查看
FontFamily
是什么,结果就是微软雅黑
那说明这个无论怎么改,最终
FontFamily
无论设置还是读取都会与西文字体相关。所以再从xslfTextRun.setFontFamily
就走不通了索性抛开这条路,因为我们知道
poi
操作文档,实际是在玩xml
,所以想着虽然ppt2.pptx
的FontFamily
读出来是微软雅黑
,但是我中文字体是zh8hzznct
,那在xml
中肯定会体现出来的嘛于是我再把两个
ppt
文件读取出来的XSLFSlide
直接调用getXmlObject()
,把生成的xml
打印出来一做对比,这个结果就非常明显了哈可以看到
ppt2.pptx
中文字体是zh8hzznct
,西文字体是微软雅黑
,跟我们想要达到的效果很接近了,但是只是我们是通过界面修改。而最终xml
效果为latin
标签为微软雅黑
,ea
标签为zh8hzznct
ppt1.pptx
只设置了FontFamily
,最终效果是只有西文字体是zh8hzznct
,对应xml
只有latin
标签zh8hzznct
那我们可以得出一个结论,如果说我们在代码修改
ppt
时,除了设置FontFamily
(这个时候应该会有个latin
标签zh8hzznct
),再增加一个ea
标签为zh8hzznct
,这样就可以完成西文中文字体都为zh8hzznct
那怎么修改呢?当然是继续玩
xml
了啊,所以xslfTextRun
直接调用getXmlObject()
,开始以为玩xml
有点难,结果仔细一对比方法名和xml
,也不算难,马上就有了下面的写法什么
getRPr
中的RPr
,什么addNewEa
中的Ea
,结合刚才的xml
内容,其实就是个标签名,而这里面的font
显然是Typeface
属性咯,这样就简单多了加了刚上面那行代码,再修改
ppt
就对味了虽然西文字体显示使用中文字体,但是再去读取一次
xml
就一目了然啦大概能解决你的问题吧,如果其他老哥有更合适的
api
你可以无视我这种,毕竟有点剑走偏锋的感觉,哈哈哈