菜单

java达成导出excel、word、 pdf

2019年3月19日 - LINUX

在稍微必要当中大家须要抓取字段并且填充到excel表格里面,最终将excel表格转换到pdf格式进行输出,笔者首先次接触这一个必要时,境遇多少个比较为难的难点,未来相继列出并且提供消除方案。

透过几天的读书到底得以兑现java中将查询结果存款和储蓄为Excel,将页面另存word,将html页面存为pdf格式那多少个功效了,那是自家的第三篇博客,为了共享代码,也为了以往本身的学习成果不会弄丢,现在将那多少个效能贴在网上。 
一 、将查询结果存为excel,作者的毕业设计是超级市场新闻保管体系,3个页面将商品音信显示出来了,未来将结果存为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()); 

    第1回excel转pdf是打响的,第3回早先前面皆是乱码,是因为本人的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,英文字符长度为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地图