求解!JAVA 使用Apache POI将PPTX转图片出错。见下图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求解!JAVA 使用Apache POI将PPTX转图片出错。见下图相关的知识,希望对你有一定的参考价值。

参考技术A 有时候我们需要从Excel文件中读取数据,或者我们为了商务或者财政的目的生成Excel格式的报表.Java没有对操作Excel文件提供内在的支持,所以我们需要寻找开源的APIs.当我开始寻找操作Excel的APIs时候,大部分人建议使用JExcel或者ApachePOI.在深入研究后,我发现由于以下主要原因ApachePOI是正确的选择.还有些关于高级特性的原因,但是我们不深入太多细节.1)Apache基金的支持.2)JExcel不支持xlsx格式而POI既支持xls格式又支持xlsx格式.3)ApachePOI是基于流的处理,因此更适合大文件和要求更少的内存.ApachePOI对处理Excel文件提供了强大的支持,并且能处理xls和xlsx格式的电子表格.关于ApachePOI一些重要的地方:1)ApachePOI包含适合Excel97-2007(.xls文件)的HSSF实现.2)ApachePOIXSSF实现用来处理Excel2007文件(.xlsx).3)ApachePOIHSSF和XSSF提供了读/写/修改Excel表格的机制.4)ApachePOI提供了XSSF的一个扩展SXSSF用来处理非常大的Excel工作单元.SXSSFAPI需要更少的内存,因此当处理非常大的电子表格同时堆内存又有限时,很合适使用.5)有两种模式可供选择--事件模式和用户模式.事件模式要求更少的内存,因为用tokens来读取Excel并处理.用户模式更加面向对象并且容易使用,因此在我们的示例中使用用户模式.6)ApachePOI为额外的Excel特性提供了强大支持,例如处理公式,创建单元格样式--颜色,边框,字体,头部,脚部,数据验证,图像,超链接等.ApachePOI的Maven依赖[java]viewplaincopyorg.apache.poipoi3.10-FINALorg.apache.poipoi-ooxml3.10-FINALApachePOI的当前版本是3.10-FINAL.如果你使用单独的java应用,添加jars根据下面的图片.读取Excel文件假设我们有一个叫Sample.xlsx的Excel文件,里面有两个sheet并且下面图片中的数据.我们想要读取这个Excel文件并且创建Countrieslist.sheet1有些额外的数据,当我们解析时会忽略它.我们的国家(Country)javabean如下:Country.java[java]viewplaincopypackagecom.journaldev.excel.read;publicclassCountryprivateStringname;privateStringshortCode;publicCountry(Stringn,Stringc)this.name=n;this.shortCode=c;publicStringgetName()returnname;publicvoidsetName(Stringname)this.name=name;publicStringgetShortCode()returnshortCode;publicvoidsetShortCode(StringshortCode)this.shortCode=shortCode;@OverridepublicStringtoString()returnname+"::"+shortCode;读取Excel文件并创建Countrieslist代码如下:ReadExcelFileToList.java[java]viewplaincopypackagecom.journaldev.excel.read;importjava.io.FileInputStream;importjava.io.IOException;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;importorg.apache.poi.hssf.usermodel.HSSFWorkbook;importorg.apache.poi.ss.usermodel.Cell;importorg.apache.poi.ss.usermodel.Row;importorg.apache.poi.ss.usermodel.Sheet;importorg.apache.poi.ss.usermodel.Workbook;importorg.apache.poi.xssf.usermodel.XSSFWorkbook;publicclassReadExcelFileToListpublicstaticListreadExcelData(StringfileName)ListcountriesList=newArrayList();try//Createtheinputstreamfromthexlsx/xlsfileFileInputStreamfis=newFileInputStream(fileName);//CreateWorkbookinstanceforxlsx/xlsfileinputstreamWorkbookworkbook=null;if(fileName.toLowerCase().endsWith("xlsx"))workbook=newXSSFWorkbook(fis);elseif(fileName.toLowerCase().endsWith("xls"))workbook=newHSSFWorkbook(fis);//GetthenumberofsheetsinthexlsxfileintnumberOfSheets=workbook.getNumberOfSheets();//loopthrougheachofthesheetsfor(inti=0;irowIterator=sheet.iterator();while(rowIterator.hasNext())Stringname="";StringshortCode="";//GettherowobjectRowrow=rowIterator.next();//Everyrowhascolumns,getthecolumniteratoranditerateoverthemIteratorcellIterator=row.cellIterator();while(cellIterator.hasNext())//GettheCellobjectCellcell=cellIterator.next();//checkthecelltypeandprocessaccordinglyswitch(cell.getCellType())caseCell.CELL_TYPE_STRING:if(shortCode.equalsIgnoreCase(""))shortCode=cell.getStringCellValue().trim();elseif(name.equalsIgnoreCase(""))//2ndcolumnname=cell.getStringCellValue().trim();else//randomdata,leaveitSystem.out.println("Randomdata::"+cell.getStringCellValue());break;caseCell.CELL_TYPE_NUMERIC:System.out.println("Randomdata::"+cell.getNumericCellValue());//endofcelliteratorCountryc=newCountry(name,shortCode);countriesList.add(c);//endofrowsiterator//endofsheetsforloop//closefileinputstreamfis.close();catch(IOExceptione)e.printStackTrace();returncountriesList;publicstaticvoidmain(Stringargs[])Listlist=readExcelData("Sample.xlsx");System.out.println("CountryList\n"+list);这个程序很容易明白,主要步骤如下:1)根据文件类型(.xls与.xlsx)创建Workbook实例,xlsx用XSSFWorkbook,xls用HSSFWorkbook.我们可以基于文件名字使用工厂模式创建一个包装类来创建Workbook实例.2)使用WorkbookgetNumberOfSheets()来获取sheet的数量,然后循环解析每一个sheet.使用getSheetAt(inti)方法获取Sheet实例.3)获取Row和Cell迭代器来获取每一个Cell对象.ApachePOI在这里使用了迭代器模式.4)使用switch-case根据Cell的类型来处理它. 参考技术B 关键代码就是: rtruns[l].setFontName("宋体"); import java.awt.Dimension;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException; import ...追问

???

使用Apache POI拆分pptx幻灯片

我想通过使用Apache POI Java库将pptx幻灯片分成几个幻灯片,每个幻灯片只包含一张幻灯片。

创建一个新的XMLSlideSheet并按照几个地方描述添加幻灯片(例如https://www.tutorialspoint.com/apache_poi_ppt/apache_poi_ppt_merging.htm)对我来说不起作用,因为某些布局未正确导入:更改了字体,更改了文本的位置等。

  1. 问题:如何在将幻灯片导入新的XMLSlideShow时,不仅可以导入内容和主布局,还可以导入主题?

有效的一件事是为每张幻灯片导入一次pptx文件,然后迭代所有幻灯片,删除除一张幻灯片之外的所有幻灯片。但是,到目前为止,这种方法的缺点是,生成的pptx-one-slide-file的文件大小与带有x幻灯片的大输入幻灯片一样大。因此,通过XMLSlideShow - > removeSlide(slideID)删除幻灯片似乎不会从幻灯片中删除所有图像,关系等。

  1. 问题:除去一张幻灯片后,如何删除XMLSlideshow中不再需要的所有部分?

谢谢您的帮助!

答案
  1. 首先打开完整的pptx并逐个删除幻灯片。这样您可以保留主幻灯片和其他属性。
  2. 您可以尝试在幻灯片的形状上循环并删除它们,如下所示:

for (shape: slide.getShapes()) { slide.removeShape(shape) }

以上是关于求解!JAVA 使用Apache POI将PPTX转图片出错。见下图的主要内容,如果未能解决你的问题,请参考以下文章

java读取txt/pdf/xls/xlsx/doc/docx/ppt/pptx

poi 做数据导出,数据大就会报内存溢出,求解(目前我的数据肯能会在15W笔)

用java读取多种文件格式的文件(pdf,pptx,ppt,doc,docx..)

java poi导出数据为空,求解释

Java架构-Apache POI Excel

java poi的使用问题