zoukankan      html  css  js  c++  java
  • java convert excel to pdf

    转自:http://kevin-wanwei.javaeye.com/blog/521211

    全文粘贴

    在文章最后可以下载原文的java代码

    excel文件转换为pdf文件的问题总结

    关键字: java应用技术

    Excel文件转化PDF文件的程序总结

    一、概述:

             我写的这个小工具:具有三种基本功能:(1)可以将本地excel文件转化为本地的pdf文件,(2)可以将已经存入数据中的excel文件读成一个输入流,可以将这个输入流转化为本地的pdf文件,将可以将其转化为网络的pdf的输出流,(3)可以将本地excel文件转化为一个网络的输出流。

    以下是我的这个工具对外提供的三个方法的接口(源代码已经上传):

    Java代码
    1. package com.bpexcel2pdf.xls2pdf;   
    2.   
    3. import java.io.OutputStream;   
    4.   
    5. import com.bpexcel2pdf.pagesetting.PageSetting;   
    6.   
    7.   
    8. /**  
    9.  * 读 excel文件的标准接口  
    10.  * @author newapps  
    11.  *  2009-11-9  
    12.  */  
    13. public interface Excel_TO_PDF {   
    14.     /**  
    15.      * 把本地的excel文件转化为本地的PDF文件  
    16.      * @param exelFilePath excel文件所在本地路径  
    17.      * @param PdfFilePath 生成PDF文件的路径  
    18.      * @param PageSetting设置页面参数信息的类  
    19.      */  
    20.     public void convertFromLocal(String excelFilePath,String pdfFilePath,PageSetting pageSetting)throws Exception;   
    21.     /**  
    22.      * 把数据库中存取excel文件转化为PDF文件输出流  
    23.      * @param exelFilePath excel文件名称  
    24.      * @param output PDF文件输出流  
    25.      * @param PageSetting设置页面参数信息的类  
    26.      */  
    27.     public void convertFromDB(String excelFileName,OutputStream output,PageSetting pageSetting)throws Exception;   
    28.     /**  
    29.      * 把本地的excel文件转化为PDF文件输出流  
    30.      * @param exelFilePath excel文件所在本地路径  
    31.      * @param output PDF文件输出流  
    32.      * @param PageSetting设置页面参数信息的类  
    33.      */  
    34.     public void convertFromLocal(String excelFilePath,OutputStream output,PageSetting pageSetting)throws Exception;   
    35. }  
    package com.bpexcel2pdf.xls2pdf;import java.io.OutputStream;import com.bpexcel2pdf.pagesetting.PageSetting;/** * 读 excel文件的标准接口 * @author newapps *2009-11-9 */public interface Excel_TO_PDF {/** * 把本地的excel文件转化为本地的PDF文件 * @param exelFilePath excel文件所在本地路径 * @param PdfFilePath 生成PDF文件的路径 * @param PageSetting设置页面参数信息的类 */public void convertFromLocal(String excelFilePath,String pdfFilePath,PageSetting pageSetting)throws Exception;/** * 把数据库中存取excel文件转化为PDF文件输出流 * @param exelFilePath excel文件名称 * @param output PDF文件输出流 * @param PageSetting设置页面参数信息的类 */public void convertFromDB(String excelFileName,OutputStream output,PageSetting pageSetting)throws Exception;/** * 把本地的excel文件转化为PDF文件输出流 * @param exelFilePath excel文件所在本地路径 * @param output PDF文件输出流 * @param PageSetting设置页面参数信息的类 */public void convertFromLocal(String excelFilePath,OutputStream output,PageSetting pageSetting)throws Exception;}

    
    
    
    
    
    

    Excel 转化为PDF文件首先从Excel中读取数据。从Excel中去读数据在开源世界里有两种比较常用的技术:

    (1) jxl技术:

    jxl是一个韩国人写的java操作excel的工具, javaExcelAPI对中文支持非常好,API是纯Java的, 并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。 另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。

    使用如下:

    搭建环境

     将下载后的文件解包,得到jxl.jar,放入classpath,安装就完成了。

    jxl.jar的下载地址:

    http://sourceforge.net/projects/jexcelapi/files/

    (2)POI技术:

    Jakarta POI 是apache的子项目,目标是处理ole2对象。它提供了一组操纵Windows文档的Java API 。目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。

    HSSF概况 :HSSF 是Horrible SpreadSheet Format的缩写,也即“讨厌的电子表格格式”。 也许HSSF的名字有点滑稽,就本质而言它是一个非常严肃、正规的API。通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。 HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。前者很好理解,后者比较抽象,但操作效率要高得多。

    POI文档和jar包的下载地址:

    http://poi.apache.org/download.html

    Excel转化的PDF 其次就是向PDF文件写入内容,比较成熟的技术主要是:Itext技术。

    (3)itext技术

    iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。

     iText的安装非常方便,

    http://www.lowagie.com/iText/download.html 

    在 download 网站上下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了。

    由于本程序应用到jxl技术读取excel中格式的内容,并没有其他对excel操作,所以在这里我只介绍jxl是如何读取excel文件。

    (1)   首先需要得到excel文件的输入流,通过输入流来获得一个Workbook对象。

    is=new FileInputStream(“d:\\test.xls”);              wb=Workbook.getWorkbook(is);

    (2)   通过Workbook对象或得该excel文件中的工作簿的数组。

    Sheet[]sheets=wb.getSheets();

     (3)通过Sheet数组获得每个Sheet对象,在通过Sheet对象来获得Cell(单元格)对象。

             for(int k=0;k<sheet.length;k++ ){

                        int cols=sheet[k].getColumns();

                     int rows=sheet[k].getRows();

                 for(int i=0;i<rows;i++){

                         for(int j=0;j<cols;j++){

                              Cell cell=sheet[k].getCell(j,i);

                         }

                   }

    }

    (4)不要忘记关闭工作簿对象。

           /**

        * 关闭工作簿对象

        *

        */

       public void closeWorkbook(){

           if(wb!=null){

           wb.close();

           System.out.println("-->关闭Workbook对象成功!");

           }

       }

    读取单元格的内容以后应用itext技术按照表格的形式写入pdf中。

    Itext写入pdf一般有以下五个步骤:

    三、建立第一个PDF文档

      用iText生成PDF文档需要5个步骤:

      ①建立com.lowagie.text.Document对象的实例。

    Document document = new Document(); 

      ②建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。

    PDFWriter.getInstance(document, new FileOutputStream("Helloworld.PDF")); 

      ③打开文档。

    document.open(); 

      ④向文档中添加内容。

    document.add(new Paragraph("Hello World")); 

      ⑤关闭文档。

    document.close(); 

    Excel转化PDF问题要注意的问题

    在读取excel内容是以读出的单元格为基础。在转化为pdf过程为了保证pdf表格中的单元格完全和excel中的表格一样,必须注意以下问题:

    (1)       单元格的字体:包括字体大小、字体样式、字体颜色

    (2)       单元格的边框颜色:包括左边框颜色、右边框颜色、上边框颜色、下边框颜色

    (3)       单元格的背景色

    (4)       单元格的宽度(也就是列宽)

    (5)       单元格的高度(也就是行高)不过在itext中是没有办法控制行高,它只控制了列宽

    (6)       单元格合并问题

    在这里要特别注意的问题就是:

    (1)itext默认是不支持中文的,我们要使用中文还必须下载支持中文的jar包 iTextAsian.jar。在获得jxl单元格的对象cell,可以通过该对象来获得其格式对象CellFormat format=cell.getCellFormat(),通过该对象就可以该单元格的字体对象Font font=format.getFont()。可以构造这样一个itext中的字体对象:new  Font(“字体名称”,字体大小,字体样式,字体颜色)。也可以通过下面的方法:来构造一个中文对象,首先要构造一个BaseFont对象:BASE_CHINESE_FONT = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);在通过BaseFont对象来构造一个中文字体对象Font font=new Font(BASE_CHINESE_FONT, 字体大小,字体样式,字体颜色)。

       (2)单元格背景色会覆盖单元格下边框的颜色

    (3)在要设置单元格对象的封装中jxl和itext的封装是完全不同,要注意之间的转化。(详情请查看两者的API)

    (4)至于单元格合并的算法在里我不想做解释。我已经将程序的所有源码公开。你若想了解,那就去研究代码。

    总结:

    Excel转化PDF文件只要抓住jxl和itext单元格的转化问题。也就是说程序在转化过程中始终以单元格为基础,不管是控制单元格的字体,单元格的合并问题。

     

  • 相关阅读:
    iOS 宏(define)与常量(const)的正确使用
    Android中全屏 取消标题栏,TabHost中设置NoTitleBar的三种方法(转)
    如何在 GitHub 建立个人主页和项目演示页面
    Git 使用指南(cmd + gui)
    Google C++ 编码规范(中文版)
    SVN服务器搭建和使用
    演化理解 Android 异步加载图片(转)
    Android之断点续传下载(转)
    Android学习笔记——关于onConfigurationChanged(转)
    (转)Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences
  • 原文地址:https://www.cnblogs.com/loveyou/p/1871790.html
Copyright © 2011-2022 走看看