来自 操作系统 2019-12-14 21:58 的文章
当前位置: 澳门威尼斯人平台 > 操作系统 > 正文

java达成导出excel、word、 pdf

在稍稍须求个中大家供给抓取字段并且填充到excel表格里面,最终将excel表格调换来pdf格式举办输出,俺首先次接触那些必要时,遭受多少个相比劳累的标题,现在逐个列出并且提供实施方案。

透过几天的求学到底得以兑现java中校查询结果存款和储蓄为Excel,将页面另存word,将html页面存为pdf格式那多少个作用了,那是自家的首先篇博客,为了分享代码,也为了现在本身的就学成果不会弄丢,未来将那么些功用贴在互连网。 
后生可畏、将查询结果存为excel,笔者的结束学业设计是商铺音讯保管连串,三个页面将商品音讯展示出来了,今后将结果存为excel 
product.jsp页面 
<html> 
<title>this is my excel</title> 
<head> 
<script type="text/javascript"> 
function genExcel(){ 
    window.open("productManage/creatExcel.jsp"); 
   } 
   function genWord(){ 
    window.open("productManage/creatWord.jsp"); 
   } 
   function genPdf(){ 
   window.open("productManage/creatPdf.jsp"); 
   } 
</script> 
</head> 
<body> 
<form> 
<input type="button" onclick="genExcel()" value="生成excel"> 
<input type="button" onclick="genWord()" value="生成word"> 
        <input type="button" onclick="genPdf()" value="生成pdf">  
</form> 
</body> 
</html> 
************************************************* 
//creatExcel.jsp 
<%@page import="com.bean.Productbean"%> 
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 
<%@ page import="com.dao.*" %> 
<% 
String path = request.getContextPath(); 
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
%> 

  近日越过二个类型要求把word 转成pdf,百度了生机勃勃晃英特网的方案有为数不菲,举例设想打字与印刷、给word 装扩张插件等,那几个方案都凭仗于ms word 程序,在java代码中也得利用诸如jacob或jcom那类java com bridge,使得服务器开拓受限于win平台,何况铺排起来也很困苦。后来在某论坛看见了贰个openoffice+jodconverter的转换方案,能够产生word到PDF的转变职业,服务器开垦端须要设置openoffice,然则要求一步额外的操作--须求在服务器开采上的某部端口提供二个openoffice服务,这对配置起来显得麻烦了点,貌似也不太安全。
  不时机缘开掘了PageOffice组件也足以兑现word转pdf功用。何况不光是轻易的把word转为pdf格式,还足以支撑动态填充数据到word模板文件然后再转为pdf文件。
  以下为官方网站介绍:

在日常应用程序中,对office和pdf文书档案举行读取数据是相比平淡无奇的机能,特别在重重web应用程序中。所以昨日大家就总结来看一下Java对word、excel、pdf文件的读取。本篇博客只是讲授不难利用。假使想深切摸底原理。请读者自行钻研一些荣辱与共源码。

1:excel转pdf现身乱码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <head> 
    <base href="<%=basePath%>"> 
    
    <title>My JSP 'creatExcel.jsp' starting page</title> 
    
<meta http-equiv="pragma" content="no-cache"> 
<meta http-equiv="cache-control" content="no-cache"> 
<meta http-equiv="expires" content="0">    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
<meta http-equiv="description" content="This is my page"> 
<!-- 
<link rel="stylesheet" type="text/css" href="styles.css"> 
--> 
<% 
    response.setHeader("Content-Disposition", "attachment;filename=product.xls"); 
    response.setContentType("application/vnd.ms-excel"); 
    CreatExcel ce = new CreatExcel(); 
    out.clear() ; 
    out = pageContext.pushBody(); 
    ce.getExcel("product.xls",response.getOutputStream()); 

  图片 1

 

    第二遍excel转pdf是马到功成的,第4回始发前边皆已乱码,是因为自个儿的pdf转excel方法出现的难题,息灭办法是选择java本身底层的点子(详见下方代码)。

    
%> 
  </head> 
  
  <body> 

  调用PageOffice组件的FileMaker对象完成动态填充数据到word模板并转为pdf的为主代码如下:

