引言
java poi操作ppt,对ppt进行读写操作
1. 处理pptx格式
pptx格式需要使用XMLSlideShow处理
- DealPptX.java
入口函数
@SpringBootTest
public class DealPptX {
@Autowired
private TextTranslationService textTranslationService;
@Test
public void main() throws IOException {
System.out.println("----------单元测试开始----------");
dealPptX("D:\\Users\\lvxy\\Desktop\\1.pptx","D:\\Users\\lvxy\\Desktop\\deal1.pptx");
System.out.println("----------单元测试结束----------");
}
/**
* 处理pptX文件
* @param inputFilePath
* @param outputFilePath
* @throws IOException
* XMLSlideShow处理pttx
* 注意:单一文本框中的所有文字视为同一段落,文本框内不同行用 \n 分割。
* 文本框内分段使用 \n,在这里每个文本框视为同一段落,进行整体翻译,
* 所以双语对照时,跟随翻译结果进行对照,故无法进行文本框内分段对照
*/
public void dealPptX(String inputFilePath, String outputFilePath) throws IOException {
FileInputStream inputStream = new FileInputStream(inputFilePath);
FileOutputStream outputStream = new FileOutputStream(outputFilePath);
XMLSlideShow xss = new XMLSlideShow(inputStream);
//得到幻灯片的集合,每一个XSLFSlide代表一页幻灯片的对象
List<XSLFSlide> pages = xss.getSlides();
int index = 0;
// 遍历每一张幻灯片
for (XSLFSlide slide : pages) {
// 计数
index++;
// 获得单张幻灯片内的各种对象 (包括但不限于文本框)
// XSLFSlide.getShapes()得到XSLFShape对象,这个对象是单页幻灯片内所有对象的父类
for (XSLFShape shape : slide.getShapes()) {
if(ObjectUtil.isNull(shape)){
continue;
}
// 判断 当前对象是否为文本对象 XSLFTextShape
// 每一个XSLFTextShape代表一个文本框对象
if (shape instanceof XSLFTextShape) {
// 向下转型 XSLFTextShape 获得文本
String text = ((XSLFTextShape) shape).getText();
if(StrUtil.isNotEmpty(text)){
// 获取翻译结果翻译
String tgt_text = doTrans(text);
if(StrUtil.isNotEmpty(tgt_text)){
// 清空之前的文本
// ((XSLFTextShape) shape).clearText();
// 添加翻译后的文本
// 等同=((XSLFTextShape) shape).setText("\n"+tgt_text);
((XSLFTextShape) shape).appendText("\n"+tgt_text,false);
}
}
}
// 判断 当前对象是否为表格对象 XSLFTable
//每一个XSLFTable代表一个表格对象
if (shape instanceof XSLFTable) {
// 向下转型为XSLFTable对象 一个表格对象
// 遍历行
for (XSLFTableRow row : ((XSLFTable) shape).getRows()) {
// 遍历单元格
for (XSLFTableCell cell : row.getCells()) {
// 获得文本
String text = cell.getText();
if(StrUtil.isNotEmpty(text)){
String tgt_text = doTrans(text);
cell.clearText();
cell.setText(text+"\n"+tgt_text);
}
}
}
}
}
}
xss.write(outputStream);
}
public String doTrans(String text){
TranslationParamsBo paramsBo = new TranslationParamsBo();
paramsBo.setFrom("zh");
paramsBo.setSrc_text(text);
paramsBo.setTo("en");
try {
// 令qps小于3
Thread.sleep(400);
} catch (InterruptedException e) {
e.printStackTrace();
}
return textTranslationService.textTranslation(paramsBo).getData().getTgt_text();
}
}
}
2. 处理ppt格式
ppt格式需要使用HSLFSlideShow处理
- DealPpt.java
入口函数
@SpringBootTest
public class DealPpt {
@Autowired
private TextTranslationService textTranslationService;
@Test
public void main() throws IOException {
System.out.println("----------单元测试开始----------");
dealPpt("D:\\Users\\lvxy\\Desktop\\11.ppt","D:\\Users\\lvxy\\Desktop\\deal11.ppt");
System.out.println("----------单元测试结束----------");
}
@Test
public void test() throws IOException {
System.out.println("----------单元测试开始----------");
String str = "dasdasd\nsad adasd \n";
System.out.println(str);
String s = null;
if (str.endsWith("\n")){
s = StrUtil.removeSuffix(str, "\n");
}
System.out.println(s);
System.out.println("----------单元测试结束----------");
}
/**
* 处理ppt文件
* @param inputFilePath
* @param outputFilePath
* @throws IOException
* XMLSlideShow处理pttx
* 注意:单一文本框中的所有文字视为同一段落,文本框内不同行用 \n 分割。
* 文本框内分段使用 \n,在这里每个文本框视为同一段落,进行整体翻译,
* 所以双语对照时,跟随翻译结果进行对照,故无法进行文本框内分段对照
*/
public void dealPpt(String inputFilePath, String outputFilePath) throws IOException {
FileInputStream inputStream = new FileInputStream(inputFilePath);
FileOutputStream outputStream = new FileOutputStream(outputFilePath);
HSLFSlideShow hss = new HSLFSlideShow(inputStream);
//得到幻灯片的集合,每一个XSLFSlide代表一页幻灯片的对象
List<HSLFSlide> pages = hss.getSlides();
int index = 0;
// 遍历每一张幻灯片
for (HSLFSlide slide : pages) {
// 计数
index++;
// 获得单张幻灯片具体的内容 (包括但不限于文本框)
// HSLFShape.getShapes()得到XSLFShape对象,这个对象是单页幻灯片内所有对象的父类
for (HSLFShape shape : slide.getShapes()) {
if(ObjectUtil.isNull(shape)){
continue;
}
// 判断 当前对象是否为文本对象 HSLFTextShape
// 每一个HSLFTextShape代表一个文本框对象
if (ObjectUtil.isNotNull(shape) && shape instanceof HSLFTextShape) {
// 向下转型 HSLFTextShape 获得文本
String text = ((HSLFTextShape) shape).getText();
if(ObjectUtil.isNotNull(shape) && StrUtil.isNotEmpty(text)){
// 获取翻译结果
String tgt_text = doTrans(text);
if(StrUtil.isNotEmpty(tgt_text)){
// 添加翻译后的文本
((HSLFTextShape) shape).setText(text+"\n"+tgt_text);
}
}
}
/**
* 判断 当前对象是否为表格对象
* 每一个XSLFTable代表一个表格对象
* ppt格式比较原始,所以根据行列坐标进行遍历
*/
if (ObjectUtil.isNotNull(shape) && shape instanceof HSLFTable) {
//遍历单元格行
for (int i = 0; i < ((HSLFTable) shape).getNumberOfRows(); i++) {
// 遍历单元格列
for (int j = 0; j < ((HSLFTable) shape).getNumberOfColumns(); j++) {
// 根据行列坐标取单元格
HSLFTableCell cell = ((HSLFTable) shape).getCell(i, j);
if(ObjectUtil.isNull(cell)){
continue;
}
String text = cell.getText();
// 获取翻译结果翻译
String tgt_text = doTrans(text);
if(StrUtil.isNotEmpty(tgt_text)){
// 去除翻译结束的尾缀 \r\n
if (tgt_text.endsWith("\r\n")){
tgt_text = StrUtil.removeSuffix(tgt_text,"\r\n");
}
// todo 双语对照
cell.setText(text+"\n"+tgt_text);
}
}
}
}
}
}
hss.write(outputStream);
}
public String doTrans(String text){
TranslationParamsBo paramsBo = new TranslationParamsBo();
paramsBo.setFrom("zh");
paramsBo.setSrc_text(text);
paramsBo.setTo("en");
try {
// 令qps小于3
Thread.sleep(400);
} catch (InterruptedException e) {
e.printStackTrace();
}
return textTranslationService.textTranslation(paramsBo).getData().getTgt_text();
}
}