菜单

java达成导出excel、word、 pdf

2019年3月14日 - UNIXSolaris

在稍微需求个中大家须要抓取字段并且填充到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+”/”; 
%> 

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()); 

    第一遍excel转pdf是成功的,第二回始发后边皆是乱码,是因为本身的pdf转excel方法出现的标题,消除办法是使用java自个儿底层的章程(详见下方代码)。

    
%> 
  </head> 
  
  <body> 

 public static boolean getLicense()
{
        boolean result = false;
        try {
            InputStream is =
Thread.currentThread().getContextClassLoader()
                  
 .getResourceAsStream(“license.xml”); // 
license.xml应放在..\WebRoot\WEB-INF\classes路径下
            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; 

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; 

  excel转pdf出现折行的意况拾叁分广泛,因为在程序运行进度中有的是字段是抓取的,你不或然看清你的excel转成pdf会有几页,所以这几个时候你就毫无轻易设置excel的预览格式,将excel的单元格式设置自动换行。

import com.bean.Productbean; 

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).setCellValue(“商品编号”); 
    row.createCell(1).setCellValue(“商品名称”); 
    row.createCell(2).setCellValue(“进价”); 
    row.createCell(3).setCellValue(“出售”); 
    row.createCell(4).setCellValue(“所属种类”); 
    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 留在下一篇文章中,所用的包放在附属类小部件中

  那是自己遇见的最坑的一个地点,那几个时候你只须要在excel单元格里面安装自动换行即可,无需代码强行自动换行(强行换行有恐怕只现出多行数据只展现一行)。同时您要求如下代码:

/**
     *
获得1个字符串的尺寸,彰显的长短,1个汉字或日克罗地亚语长度为1,英文字符长度为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;
    }

你需求先拿走抓取的字符串的尺寸,然后经过这几个法子计算行高,再将excel须要填写的该行用Java代码设置行高(行高单位是像素),然则要是出现本人下边说的字段内容无故中间有个别换行,那么您取得的行高就会供不应求,这一个时候你必要改变这么些地方—–>>>>Float rowHeight = (float) (lineCount * X); 
x的值一定要安装的大学一年级行,避防出现那种状态!

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图