率先我们来认知一下读取相关文书档案的jar包:

 public static boolean getLicense() {
        boolean result = false;
        try {
            InputStream is = Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream("license.xml"); //  license.xml应放在..WebRootWEB-INFclasses路径下
            License aposeLic = new License();
            aposeLic.setLicense(is);
            result = true;
        } catch (Exception e) {               
            e.printStackTrace();
        }
        return result;
    }
    
    
    public static void excelTransferPdf(String excelPath,String pdfPath) {
        if (!getLicense()) {
            System.out.println("license faile");
            return;
        }
        
        try {     
            Workbook wb = new Workbook(excelPath);
            FileOutputStream fileOS = new FileOutputStream(new File(pdfPath));
            wb.save(fileOS, com.aspose.cells.SaveFormat.PDF);
            fileOS.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

  </body> 
</html> 
************************************************* 
//CreatExcel.java 
package com.dao; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.util.ArrayList; 

    FileMakerCtrl fmCtrl = new FileMakerCtrl(request);
    fmCtrl.setServerPage(request.getContextPath()+"/poserver.zz");
    WordDocument doc = new WordDocument();
    doc.openDataRegion("PO_company").setValue("北京某某有限公司");//给数据区域赋值,即把数据填充到模板中相应的位置
    fmCtrl.setSaveFilePage("/savepdf"); //保存pdf的action或RequestMapping方法
    fmCtrl.setWriter(doc);
    fmCtrl.fillDocumentAsPDF("doc/template.doc", DocumentOpenType.Word, "123.pdf");//填充word模板并转为pdf

  保存pdf的action或RequestMapping方法(/savepdf)的代码:

    FileSaver fs = new FileSaver(request, response);
    fs.saveToFile(request.getSession().getServletContext().getRealPath("doc") +"/"+ fs.getFileName());
    fs.close();

 

2:excel转pdf现身折行。

import org.apache.poi.hssf.usermodel.HSSFCell; 
import org.apache.poi.hssf.usermodel.HSSFCellStyle; 
import org.apache.poi.hssf.usermodel.HSSFRow; 
import org.apache.poi.hssf.usermodel.HSSFSheet; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 

  示例源码及意义: for Java,解压后,拷贝Samples4文书夹到汤姆cat的Webapps目录下,访谈: 

1. 引用POI包读取word文档内容

  excel转pdf现身折行的情况非常广阔,因为在程序运维进程湖南中国广播公司大字段是抓取的,你不恐怕看清你的excel转成pdf会有几页,所以当时你就毫无随意设置excel的预览格式,将excel的单元格式设置自动换行。

import com.bean.Productbean; 

poi.jar 下载地址

3:抓取字段展现结果不完全:。

public class CreatExcel { 
public void getExcel(String sheetname,OutputStream output){ 

 
 

  当您未设置单元格大小而又不曾安装单元格自动换行,举个例子您的A18单元格里面包车型地铁字段当先了单元格的尺寸你还还未有安装单元格大小而又从未设置单元格自动换行,就将抓取的字段填充在B18单元格里面,那么打印出来的pdf文件A18单元格超出单元相当的剧情是不感到然展现的,当时你依然将抓取字段填充在C18单元格内要么将改革A18单元格格式

int iPage = 1; 
    int iPageSize = 10000; 
    HSSFWorkbook wb = new HSSFWorkbook(); 
    HSSFSheet sheet1 = wb.createSheet("sheet1"); 
    HSSFCellStyle setBorder = wb.createCellStyle(); 
    //居中装置 
    setBorder.setAlignment(HSSFCellStyle.ALIGN_CENTER); 
    HSSFRow row = sheet1.createRow((short) 0); 
    //设置单元格的宽 
    sheet1.setColumnWidth(0, 10 * 256); 
    sheet1.setColumnWidth(1, 10 * 256); 
    sheet1.setColumnWidth(2, 10 * 256); 
    sheet1.setColumnWidth(3, 10 * 256); 
    sheet1.setColumnWidth(4, 10 * 256); 
    sheet1.setColumnWidth(5, 10 * 256); 
    sheet1.setColumnWidth(6, 10 * 256); 
    sheet1.setColumnWidth(7, 10 * 256); 
    sheet1.setColumnWidth(8, 10 * 256); 
    HSSFCell cell = row.createCell(0); 
    row.createCell(0卡塔尔(英语:State of Qatar).setCellValue("商品编号"卡塔尔(قطر‎; 
    row.createCell(1卡塔尔(قطر‎.setCellValue("商品名称"卡塔尔; 
    row.createCell(2).setCellValue("进价"); 
    row.createCell(3).setCellValue("出售"); 
    row.createCell(4卡塔尔(قطر‎.setCellValue("所属种类"卡塔尔(英语:State of Qatar); 
    row.createCell(5).setCellValue("单位"); 
    row.createCell(6).setCellValue("库存"); 
    row.createCell(7).setCellValue("产地"); 
    ProductDao pd = new ProductDao(); 
    ArrayList plist = pd.getAllPro(-1); 
    if(plist.size()>0){ 
    for(int i=0;i<plist.size()-1;i++){ 
    row = sheet1.createRow(i + 1); 
    row.createCell(0).setCellValue(((Productbean)(plist.get(i))).getPro_id()+""); 
    row.createCell(1).setCellValue(((Productbean)(plist.get(i))).getPro_name()+""); 
    row.createCell(2).setCellValue(((Productbean)(plist.get(i))).getC_price()+""); 
    row.createCell(3).setCellValue(((Productbean)(plist.get(i))).getPrice()+""); 
    row.createCell(4).setCellValue(((Productbean)(plist.get(i))).getPro_varid()+""); 
    row.createCell(5).setCellValue(((Productbean)(plist.get(i))).getPro_unit()+""); 
    row.createCell(6).setCellValue(((Productbean)(plist.get(i))).getPro_count()+""); 
    row.createCell(7).setCellValue(((Productbean)(plist.get(i))).getPro_field()+""); 
    
    
    } 
    } 
    
    try { 
output.flush(); 
wb.write(output); 
    output.close(); 
} catch (IOException e) { 
// TODO Auto-generated catch block 

 

4:excel转PDF字段内容无故中间有个别换行:


   


*********************************************** 
下不熟识成word pdf 留在下大器晚成篇文章中,所用的包放在附属类小构件中

2.援引jxl包读取excel文书档案的剧情

  这是自己遇见的最坑的一个地点,那时你只必要在excel单元格里面安装自动换行就能够,没有须求代码强行自动换行(强行换行有望只现出多行数据只展现风华正茂行)。同期你必要如下代码:

  • jar包.rar (7.1 MB)
  • 下载次数: 4

Jxl.jar下载地址

/**
     * 得到一个字符串的长短,展现的长短,叁此中夏族民共和国字或日希腊语长度为1,匈牙利(Magyarország卡塔尔语字符长度为0.5
     *
     * @param String
     *            s 供给拿到长度的字符串
     * @return int 得到的字符串长度
     */
    public static double getLength(String s) {
        double valueLength = 0;
        if (s == null) {
            return 0;
        }
        String chinese = "[u4e00-u9fa5]";
        // 获取字段值的尺寸,假如含中文字符,则每一种普通话字符长度为2,不然为1
        for (int i = 0; i < s.length(); i++) {
            // 获取三个字符
            String temp = s.substring(i, i + 1);
            // 推断是不是为中文字符
            if (temp.matches(chinese)) {
                // 粤语字符长度为2
                valueLength += 2;
            } else {
                // 其余字符长度为1
                valueLength += 1;
            }
        }
        // 进位取整
        return Math.ceil(valueLength);
    }

    /**
     * 依据字符串长度获取行高
     *
     * @param str
     * @return
     */
    public static Float getRowHeight(String str) {

 

        Integer lineCount = (int) (getLength(str) / 64) + 1;
        if (str.contains("n")) {
            Integer tempLineCount = 1;
            String[] lines = str.split("n");
            for (String line : lines) {
                Integer everyLineCount = (int) (getLength(line) / 64) + 1;
                tempLineCount += everyLineCount;
            }
            lineCount = lineCount >= tempLineCount ? lineCount : tempLineCount;
        }
        Float rowHeight = (float) (lineCount * 20);
        return rowHeight;
    }

3.援用PDFBox读取pdf文书档案的剧情

你必要先得到抓取的字符串的尺寸,然后经过那些措施总括行高,再将excel须要填写的该行用Java代码设置行高(行高单位是像素),不过假若现身本身下面说的字段内容无故中间某些换行,那么您收获的行高就能够供不应求,那时候你须求改变那一个地方----->>>>Float rowHeight = (float卡塔尔(قطر‎ (lineCount * X卡塔尔(قطر‎;  x的值必供给安装的大学一年级行,避防现身这种意况!

Pdfbox.jar下载地址

 

 
 

Fontbox.jar下载地址

 
 

Jempbox.jar下载地址

 
 

上边我们就来轻便看一下这个jar包的对文书档案的读取的利用实例:

 

1. 援用POI包读取word文书档案内容

 

  1. import java.io.File;     
  2. import java.io.FileInputStream;     
  3. import org.apache.poi.hwpf.HWPFDocument;     
  4. import org.apache.poi.hwpf.usermodel.Range;     
  5.   
  6. /**  
  7. *  
  8. * @author 曹胜欢 
  9. */   
  10. public class DocFile{     
  11.   
  12.   
  13.     @Override   
  14.     public String getContent(File f) throws Exception {     
  15.         FileInputStream fis = new FileInputStream(f);     
  16.         HWPFDocument doc = new HWPFDocument(fis);     
  17.         Range rang = doc.getRange();     
  18.         String text = rang.text();     
  19.         fis.close();     
  20.         return text;     
  21.     }     

2.引用jxl包读取excel文书档案的剧情

 

  1. import java.io.File;     
  2. import java.io.FileInputStream;     
  3. import jxl.Cell;     
  4. import jxl.Sheet;     
  5. import jxl.Workbook;     
  6.   
  7. /**  
  8. *  
  9. * @author 曹胜欢 
  10. */   
  11. public class XlsFile{     
  12.   
  13.     @Override     
  14.     public String getContent(File f) throws Exception {     
  15.      //构建Workbook对象, 只读Workbook对象  
  16.      //直接从地方文件创立Workbook  
  17.       //从输入流创设Workbook  
  18.   
  19.         FileInputStream fis = new FileInputStream(f);     
  20.         StringBuilder sb = new StringBuilder();     
  21.         jxl.Workbook rwb = Workbook.getWorkbook(fis);     
  22. //风度翩翩旦成立了Workbook,大家就能够通过它来做客  
  23. //Excel Sheet的数组集合(术语:职业表卡塔尔(英语:State of Qatar),  
  24. //也能够调用getsheet方法获得钦命的薪金表  
  25.         Sheet[] sheet = rwb.getSheets();     
  26.         for (int i = 0; i < sheet.length; i++) {     
  27.             Sheet rs = rwb.getSheet(i);     
  28.             for (int j = 0; j < rs.getRows(); j++) {     
  29.                Cell[] cells = rs.getRow(j);     
  30.                for(int k=0;k<cells.length;k++)     
  31.                sb.append(cells[k].getContents());     
  32.             }     
  33.         }     
  34.         fis.close();     
  35.         return sb.toString();     
  36.     }     
  37.   
  38. }  

 

由地点代码大家能够:生龙活虎旦获得了Sheet,大家就足以因此它来访谈Excel Cell(术语:单元格卡塔尔(قطر‎。参考上面包车型客车代码片段:
//获取第风姿浪漫行,第一列的值
Cell c00 = rs.getCell(0, 0);
String strc00 = c00.getContents();
//获取第风流倜傥行,第二列的值
Cell c10 = rs.getCell(1, 0);
String strc10 = c10.getContents();
当你成功对Excel机械表格数据的管理后,应当要接纳close(卡塔尔国方法来关闭先前创建的对象,以自由读取数据表的长河中所占用的内部存款和储蓄器空间,在读取大量数码时展示特别关键。

 

3.援引PDFBox读取pdf文书档案的内容

 

  1. import java.io.File;     
  2. import java.io.FileInputStream;     
  3. import org.pdfbox.pdfparser.PDFParser;     
  4. import org.pdfbox.pdmodel.PDDocument;     
  5. import org.pdfbox.util.PDFTextStripper;     
  6.   
  7. /**  
  8. *  
  9. * @author 曹胜欢 
  10. */   
  11. <pre name="code" class="java">public class PdfFile{     
  12.   
  13.     public String getContent(File f) throws Exception {     
  14.         FileInputStream fis = new FileInputStream(f);     
  15.         PDFParser p = new PDFParser(fis);     
  16.         p.parse();     
  17.         PDDocument pdd = p.getPDDocument();     
  18.         PDFTextStripper ts = new PDFTextStripper();     
  19.         String c = ts.getText(pdd);     
  20.         pdd.close();     
  21.         fis.close();     
  22.         return c;     
  23.     }     
  24. }</pre><br>  

大家简要介绍了java读取word,excel和pdf文档内容 ,但在实际支出中,大家用到最多的是把数据库中数据导出excel报表格局。不仅轻巧的读取office中的数据.特别是在生养管理依然财务系统有效的不胜广阔,因为这一个连串不常要做一些表格打字与印刷的劳作。而数据导出的格式平日是EXCEL恐怕PDF 。所以明日大家来轻便看一下选择Apache  POI达成数据库中多少导出excel报表。在Java中有过多得以落成多少导出excel报表的第三方jar包。但在可比了风华正茂晃以为依旧POI相对来讲比较好用。如若大家想上学别的的导出形式得以活动钻研一下。

 

率先来打探一下 Apache POI

 

     Apache POI 是用Java编写的无偿开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。Apache POI 是创制和维护操作各类切合Office Open XML(OOXML)规范和微软的OLE 2复合文书档案格式(OLE2)的Java API。用它能够应用Java读取和创设,改进MS Excel文件.何况,仍然为能够利用Java读取和创办MS Word和MSPowerPoint文件。Apache POI 提供Java操作Excel解决方案(适用于Excel97-二零一零)。 上边我们来看一下Apache POI 中提供的几大学一年级些的意义:

本文由澳门威尼斯人平台发布于操作系统,转载请注明出处:java达成导出excel、word、 pdf

关键词: