2015-12-10 18:13:40 hwd15219166920 阅读数 4661
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1268 人正在学习 去看看 钟林森
web 中在线预览office 是个头疼的问题。 今天项目刚好做完一个PPT在线预览的功能   在这里分享给大家
 
思路:
     获取网络PPT 文件 将PPT每一页的幻灯片都转换成单张图片  用流输出到页面展示
     1, 首先获取PPT格式  PPT格式无非两种 PPTX,PPT
     2,获取PPT幻灯片页数传递到JSP中
     3,JSP循环获取每页PPT
上代码:
         首先获取在线PPT 文件  并且获取PPT幻灯片页数




/**
 * 本类应用了Apache POI系统库,POI 是 Apache 下的 Jakata 项目的一个子项目,主要用于提供 Java 操作 Microsoft Office 办公套件如 Excel,Word,Powerpoint 等文件的 API。
 */

public class ConvertPPTFileToImage {


public ConvertPPTFileToImage() {

}
/**
*  PPTX 格式的处理
* @param filePath  图片网络路径URL 
* @param page   页数
* @param orignalPPTFileName 文件名
* @param imageFormatNameString  创建图片格式 (JPG,PNG,JPEG...等等)
* @param outputStream   输出
* @throws Exception
* 本来字体是要设置成PPT的字体  但是上传到linux 时候linux需要自己上传字体 否则所有中文都会变成乱码  口口口  无法显示   所以这里只
         * 使用宋体  
*如果大家想用其他字体 同样也是 linux 服务器的情况下  请自己上传字体到linux 中避免中文无法显示   下面会介绍如何上传字体到linux 中
*/

public static void convertPPTXtoImage(String filePath,int page,String orignalPPTFileName, String imageFormatNameString, OutputStream outputStream) throws Exception {
/**
* 多文件转码处理避免有中文或者特殊字符无法读取
*/

InputStream orignalPPTFileInputStream =null;
   String encodeName="";
        String igs[]=orignalPPTFileName.split("/");
           for(int x=0;x<igs.length;x++){
            if(x==igs.length-1){
              encodeName+=URLEncoder.encode(igs[x]).replace("+","%20");
            }else{
               encodeName+=URLEncoder.encode(igs[x]).replace("+","%20")+"/";
            }
           }
           URL url=new URL(filePath+encodeName);
           HttpURLConnection conn = (HttpURLConnection)url.openConnection();
           conn.setRequestMethod("GET");   //使用get
           orignalPPTFileInputStream=conn.getInputStream();


//FileOutputStream orignalPPTFileOutputStream =null;
/**
*  org.apache.poi.hslf, 这个包只支持 PowerPoint 2007 以前的 ppt 文档解析. 因为 Office 2007 的文件底层实现方案(OOXML)和以前的版本(OLE2)有根本的变化。
*  支持 office 2007 的包为: org.apache.poi.xslf 
*/

XMLSlideShow oneSlideShow =null;
try{
try {
oneSlideShow = new XMLSlideShow(orignalPPTFileInputStream);
} catch (IOException e) {
e.printStackTrace();
}
/**
* 获得PPT每页的尺寸大小(宽和高度)
*/

Dimension onePPTPageSize = oneSlideShow.getPageSize();
/**
* 获得PPT文件中的所有的PPT页面,并转换为一张张的播放片
*/

XSLFSlide[] pptPageXSLFSlideArray = oneSlideShow.getSlides();
if(pptPageXSLFSlideArray.length<=0||page>=pptPageXSLFSlideArray.length){
return ;
}
/**
* 下面的XML配置文件定义转换后的图片内的文字字体,否则将会出现转换后的图片内的中文为乱码
*/

String xmlFontFormat1="<xml-fragment xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\">";
String xmlFontFormat2="<a:rPr lang=\"zh-CN\" altLang=\"en-US\" dirty=\"0\" smtClean=\"0\"> ";
String xmlFontFormat3="<a:latin typeface=\"+mj-ea\"/> ";
String xmlFontFormat4="</a:rPr>";
String xmlFontFormat5="</xml-fragment>";
StringBuffer xmlFontFormatStringBuffer=new StringBuffer();
xmlFontFormatStringBuffer.append(xmlFontFormat1);
xmlFontFormatStringBuffer.append(xmlFontFormat2);
xmlFontFormatStringBuffer.append(xmlFontFormat3);
xmlFontFormatStringBuffer.append(xmlFontFormat4);
xmlFontFormatStringBuffer.append(xmlFontFormat5);

/**
*设置字体为宋体,解决中文乱码问题 
*/

           CTSlide oneCTSlide=pptPageXSLFSlideArray[page].getXmlObject();
           CTGroupShape oneCTGroupShape = oneCTSlide.getCSld().getSpTree();
           CTShape[] oneCTShapeArray = oneCTGroupShape.getSpArray();
           for (CTShape oneCTShape : oneCTShapeArray) {
               CTTextBody oneCTTextBody = oneCTShape.getTxBody();
               if (null == oneCTTextBody){
                   continue;
               }
               CTTextParagraph[] oneCTTextParagraph = oneCTTextBody.getPArray();               
               CTTextFont oneCTTextFont =null;
try {
oneCTTextFont = CTTextFont.Factory.parse(xmlFontFormatStringBuffer.toString());
}
catch (XmlException e) {
e.printStackTrace();
}
               for (CTTextParagraph textParagraph : oneCTTextParagraph) {
                   CTRegularTextRun[] oneCTRegularTextRunArray = textParagraph.getRArray();
                   for (CTRegularTextRun oneCTRegularTextRun : oneCTRegularTextRunArray) {
                       CTTextCharacterProperties oneCTTextCharacterProperties=oneCTRegularTextRun.getRPr();
                       oneCTTextCharacterProperties.setLatin(oneCTTextFont);
                   }
               }
           }
/**
* 创建BufferedImage对象,图象的尺寸为原来PPT的每页的尺寸
*/

BufferedImage oneBufferedImage = new BufferedImage(onePPTPageSize.width, onePPTPageSize.height, BufferedImage.TYPE_INT_RGB);
Graphics2D oneGraphics2D = oneBufferedImage.createGraphics();
/**
* 将PPT文件中的每个页面中的相关内容画到转换后的图片中
*/

pptPageXSLFSlideArray[page].draw(oneGraphics2D);
/**
* 设置图片的存放路径和图片的格式,注意生成的文件路径为绝对路径,最终获得各个图像文件所对应的输出流对象
*/

try {
ImageIO.write(oneBufferedImage, imageFormatNameString, outputStream);
} catch (IOException e) {
e.printStackTrace();
}
//}
}
finally{
try {
if(orignalPPTFileInputStream != null ){
orignalPPTFileInputStream.close();
}

catch (IOException e) {
e.printStackTrace();
}
}
}



/**
*  PPT 格式的处理
* @param filePath  图片网络路径URL 
* @param page   页数
* @param orignalPPTFileName 文件名
* @param imageFormatNameString  创建图片格式 (JPG,PNG,JPEG...等等)
* @param outputStream   输出
* @throws Exception
*  本来是设置成PPT的字体  但是上传到linux 时候linux需要自己上传字体 否则所有中文都会变成乱码  口口口  无法显示   所以这里只使用宋体  
* 如果大家想用其他字体 同样也是 linux 服务器的情况下  请自己上传字体到linux 中避免中文无法显示   下面会介绍如何上传字体到linux 中
*/

public static void convertPPTtoImage(String filePath,int page,String orignalPPTFileName, String imageFormatNameString,OutputStream outputStream) throws Exception {
/**
* convertReturnResult代表转换的结果,返回 false则表示转换不成功
*/

InputStream orignalPPTFileInputStream =null;
   String encodeName="";
        String igs[]=orignalPPTFileName.split("/");
           for(int x=0;x<igs.length;x++){
            if(x==igs.length-1){
              encodeName+=URLEncoder.encode(igs[x]).replace("+","%20");
            }else{
               encodeName+=URLEncoder.encode(igs[x]).replace("+","%20")+"/";
            }
           }
           URL url=new URL(filePath+encodeName);
           HttpURLConnection conn = (HttpURLConnection)url.openConnection();
           conn.setRequestMethod("GET");  
           orignalPPTFileInputStream=conn.getInputStream();
SlideShow oneSlideShow =null;
try{
try {
oneSlideShow = new SlideShow(orignalPPTFileInputStream);
} catch (IOException e) {
e.printStackTrace();
}
/**
* 获得PPT每页的尺寸大小(宽和高度)
*/

Dimension onePPTPageSize = oneSlideShow.getPageSize();
/**
* 获得PPT文件中的所有的PPT页面(获得每一张幻灯片),并转换为一张张的播放片
*/

Slide[] pptPageSlideArray = oneSlideShow.getSlides();
/**
* 下面的循环的主要功能是实现对PPT文件中的每一张幻灯片进行转换和操作。
*/

if(pptPageSlideArray.length<=0||page>=pptPageSlideArray.length){
return ;
}

TextRun[] textRunsArray = pptPageSlideArray[page].getTextRuns();
for (int textRunsArrayIndex = 0; textRunsArrayIndex < textRunsArray.length; textRunsArrayIndex++) {
RichTextRun[] pptRichTextRunsArray = textRunsArray[textRunsArrayIndex].getRichTextRuns();
for (int pptRichTextRunsArrayIndex = 0; pptRichTextRunsArrayIndex < pptRichTextRunsArray.length; pptRichTextRunsArrayIndex++) {
/**原来是直接设置为宋体,这样会使得转换后的图片上的文字与原PPT的文字不一致,应该改变为应用PPT本身的字体名
* pptRichTextRunsArray[pptRichTextRunsArrayIndex].setFontIndex(1);
* pptRichTextRunsArray[pptRichTextRunsArrayIndex].setFontName("宋体");
*/ 
/**
* 获得某个文本框内的字体名字符串,并识别是否为null(未正确地获得相关的字体名字符串),则设置为默认的字体名——宋体
* 但如果PPT文件在WPS中保存过,则pptRichTextRunsArray[pptRichTextRunsArrayIndex].getFontSize()的值可能为0或者26040。因此,
* 首先识别当前文本框内的字体尺寸是否为0或者大于26040,则设置默认的字体尺寸。
*/

int currentFontSize = pptRichTextRunsArray[pptRichTextRunsArrayIndex].getFontSize();
if((currentFontSize <=0)||(currentFontSize >=26040)){
pptRichTextRunsArray[pptRichTextRunsArrayIndex].setFontSize(30);
}

String currentFontName=pptRichTextRunsArray[pptRichTextRunsArrayIndex].getFontName();
/**
* 本来是设置成PPT的字体  但是上传到linux 时候linux需要自己上传字体 否则所有中文都会变成乱码  口口口  无法显示   所以这里只使用宋体  
* 如果大家想用其他字体 同样也是 linux 服务器的情况下  请自己上传字体到linux 中避免中文无法显示   下面会介绍如何上传字体到linux 中
*/

/* if(currentFontName == null){  */  
 int index = pptRichTextRunsArray[pptRichTextRunsArrayIndex].getFontIndex();
 pptRichTextRunsArray[pptRichTextRunsArrayIndex].setFontIndex(1);
 pptRichTextRunsArray[pptRichTextRunsArrayIndex].setFontName("宋体");
//}
/*else{
pptRichTextRunsArray[pptRichTextRunsArrayIndex].setFontName(currentFontName);
}*/
/**
* 应用 pptRichTextRunsArray[pptRichTextRunsArrayIndex].getText() 可以获得其中的文字
* int pptRichTextRunsNumberIndex = pptRichTextRunsArray[pptRichTextRunsArrayIndex].getFontIndex();
String fontNameForPPTText = pptRichTextRunsArray[pptRichTextRunsArrayIndex].getFontName();
*/

}
}
/**
* 下面的代码是获取某一页PPT中的第一个备注文字串
    System.out.println("备注文字:" + pptPageSlideArray[pptPageSlideIndex].getNotesSheet().getTextRuns()[0].getText());
    */
/**
* 创建BufferedImage对象,图象的尺寸为原来PPT的每页的尺寸
*/

BufferedImage oneBufferedImage = new BufferedImage(onePPTPageSize.width, onePPTPageSize.height, BufferedImage.TYPE_INT_RGB);
Graphics2D oneGraphics2D = oneBufferedImage.createGraphics();
oneGraphics2D.setFont(new Font("宋体", Font.PLAIN, 12));

/**
* 设置转换后的图片的背景颜色为白色
* oneGraphics2D.setPaint(Color.white);
oneGraphics2D.fill(new Rectangle2D.Float(0, 0, onePPTPageSize.width ,onePPTPageSize.height));
*/

pptPageSlideArray[page].draw(oneGraphics2D);
/**
* 图像文件的格式字符串为“jpg”、“jpeg”、"bmp"、"png"、 "gif"、"tiff"等,将转换后的各个图片文件保存到指定的目录中
*/

try {
ImageIO.write(oneBufferedImage, imageFormatNameString, outputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
finally{
try {
if(orignalPPTFileInputStream != null ){
orignalPPTFileInputStream.close();
}

catch (IOException e) {
e.printStackTrace();
}
}
}
/**
*    检查文件是否为ppt或者pptx格式 
* @param orignalPPTFileName需要转换的原始PPT的文件名称
* @return
*/

public static short checkOrignalFileFormat(String  orignalPPTFileName) {
/**
* PPT格式的识别结果, =0 不是PPT或者PPTX的格式文件, =1 代表*.ppt 格式, =2  代表 *.pptx 格式
*/

short pptORpptxFormatFile = 0;
/**
* 识别需要转换的原始PPT的文件是否为真正的PPT文件
*/

String orignalPPTFileSuffixName = null;
if (orignalPPTFileName != null && orignalPPTFileName.lastIndexOf(".") != -1) {
/**
* 获得需要转换的原始ppt或者pptx的文件扩展名,返回的结果应该为“ppt”或者"pptx"字符串
*/

orignalPPTFileSuffixName = orignalPPTFileName.substring(orignalPPTFileName.lastIndexOf(".") );
/** 
* 识别是否为.ppt格式
*/

if (".ppt".equals(orignalPPTFileSuffixName)) {
pptORpptxFormatFile = 1;
}
/**
* 识别是否为.pptx格式
*/

else if (".pptx".equals(orignalPPTFileSuffixName)) {
pptORpptxFormatFile = 2;
}
/**
* 如果不是.ppt格式或者*.pptx格式,则表示为非法的文件格式,则不能进行转换,符合检测的结果编码为0
*/

}
return pptORpptxFormatFile;
}

/**
* 判断文件是否存在   并且返回PPT幻灯片的页数
* @param filePath   文件路径URL
* @param orignalPPTFileName  文件名
* @return
* @throws Exception
*/

public static int getPPTImgCount(String filePath,String orignalPPTFileName) throws Exception{
/**
* 对文件名转码处理 避免有中文和特殊字符时无法获取图片
*/

SlideShow oneSlideShow =null;
XMLSlideShow oneSlideShow2 =null;
InputStream orignalPPTFileInputStream =null;
   String encodeName="";
        String igs[]=orignalPPTFileName.split("/");
           for(int x=0;x<igs.length;x++){
            if(x==igs.length-1){
              encodeName+=URLEncoder.encode(igs[x]).replace("+","%20");
            }else{
               encodeName+=URLEncoder.encode(igs[x]).replace("+","%20")+"/";
            }
           }
           URL url=new URL(filePath+encodeName);
           HttpURLConnection conn = (HttpURLConnection)url.openConnection();
           conn.setRequestMethod("GET"); 
            int state = conn.getResponseCode();
            if( state!=200){
            return 0;
            }
             
           orignalPPTFileInputStream=conn.getInputStream();

int count=0;
switch(checkOrignalFileFormat(orignalPPTFileName)){
case 0:
System.out.println("待转换的PPT文件不存在或者不是PPT和PPTX格式的文件!");
break;
case 1:
try {
oneSlideShow = new SlideShow(orignalPPTFileInputStream);
} catch (IOException e) {
e.printStackTrace();
return 0;
}
count= oneSlideShow.getSlides().length;
break;
case 2:
try {
oneSlideShow2 = new XMLSlideShow(orignalPPTFileInputStream);
} catch (IOException e) {
e.printStackTrace();
return 0;
}
count = oneSlideShow2.getSlides().length;
break;
}
return count;
}

}
      /**
          获取PPT页数到JSP 创建图片
      */

@RequestMapping(value = "ppts")
public String get(HttpServletRequest request,int id,String isFav) throws Exception{
request.setAttribute("pptCount", ConvertPPTFileToImage.getPPTImgCount(uploadHelper, data.value.getCASE_INTRO_URL()));
return "dtl";
}


    /**
          获取PPT图片
          page  为幻灯片页数
      */

@RequestMapping(value = "loaddtlppt")
public void  loadDtlPpt(HttpServletRequest req,HttpServletResponse rsp,int page) throws Exception{
String loadPath= (String) req.getSession().getAttribute("loadPptUrl");
String imageFormatNameString ="jpeg";
rsp.setHeader("Pragma", "No-cache");
rsp.setHeader("Cache-Control", "No-cache");
rsp.setDateHeader("Expires", 0);
// 指定生成的响应是图片
rsp.setContentType("image/jpeg");
switch(ConvertPPTFileToImage.checkOrignalFileFormat(loadPath)){
case 0:
System.out.println("待转换的PPT文件不存在或者不是PPT和PPTX格式的文件!");
break;
case 1:
ConvertPPTFileToImage.convertPPTtoImage([自行改成PPT文件路径],page,[文件名], imageFormatNameString,rsp.getOutputStream());
break;
case 2:
ConvertPPTFileToImage.convertPPTXtoImage([自行改成PPT文件路径],page,[文件名],imageFormatNameString,rsp.getOutputStream());
break;
}

}









-------------------------jsp  代码---------------------------


ppts.jsp   html


<c:forEach begin="1" end="${pptCount}" varStatus="status">
<img alt="方案详情" src="<c:url value="/${base}loaddtlppt?page=${status.index-1}" />&time=<%=System.currentTimeMillis()%>" />
</c:forEach>




html  end









//---------------------------------------------------------------
相关JAR    没有用mave 也可以直接下载 poi 包
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.10-FINAL</version>
</dependency>


<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-scratchpad</artifactId>
   <version>3.11-beta3</version>
</dependency>




Linux 上传  字体   


首先 找到 windows 下的字体 这里以宋体为例子
C:\Windows\Fonts\simsun.ttc   
上传到  linux jar 的 font 目录下
$HOME_PATH/jar/lib/fonts/fallback 目录下
(如果fonts下没有 fallback 目录自己创建    然后重启tomcat 就可以了  ,注意 是 ttc 后缀 不是ttf)




就此完毕  希望能帮到大家 ---------------第一次写







2019-04-12 22:15:09 fukaiit 阅读数 719
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1268 人正在学习 去看看 钟林森

方案一:word转html

使用Apache POI将word转为html,生成静态html,预览功能直接链接到html。

1. 添加依赖

<!-- word转html -->
<dependency>
	<groupId>fr.opensagres.xdocreport</groupId>
	<artifactId>fr.opensagres.xdocreport.document</artifactId>
	<version>1.0.5</version>
</dependency>
<dependency>
	<groupId>fr.opensagres.xdocreport</groupId>
	<artifactId>org.apache.poi.xwpf.converter.xhtml</artifactId>
	<version>1.0.5</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>3.12</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-scratchpad</artifactId>
	<version>3.12</version>
</dependency>

2. 编写工具类Word2HtmlUtil.java

import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.List;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.converter.PicturesManager;
import org.apache.poi.hwpf.converter.WordToHtmlConverter;
import org.apache.poi.hwpf.usermodel.Picture;
import org.apache.poi.hwpf.usermodel.PictureType;
import org.apache.poi.xwpf.converter.core.BasicURIResolver;
import org.apache.poi.xwpf.converter.core.FileImageExtractor;
import org.apache.poi.xwpf.converter.core.FileURIResolver;
import org.apache.poi.xwpf.converter.xhtml.XHTMLConverter;
import org.apache.poi.xwpf.converter.xhtml.XHTMLOptions;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.w3c.dom.Document;

public class Word2HtmlUtil {
	/**
	 * 兼容doc和docx的word转html方法
	 * @param inFile 需要转换的word文件
	 * @param outPath 输出文件路径
	 * @param outName 输出文件名
	 */
	public static void word2Html(String inFile, String outPath, String outName) throws Exception{
		FileInputStream fis=new FileInputStream(inFile);
		String suffix=inFile.substring(inFile.lastIndexOf("."));
		if (suffix.equalsIgnoreCase(".docx")) {
			docx2Html(fis, outPath, outName);
		} else {
			doc2Html(fis, outPath, outName);
		}
	}
	
	public static void docx2Html(InputStream fis, String outPath ,String outName) throws Exception{
		// 加载word文档生成 XWPFDocument对象
		XWPFDocument document = new XWPFDocument(fis);
		// 解析 XHTML配置
		String imageFolder = outPath + "images"+File.separator+"docx"+File.separator;//图片存放路径
		File imageFolderFile = new File(imageFolder);
		XHTMLOptions options = XHTMLOptions.create().URIResolver(new FileURIResolver(imageFolderFile));
		options.setExtractor(new FileImageExtractor(imageFolderFile));
		options.setIgnoreStylesIfUnused(false);
		options.setFragment(true);
		options.URIResolver(new BasicURIResolver("images/docx/"));//html中img的src前缀
		// 将 XWPFDocument转换成XHTML
		OutputStream out = new FileOutputStream(new File(outPath + outName));
		XHTMLConverter.getInstance().convert(document, out, options);
	}
	
	public static void doc2Html(InputStream fis, String outPath, String outName) throws Exception {
		HWPFDocument wordDocument = new HWPFDocument(fis);
		WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());
		wordToHtmlConverter.setPicturesManager(new PicturesManager() {
			public String savePicture(byte[] content, PictureType pictureType, String suggestedName, float widthInches, float heightInches) {
				return "images/doc/" + suggestedName;// html中img的src值
			}
		});
	    wordToHtmlConverter.processDocument(wordDocument);
	    //保存图片
	    List <Picture> pics = wordDocument.getPicturesTable().getAllPictures();
	    if (pics != null) {
	        for (int i = 0; i < pics.size(); i++) {
	            Picture pic = (Picture) pics.get(i);
	            try {
	            	String imageFolder = outPath + "images" + File.separator + "doc" + File.separator;
	            	File dir=new File(imageFolder);//图片保存路径
	        		if(!dir.exists()) {
	        			dir.mkdirs();
	        		}
	                pic.writeImageContent(new FileOutputStream(imageFolder + pic.suggestFullFileName()));
	            } catch (FileNotFoundException e) {
	                e.printStackTrace();
	            }
	        }
	    }
	    Document htmlDocument = wordToHtmlConverter.getDocument();
	    ByteArrayOutputStream out = new ByteArrayOutputStream();
	    DOMSource domSource = new DOMSource(htmlDocument);
	    StreamResult streamResult = new StreamResult(out);
	    TransformerFactory tf = TransformerFactory.newInstance();
	    Transformer serializer = tf.newTransformer();
	    serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
	    serializer.setOutputProperty(OutputKeys.INDENT, "yes");
	    serializer.setOutputProperty(OutputKeys.METHOD, "html");
	    serializer.transform(domSource, streamResult);
	    out.close();
	    writeFile(new String(out.toByteArray()), outPath + outName);
	}
	
	public static void writeFile(String content, String path) {
	    FileOutputStream fos = null;
	    BufferedWriter bw = null;
	    try {
	        File file = new File(path);
	        fos = new FileOutputStream(file);
	        bw = new BufferedWriter(new OutputStreamWriter(fos, "utf-8"));
	        bw.write(content);
	    } catch (FileNotFoundException fnfe) {
	        fnfe.printStackTrace();
	    } catch (IOException ioe) {
	        ioe.printStackTrace();
	    } finally {
	        try {
	            if (bw != null)
	                bw.close();
	            if (fos != null)
	                fos.close();
	        } catch (IOException ie) {}
	    }
	}
}

3. 测试

@Test
public void testWord2Html() throws Exception{
	Word2HtmlUtil.word2Html("D:/test/doctest.doc", "D:/test/output/","doctest.html");
}

在这里插入图片描述

方案二:使用第三方服务

一般是收费的,一般也会提供功能受限的免费版本。

方案三:使用微软 Office Online 服务

地址https://products.office.com/zh-CN/office-online/view-office-documents-online

使用:在https://view.officeapps.live.com/op/view.aspx?src=后连接在线文档URL(必须为 http:// 或 https:// 形式,文档必须是 Word、Excel 或 PowerPoint 文档)。
测试https://view.officeapps.live.com/op/view.aspx?src=http%3A%2F%2Fwww.snpdp.com%2Ffile-download-1064.html

163邮箱附件预览(高清版)就是使用office apps实现的:
在这里插入图片描述


永中文档预览服务详解

163邮箱附件预览(极速版)就是使用永中的服务实现的:在这里插入图片描述

说明:
1.使用该方法,文档应该会被上传到永中的服务器,非公开文档不宜使用(购买的话应该也可以部署的自己的服务器上,不深究)。
2.下面测试方法中上传的文档不知道会不会被定时清理而不可用,不过如果有这个问题,只要申请免费受限账号应该就可以了。

1. 试一试在线预览!

地址http://www.yozodcs.com/page/example.html
测试http://www.yozodcs.com:8000/2019/04/11/MTkwNDExNTgxODc5MDUx.html
在这里插入图片描述

2. Web调用

(1)URL文档

$.ajax({
    url: "http://dcs.yozosoft.com:80/onlinefile", //服务地址
    data: {
        downloadUrl: "http://www.snpdp.com/file-download-1064.html", //要预览的文档地址
        convertType: "0"
    },
    dataType: "json",
    type: "post",
    success: function(data) {
        console.log(data);
        //window.location=data.data[0];
    },
    error: function(data) {
        console.error(data)
    }
});

接口说明、convertType参数取值说明、返回参数说明:http://www.yozodcs.com/help.html#link14

(2)上传文档
引入ajaxfileupload.js(jQuery-File-Upload

<input id="fileupload" type="file" name="file"><!-- name值需为file,与永中接口参数名对应 -->

<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script src="js/jquery.ui.widget.js"></script>
<script src="js/jquery.fileupload.js"></script>

<script>
$(function() {
    $('#fileupload').fileupload({
        url: 'http://dcs.yozosoft.com:80/upload',
        dataType: 'json',
        formData: {
            convertType: "0"
        },
        done: function(e, data) {
            console.log(data.result);
        }
    });
});
</script>

测试:http://dcs.yozosoft.com:8000/2019/04/12/MTkwNDEyNDAyNDM2MzMx.html
在这里插入图片描述

3. Java调用

(1)添加依赖

<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
	<groupId>commons-logging</groupId>
	<artifactId>commons-logging</artifactId>
	<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
	<groupId>org.apache.httpcomponents</groupId>
	<artifactId>httpclient</artifactId>
	<version>4.5.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
<dependency>
	<groupId>org.apache.httpcomponents</groupId>
	<artifactId>httpcore</artifactId>
	<version>4.4.11</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime -->
<dependency>
	<groupId>org.apache.httpcomponents</groupId>
	<artifactId>httpmime</artifactId>
	<version>4.5.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.55</version>
</dependency>

(2)编写工具类DCSUtil.java

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.ParseException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

/**
* @Description: DCS文档转换服务Java调用代码示例
*/
public class DCSUtil {
	/**
	* 向指定 URL 发送POST方法的请求
	* @param url 发送请求的 URL
	* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
	* @return 所代表远程资源的响应结果
	*/
	public static String sendPost(String url, String param) {
		PrintWriter out = null;
		BufferedReader in = null;
		String result = "";
		try {
			URL realUrl = new URL(url);
			// 打开和URL之间的连接
			URLConnection conn = realUrl.openConnection();
			conn.setRequestProperty("Accept-Charset", "UTF-8");
			// 设置通用的请求属性
			conn.setRequestProperty("accept", "*/*");
			conn.setRequestProperty("connection", "Keep-Alive");
			conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
			// 发送POST请求必须设置如下两行
			conn.setDoOutput(true);
			conn.setDoInput(true);
			// 获取URLConnection对象对应的输出流
			out = new PrintWriter(conn.getOutputStream());
			// 发送请求参数
			out.print(param);
			// flush输出流的缓冲
			out.flush();
			// 定义BufferedReader输入流来读取URL的响应
			in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
			String line;
			while ((line = in.readLine()) != null) {
				result += line;
			}
		} catch (Exception e) {
			System.out.println("发送 POST 请求出现异常!" + e);
			e.printStackTrace();
		}
		// 使用finally块来关闭输出流、输入流
		finally {
			try {
				if (out != null) {
					out.close();
				}
				if (in != null) {
					in.close();
				}
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
		return result;
	}
	
	/**
	* 向指定 URL 上传文件POST方法的请求
	*
	* @param url      发送请求的 URL
	* @param filepath 文件路径
	* @param type     转换类型
	* @return 所代表远程资源的响应结果, json数据
	*/
	public static String SubmitPost(String url, String filepath, String type) {
		String requestJson = "";
		HttpClient httpclient = new DefaultHttpClient();
		try {
			HttpPost httppost = new HttpPost(url);
			FileBody file = new FileBody(new File(filepath));
			MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, null,
			Charset.forName("UTF-8"));
			reqEntity.addPart("file", file); // file为请求后台的File upload;属性
			reqEntity.addPart("convertType", new StringBody(type, Charset.forName("UTF-8")));
			httppost.setEntity(reqEntity);
			HttpResponse response = httpclient.execute(httppost);
			int statusCode = response.getStatusLine().getStatusCode();
			if (statusCode == HttpStatus.SC_OK) {
				HttpEntity resEntity = response.getEntity();
				requestJson = EntityUtils.toString(resEntity);
				EntityUtils.consume(resEntity);
			}
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			// requestJson = e.toString();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			// requestJson = e.toString();
		} finally {
			try {
				httpclient.getConnectionManager().shutdown();
			} catch (Exception ignore) {
			}
		}
		return requestJson;
	}
}

(3)测试

@Test
public void testDCS() {
	// 文件上传转换
	String convertByFile = DCSUtil.SubmitPost("http://dcs.yozosoft.com:80/upload", "D:/test/doctest.doc", "0");
	System.out.println(convertByFile);
	// 输出:{"result":0,"data":["http://dcs.yozosoft.com:8000/2019/04/12/MTkwNDEyNTM5NTE2Njk5.html"],"message":"转换成功","type":0}

	// 网络地址转换
	String convertByUrl = DCSUtil.sendPost("http://dcs.yozosoft.com:80/onlinefile",
			"downloadUrl=http://www.snpdp.com/file-download-1064.html&convertType=1");
	System.out.println(convertByUrl);
	// 输出:{"result":0,"data":["http://dcs.yozosoft.com:8000/2019/04/12/MTkwNDEyNTQ0NjcyMDI3.html"],"message":"转换成功","type":1}
}
2018-07-17 11:07:24 m0_37615697 阅读数 313
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1268 人正在学习 去看看 钟林森

 

由于项目需要,要将offiice文件转换为html文件实现在线预览,在网上查了很多资料,也遇到了很多问题,最终也实现了,不过还是存在一些问题。本文参考了一些前辈的经验,现在项目已经完了,已经忘了其他文档的链接了,如果作者看到了,请联系我加上。

pom文件依赖:

<properties>

        <poi-version>3.15</poi-version>
        <ooxml-schemas-version>1.1</ooxml-schemas-version>
</properties>

<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi</artifactId>
   <version>${poi-version}</version>
  </dependency>
  
  <dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml-schemas</artifactId>
   <version>${poi-version}</version>
  </dependency>
  
  <dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>${poi-version}</version>
  </dependency> 
  
  <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-scratchpad</artifactId>
      <version>${poi-version}</version>
  </dependency>


  <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>ooxml-schemas</artifactId>
      <version>${ooxml-schemas-version}</version>
  </dependency>

 

2018-10-22 16:30:00 mp624183768 阅读数 2314
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1268 人正在学习 去看看 钟林森

java实现在线预览
- -之poi实现word、excel、ppt转html
简介
java实现在线预览功能是一个大家在工作中也许会遇到的需求,如果公司有钱,直接使用付费的第三方软件或者云在线预览服务就可以了,例如永中office、office web 365(http://www.officeweb365.com/)他们都有云在线预览服务,就是要钱0.0 
如果想要免费的,可以用openoffice,还需要借助其他的工具(例如swfTools、FlexPaper等)才行,可参考这篇文章http://blog.csdn.net/z69183787/article/details/17468039,写的挺细的,实现原理就是: 
1.通过第三方工具openoffice,将word、excel、ppt、txt等文件转换为pdf文件; 
2.通过swfTools将pdf文件转换成swf格式的文件; 
3.通过FlexPaper文档组件在页面上进行展示。 
当然如果装了Adobe Reader XI,那把pdf直接拖到浏览器页面就可以直接打开预览,这样就不需要步骤2、3了,前提就是客户装了Adobe Reader XI这个pdf阅读器。 
我这里介绍通过poi实现word、excel、ppt转html,这样就可以放在页面上了。

word转html
 

package wordToHtml;import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.List;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.commons.io.FileUtils;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.converter.PicturesManager;
import org.apache.poi.hwpf.converter.WordToHtmlConverter;
import org.apache.poi.hwpf.usermodel.Picture;
import org.apache.poi.hwpf.usermodel.PictureType;
import org.w3c.dom.Document;
public class PoiWordToHtml {
 public static void main(String[] args) throws Throwable {
  final String path = "D:\\poi-test\\wordToHtml\\";
  final String file = "人员选择系分.doc";
  InputStream input = new FileInputStream(path + file);
  HWPFDocument wordDocument = new HWPFDocument(input);
  WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(
    DocumentBuilderFactory.newInstance().newDocumentBuilder()
      .newDocument());
  wordToHtmlConverter.setPicturesManager(new PicturesManager() {
   public String savePicture(byte[] content, PictureType pictureType,
     String suggestedName, float widthInches, float heightInches) {
    return suggestedName;
   }
  });
  wordToHtmlConverter.processDocument(wordDocument);
  List pics = wordDocument.getPicturesTable().getAllPictures();
  if (pics != null) {
   for (int i = 0; i < pics.size(); i++) {
    Picture pic = (Picture) pics.get(i);
    try {
     pic.writeImageContent(new FileOutputStream(path
       + pic.suggestFullFileName()));
    } catch (FileNotFoundException e) {
     e.printStackTrace();
    }
   }
  }
  Document htmlDocument = wordToHtmlConverter.getDocument();
  ByteArrayOutputStream outStream = new ByteArrayOutputStream();
  DOMSource domSource = new DOMSource(htmlDocument);
  StreamResult streamResult = new StreamResult(outStream);
  TransformerFactory tf = TransformerFactory.newInstance();
  Transformer serializer = tf.newTransformer();
  serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
  serializer.setOutputProperty(OutputKeys.INDENT, "yes");
  serializer.setOutputProperty(OutputKeys.METHOD, "html");
  serializer.transform(domSource, streamResult);
  outStream.close();
  String content = new String(outStream.toByteArray());
  FileUtils.writeStringToFile(new File(path, "人员选择系分.html"), content, "utf-8");
 }
}


excel转html

package excelToHtml;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.apache.commons.io.FileUtils;
import org.apache.poi.hssf.converter.ExcelToHtmlConverter;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hwpf.converter.PicturesManager;
import org.apache.poi.hwpf.converter.WordToHtmlConverter;
import org.apache.poi.hwpf.usermodel.Picture;
import org.apache.poi.hwpf.usermodel.PictureType;
import org.w3c.dom.Document;


public class PoiExcelToHtml {
    final static String path = "D:\\poi-test\\excelToHtml\\";
     final static String file = "exportExcel.xls";
 public static void main(String args[]) throws Exception {

     InputStream input=new FileInputStream(path+file);
     HSSFWorkbook excelBook=new HSSFWorkbook(input);
     ExcelToHtmlConverter excelToHtmlConverter = new ExcelToHtmlConverter (DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument() );
     excelToHtmlConverter.processWorkbook(excelBook);
     List pics = excelBook.getAllPictures();
     if (pics != null) {
         for (int i = 0; i < pics.size(); i++) {
             Picture pic = (Picture) pics.get (i);
             try {
                 pic.writeImageContent (new FileOutputStream (path + pic.suggestFullFileName() ) );
             } catch (FileNotFoundException e) {
                 e.printStackTrace();
             }
         }
     }
     Document htmlDocument =excelToHtmlConverter.getDocument();
     ByteArrayOutputStream outStream = new ByteArrayOutputStream();
     DOMSource domSource = new DOMSource (htmlDocument);
     StreamResult streamResult = new StreamResult (outStream);
     TransformerFactory tf = TransformerFactory.newInstance();
     Transformer serializer = tf.newTransformer();
     serializer.setOutputProperty (OutputKeys.ENCODING, "utf-8");
     serializer.setOutputProperty (OutputKeys.INDENT, "yes");
     serializer.setOutputProperty (OutputKeys.METHOD, "html");
     serializer.transform (domSource, streamResult);
     outStream.close();

     String content = new String (outStream.toByteArray() );

     FileUtils.writeStringToFile(new File (path, "exportExcel.html"), content, "utf-8");
 }
}



ppt转html
其实只是ppt转图片,有了图片后放到页面上去,点击下一页就一张张显示就可以了。这里只介绍ppt转图片的过程。

package pptToImg;

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 java.awt.Color;   
import java.awt.Dimension;   
import java.awt.Graphics2D;   
import java.awt.geom.Rectangle2D;   
import java.awt.image.BufferedImage;   

import org.apache.poi.hslf.model.TextRun;   
import org.apache.poi.hslf.record.Slide;   
import org.apache.poi.hslf.usermodel.RichTextRun;   
import org.apache.poi.hslf.usermodel.SlideShow;   

public class PPTtoImage {   
    public static void main(String[] args) {   
        // 读入PPT文件   
        File file = new File("D:/poi-test/pptToImg/test.ppt");   
        doPPTtoImage(file);   
    }   

    public static boolean doPPTtoImage(File file) {   
        boolean isppt = checkFile(file);   
        if (!isppt) {   
            System.out.println("The image you specify don't exit!");   
            return false;   
        }   
        try {   

            FileInputStream is = new FileInputStream(file);   
            SlideShow ppt = new SlideShow(is);   
            is.close();   
            Dimension pgsize = ppt.getPageSize();   
            org.apache.poi.hslf.model.Slide[] slide = ppt.getSlides();   
            for (int i = 0; i < slide.length; i++) {   
                System.out.print("第" + i + "页。");   

                TextRun[] truns = slide[i].getTextRuns();      
                for ( int k=0;k<truns.length;k++){      
                   RichTextRun[] rtruns = truns[k].getRichTextRuns();      
                  for(int l=0;l<rtruns.length;l++){      
                       int index = rtruns[l].getFontIndex();      
                        String name = rtruns[l].getFontName();                
                        rtruns[l].setFontIndex(1);      
                        rtruns[l].setFontName("宋体");  
//                        System.out.println(rtruns[l].getText());
                   }      
                }      
                BufferedImage img = new BufferedImage(pgsize.width,pgsize.height, BufferedImage.TYPE_INT_RGB);   

                Graphics2D graphics = img.createGraphics();   
                graphics.setPaint(Color.BLUE);   
                graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height));   
                slide[i].draw(graphics);   

                // 这里设置图片的存放路径和图片的格式(jpeg,png,bmp等等),注意生成文件路径   
                FileOutputStream out = new FileOutputStream("D:/poi-test/pptToImg/pict_"+ (i + 1) + ".jpeg");   
                javax.imageio.ImageIO.write(img, "jpeg", out);   
                out.close();   

            }   
            System.out.println("success!!");   
            return true;   
        } catch (FileNotFoundException e) {   
            System.out.println(e);   
            // System.out.println("Can't find the image!");   
        } catch (IOException e) {   
        }   
        return false;   
    }   

    // function 检查文件是否为PPT   
    public static boolean checkFile(File file) {   

        boolean isppt = false;   
        String filename = file.getName();   
        String suffixname = null;   
        if (filename != null && filename.indexOf(".") != -1) {   
            suffixname = filename.substring(filename.indexOf("."));   
            if (suffixname.equals(".ppt")) {   
                isppt = true;   
            }   
            return isppt;   
        } else {   
            return isppt;   
        }   
    }   

}  



ppt转图片有个缺陷,就是ppt里不是宋体的字有些可能会变成框框。 
以上都需要引入poi的jar包。 
要实现在线预览,只需把转换得到的html在新标签页打开或者镶嵌到某块区域就可以展现了。
 

2019-08-21 21:32:53 LiRunchen 阅读数 123
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1268 人正在学习 去看看 钟林森

java实现在线预览- -之poi实现word、excel、ppt转html

简介

java实现在线预览功能是一个大家在工作中也许会遇到的需求,如果公司有钱,直接使用付费的第三方软件或者云在线预览服务就可以了,例如永中office、office web 365(http://www.officeweb365.com/)他们都有云在线预览服务,就是要钱0.0
如果想要免费的,可以用openoffice,还需要借助其他的工具(例如swfTools、FlexPaper等)才行,可参考这篇文章http://blog.csdn.net/z69183787/article/details/17468039,写的挺细的,实现原理就是:
1.通过第三方工具openoffice,将word、excel、ppt、txt等文件转换为pdf文件;
2.通过swfTools将pdf文件转换成swf格式的文件;
3.通过FlexPaper文档组件在页面上进行展示。
当然如果装了Adobe Reader XI,那把pdf直接拖到浏览器页面就可以直接打开预览,这样就不需要步骤2、3了,前提就是客户装了Adobe Reader XI这个pdf阅读器。
我这里介绍通过poi实现word、excel、ppt转html,这样就可以放在页面上了。

word转html


package com.lrc.wordhtml;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.List;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.commons.io.FileUtils;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.converter.PicturesManager;
import org.apache.poi.hwpf.converter.WordToHtmlConverter;
import org.apache.poi.hwpf.usermodel.Picture;
import org.apache.poi.hwpf.usermodel.PictureType;
import org.w3c.dom.Document;
public class PoiWordToHtml {

 public static void main(String[] args) throws Throwable {
 
  final String path = "D:\\poi-test\\wordToHtml\\";
  final String file = "人员选择系分.doc";
  InputStream input = new FileInputStream(path + file);
  HWPFDocument wordDocument = new HWPFDocument(input);
  WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(
    DocumentBuilderFactory.newInstance().newDocumentBuilder()
      .newDocument());
  wordToHtmlConverter.setPicturesManager(new PicturesManager() {
   public String savePicture(byte[] content, PictureType pictureType,
     String suggestedName, float widthInches, float heightInches) {
    return suggestedName;
   }
  });
  wordToHtmlConverter.processDocument(wordDocument);
  List pics = wordDocument.getPicturesTable().getAllPictures();
  if (pics != null) {
   for (int i = 0; i < pics.size(); i++) {
    Picture pic = (Picture) pics.get(i);
    try {
     pic.writeImageContent(new FileOutputStream(path
       + pic.suggestFullFileName()));
    } catch (FileNotFoundException e) {
     e.printStackTrace();
    }
   }
  }
  Document htmlDocument = wordToHtmlConverter.getDocument();
  ByteArrayOutputStream outStream = new ByteArrayOutputStream();
  DOMSource domSource = new DOMSource(htmlDocument);
  StreamResult streamResult = new StreamResult(outStream);
  TransformerFactory tf = TransformerFactory.newInstance();
  Transformer serializer = tf.newTransformer();
  serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
  serializer.setOutputProperty(OutputKeys.INDENT, "yes");
  serializer.setOutputProperty(OutputKeys.METHOD, "html");
  serializer.transform(domSource, streamResult);
  outStream.close();
  String content = new String(outStream.toByteArray());
  FileUtils.writeStringToFile(new File(path, "人员选择系分.html"), content, "utf-8");
 }
}

excel转html


package com.lrc.excelToHtml;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.apache.commons.io.FileUtils;
import org.apache.poi.hssf.converter.ExcelToHtmlConverter;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hwpf.converter.PicturesManager;
import org.apache.poi.hwpf.converter.WordToHtmlConverter;
import org.apache.poi.hwpf.usermodel.Picture;
import org.apache.poi.hwpf.usermodel.PictureType;
import org.w3c.dom.Document;


public class PoiExcelToHtml {

	final static String path = "D:\\poi-test\\excelToHtml\\";
	 final static String file = "exportExcel.xls";
	 
 public static void main(String args[]) throws Exception {
 
	 
	 InputStream input=new FileInputStream(path+file);
	 HSSFWorkbook excelBook=new HSSFWorkbook(input);
	 ExcelToHtmlConverter excelToHtmlConverter = new ExcelToHtmlConverter (DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument() );
	 excelToHtmlConverter.processWorkbook(excelBook);
	 List pics = excelBook.getAllPictures();
     if (pics != null) {
         for (int i = 0; i < pics.size(); i++) {
             Picture pic = (Picture) pics.get (i);
             try {
                 pic.writeImageContent (new FileOutputStream (path + pic.suggestFullFileName() ) );
             } catch (FileNotFoundException e) {
                 e.printStackTrace();
             }
         }
     }
     Document htmlDocument =excelToHtmlConverter.getDocument();
     ByteArrayOutputStream outStream = new ByteArrayOutputStream();
     DOMSource domSource = new DOMSource (htmlDocument);
     StreamResult streamResult = new StreamResult (outStream);
     TransformerFactory tf = TransformerFactory.newInstance();
     Transformer serializer = tf.newTransformer();
     serializer.setOutputProperty (OutputKeys.ENCODING, "utf-8");
     serializer.setOutputProperty (OutputKeys.INDENT, "yes");
     serializer.setOutputProperty (OutputKeys.METHOD, "html");
     serializer.transform (domSource, streamResult);
     outStream.close();

     String content = new String (outStream.toByteArray() );

     FileUtils.writeStringToFile(new File (path, "exportExcel.html"), content, "utf-8");
 }
}

ppt转html
其实只是ppt转图片,有了图片之后,放到页面上去,点击下一页就一张张显示就可以了。这里只介绍ppt转图片的过程。


package com.lrc.pptToImg;

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 java.awt.Color;   
import java.awt.Dimension;   
import java.awt.Graphics2D;   
import java.awt.geom.Rectangle2D;   
import java.awt.image.BufferedImage;   
  
import org.apache.poi.hslf.model.TextRun;   
import org.apache.poi.hslf.record.Slide;   
import org.apache.poi.hslf.usermodel.RichTextRun;   
import org.apache.poi.hslf.usermodel.SlideShow;   
  
public class PPTtoImage {   
    public static void main(String[] args) {   
        // 读入PPT文件   
        File file = new File("D:/poi-test/pptToImg/test.ppt");   
        doPPTtoImage(file);   
    }   
  
    public static boolean doPPTtoImage(File file) {   
        boolean isppt = checkFile(file);   
        if (!isppt) {   
            System.out.println("The image you specify don't exit!");   
            return false;   
        }   
        try {   
  
            FileInputStream is = new FileInputStream(file);   
            SlideShow ppt = new SlideShow(is);   
            is.close();   
            Dimension pgsize = ppt.getPageSize();   
            org.apache.poi.hslf.model.Slide[] slide = ppt.getSlides();   
            for (int i = 0; i < slide.length; i++) {   
                System.out.print("第" + i + "页。");   
                   
                TextRun[] truns = slide[i].getTextRuns();      
                for ( int k=0;k<truns.length;k++){      
                   RichTextRun[] rtruns = truns[k].getRichTextRuns();      
                  for(int l=0;l<rtruns.length;l++){      
                       int index = rtruns[l].getFontIndex();      
                        String name = rtruns[l].getFontName();                
                        rtruns[l].setFontIndex(1);      
                        rtruns[l].setFontName("宋体");  
//                        System.out.println(rtruns[l].getText());
                   }      
                }      
                BufferedImage img = new BufferedImage(pgsize.width,pgsize.height, BufferedImage.TYPE_INT_RGB);   
  
                Graphics2D graphics = img.createGraphics();   
                graphics.setPaint(Color.BLUE);   
                graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height));   
                slide[i].draw(graphics);   
  
                // 这里设置图片的存放路径和图片的格式(jpeg,png,bmp等等),注意生成文件路径   
                FileOutputStream out = new FileOutputStream("D:/poi-test/pptToImg/pict_"+ (i + 1) + ".jpeg");   
                javax.imageio.ImageIO.write(img, "jpeg", out);   
                out.close();   
  
            }   
            System.out.println("success!!");   
            return true;   
        } catch (FileNotFoundException e) {   
            System.out.println(e);   
            // System.out.println("Can't find the image!");   
        } catch (IOException e) {   
        }   
        return false;   
    }   
  
    // function 检查文件是否为PPT   
    public static boolean checkFile(File file) {   
  
        boolean isppt = false;   
        String filename = file.getName();   
        String suffixname = null;   
        if (filename != null && filename.indexOf(".") != -1) {   
            suffixname = filename.substring(filename.indexOf("."));   
            if (suffixname.equals(".ppt")) {   
                isppt = true;   
            }   
            return isppt;   
        } else {   
            return isppt;   
        }   
    }   
  
}  

ppt转图片有个缺陷,就是ppt里不是宋体的字有些可能会变成框框。
以上都需要引入poi的jar包。
要实现在线预览,只需把转换得到的html在新标签页打开或者镶嵌到某块区域就可以展现了。

没有更多推荐了,返回首页